盲注是什么
盲注是区别普通注入,普通sql注入可以看见报错的sql信息,盲注是看不见任何报错的信息,无法知道注入的语句有没有被执行,页面无明显变化,所以叫盲注
盲注有哪些方法
虽然页面没有明显变化但是通过你的fuzz还是会产生一定差别,比如输入正常的值产生正常页面,反之通过注入数据库函数bool语句观察页面变化,如果sql注入成功数据库是需要时间去执行的,所以还可以通过观察时间来判断。因此就有最基本的两种盲注办法:bool注入, 通过延时注入
- 延时注入 比如mysql sleep函数 观察时间
- bool注入 利用sql语句逻辑运算和数据库函数进行fuzz测试
盲注流程
- 寻找注入点
- 判断注入数据类型 字符型 还是数值型
- 通过观察页面变化选择合适的注入方式(延时注入或Bool)
- 通过二分法一步步猜解当前数据库名
- 猜解数据库中的表名
- 猜解表中的字段名
- 猜解数据
盲注场景举例
以dvwa举例,(如何搭建dvwa docker docker docker 一键搞定)打开dvwa 点击建立好数据库以后,选择模式,low模式的盲注。dvwa sql 注入都是基于php语言的,源码也都php。
low
假设你不知道它是low模式,也没有看源码,只知道这是一个php写的页面。找到注入点(就是数据与服务器交互的地方)
http://127.0.0.1/vulnerabilities/sqli_blind/?id=1&Submit=Submit#
输入 1
说明 1这个数值是可以填入数据库成功运行的,但是还不能判断 是字符型 还是数值型。php语言的sql查询语句大概是:
```
$id = $_GET[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; //传入字符型
$result = mysql_query( $getid );
```
为什么要判断是数字型或字符型呢 因为 ’ xxxx’如果是字符型 你只有把’闭合了才能写其他注入语句比如查看数据库名巴拉巴拉,不然无法进行注入操作。
如果闭合了’注入能执行成功就证明 是字符型
比如输入 1 ' # 原来的sql语句就变成了:
"SELECT first_name, last_name FROM users WHERE user_id = ' 1 ' #'; ";
/# 是sql注释作用 可以成功注释掉后面的' ;不影响sql运行 ,单行的sql语句不需要;多行可能需要;
然后会看见
说明它是字符型注入。后面的是自己看dvwa盲注
mid
只说不一样的东西,源码里有个函数 对用户输入进行了处理:mysql_real_escape_string() 这个函数会对特殊符号进行转义,转义就会变成普通的字符串了不能起到作用,比如输入’ 就会变成/’ 但是这个是数字型注入所以这个函数用处不大。但是不看源码谁知道是数字型。
所以 判断过程少不了。
怎么绕过mysql_real_escape_string()函数呢 可以通过宽字节注入 hex进行绕过。但是在这个地方行不通因为宽字节注入有前提。
具体看dvwa盲注
high
没有什么好玩的 不值得说
细节解析
- 渗透测试需要信息收集,加单引号这种操作放在php这种弱类型语言很正常,放其他语言不一定了
- 宽字节注入主要是用来绕过’过滤,它是在mysql编码为gbk情况下,gbk认为汉字是两个字节同时第一个字节必须ascii大于128,比如%df ascii大于128 在php代码里输入 %df’ 经过mysql_real_escape_string()函数 就会变成 %df/’ 进行mysql里的时候,因为如果mysql编码是gbk,它就会认为 %df/ 是一个汉字整体 '就成功逃走了。
详细看宽字节注入
二次编码注入,比如通过urlcode 因为php会对传入的东西进行urlcode解码,如果输入1%2527%23 解码以后就是 1%27 ,用户输入【1%2527】=>php自身编码,%25转换成%【1%27】=>php未检查到单引号,不转义【1%27】=>遇到一个函数编码,使代码进行编码转换【1’】=>带入sql语句=>能注入 - 宽字节注入可以使用sqlmap 里temper脚本 比如: sqlmap.py -u “xxx?id=xx” --tamper unmagicquotes.py --dbs
这些方法都具有前提,所以需要fuzz 和编码人员习惯关系很大。渗透测试难怪叫测试。
参考:https://www.cnblogs.com/Rain99-/p/10592772.html