0x01 过程
是一个需要统一认证的工单系统,首页是展示最近的工单
右上角有个我的工单,点击后会要求绑定工号
需要两个参数,一个是工号一个绑定码
先随意输入一些内容然后抓包,可以看到有两个参数workNum bindCode
接下来通过对后端语句的推测和巧妙的输入操纵,利用符号犹如钥匙般打开了逃逸单引号限制的大门,逐步探入SQL注入的世界,首先当然是对两个参数进行常规的单双引号测试'",当然是没有效果的没有任何变化
workNum尝试输入 发现提示sql语句报错
bindCode也测试一下,发现也报错,猜测后端没有进行预处理也没有用类似于addslashes函数进行处理而是自己进行的单双引号的处理但是没有处理符号转义了原有的引号导致了我们输入的参数逃逸出了引号的限制
首先猜测后端语句大概如下
select xxx from where workNum='可控' and bindCode='可控'
那么我在workNum传入时语句如下,他后面那个单引号被反引号注释掉了逃出了单引号的限制
select xxx from where workNum='可控\' and bindCode='可控'
此时workNum的值为红色部分,可以发现第二个可控的部分并不在引号内可以进行sql注入
那么在workNum传入,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