0x1 前言
好久没有遇到那么符合预设环境的漏洞情况了,标题跟部分内容的文笔由ai美化了,看起来诗情画意的?(可能
0x02 过程
是一个需要统一认证的工单系统,首页是展示最近的工单
右上角有个我的工单,点击后会要求绑定工号
需要两个参数,一个是工号一个绑定码
先随意输入一些内容然后抓包,可以看到有两个参数workNum bindCode
接下来通过对后端语句的推测和巧妙的输入操纵,利用符号犹如钥匙般打开了逃逸单引号限制的大门,逐步探入SQL注入的世界,首先当然是对两个参数进行常规的单双引号测试'",当然是没有效果的没有任何变化
workNum尝试输入 发现提示sql语句报错
bindCode也测试一下,发现也报错,猜测后端没有进行预处理也没有用类似于addslashes函数进行处理而是自己进行的单双引号的处理但是没有处理符号转义了原有的引号导致了我们输入的参数逃逸出了引号的限制
首先猜测后端语句大概如下
select xxx from where workNum='可控' and bindCode='可控'
那么我在workNum传入时语句如下,他后面那个单引号被反引号注释掉了逃出了单引号的限制
select xxx from where workNum='可控\' and bindCode='可控'
此时workNum的值为红色部分,可以发现第二个可控的部分并不在引号内可以进行sql注入
- select xxx from where workNum='可控\' and bindCode='可控'
那么在workNum传入,bindCode传--+语句如下可以发现有了一个可以操作的可控点
- select xxx from where workNum='\' and bindCode=' 可控点 --+'
因为系统带有waf这里先轻微的使用不那么容易触发waf的语句来测一下是什么数据库,传入内容如下
workNum=\&bindCode=%2BCURRENT_USER--+
后端语句大概如下,也就是+上CURRENT_USER Mysql的用户名函数
select xxx from where workNum='\' and bindCode='+ CURRENT_USER--+'
发现并没有报错
改掉一位试试看发现提示sql语句错误,那么这里就判断为mysql数据库
旅程并非一帆风顺,WAF如同一道屏障挡在面前。接下来我将运用科学计数法如同舞者般优雅地绕过了WAF的限制,编织出if语句的旋律进行真相的探寻。
这里用科学计数法绕过waf构造if,构造出true/false来注入,这里判断用户名长度是否等于1显然错误返回错误,使用<>大/小于号都会报错,猜测是后端对<>进行了处理用来防止xss导致没办法用大于小于来快速判断范围我这里就用=号一位一位判断了
workNum=\&bindCode=%2bif+520.e(length+520.e(CURRENT_USER+520.e)=1,1,exp+520.e(999+520.e)+520.e)%23
等于11位的时候页面返回正常,这里就得到了用户名部分为11位
在来判断个数据库名,得到长度为5,点到为止,下班
workNum=\&bindCode=%2bif+520.e(length+520.e(schema+520.e(+520.e)+520.e)=5,1,exp+520.e(999+520.e)+520.e)%23
最后反馈给信息处的老师
5 comments
太强了大佬,能请教一下这个科学计数法是怎么用来进行判断的吗?
我博客有一篇科学计数法绕waf的文章可以看一下
okヾ(≧∇≦*)ゝ,我去学习一下
赏心悦目
神太强了