文章总结: 文章披露了OpenRASP最新版本存在的SQL注入绕过漏洞。通过精心构造请求参数,作者利用SQL解析过程中的数组越界错误导致检测插件失效。该漏洞影响特定版本插件且暂无官方修复,详细分析了利用原理和复现步骤,展示了控制token索引超出范围从而绕过防护的技术细节。 综合评分: 92 文章分类: 漏洞分析,WEB安全,渗透测试,漏洞预警
OpenRASP SQL注入绕过
原创
XG小刚
XG小刚
2025年12月27日 13:11 北京
公众号:XG小刚
最近遇到了一个OpenRASP拦截的SQL注入,黑盒绕半天没什么效果。本想着研究一下它的拦截原理,刚好看到了腾讯xcheck团队几年前的一篇绕过文章《OpenRASP SQL注入绕过》,虽然姿势已经被修复了,但是研究一番发现最新版还是存在绕过的。
官方official.js插件_注释导致is_token_changed数组越界
下面部分是xcheck团队文章的大概绕过原理
1、请求时新增一个无意义的参数,注意该参数需要在被注入参数的前面,并且参数值长度大于8位
2、在被注入参数里使用/**/注释,注释里添加前面参数的值。
正常被拦截
GET /sql6/sql6?test=&username=123'+union+select+*+from+tb_user+--+ HTTP/1.1
进行绕过
GET /sql6/sql6?test=aabbccdd&username=123'+union+select+*+from+tb_user/*aabbccdd*/+--+ HTTP/1.1
GET /sql6/sql6?test=aabbccdd&username=123'+union+select+*+from+tb_user+--+aabbccdd HTTP/1.1
原理
1、openrasp主要靠插件进行检测,官方插件是/rasp/plugins/official.js
在sql检测函数中,使用RASP.sql_tokenize方法将执行的SQL语句解析成多个token,解析的结果中不会包含被注释掉的部分。
2、然后进入is_token_changed方法中,该方法作用主要是:找到用户输入参数值在被执行的SQL语句的位置
raw_tokens:解析后的token数据
userinput_idx:用户输入参数在sql语句中的起始位置
关键在于userinput_idx参数,当正常注入时
/sql6/sql6?username=123'+union+select+*+from+tb_user+--+aabbccddee
可以看到userinput_idx解析得到值为40,是因为username参数的值123'+union+select+*+from+tb_user+--+aabbccddee,出现在了SQL语句中,开始位置是第40个字符。对应的解析后的token是第7个。
然后绕过是在被注入参数username前,加了一个新参数test,值是aabbccddee
此时rasp解析参数时按顺序先解析前面参数test,检测到aabbccddee也在SQL语句中,开始位置是第76个字符。
但SQL解析后的token,最长位置是72,所以start=-1在for循环里没有成功被修改,一直是-1
然后到raw_tokens[start].stop代码位置,因为raw_tokens没有-1的值,所以也就没有对应stop,从而导致产生报错导致SQL注入被绕过。
官方修复
后续进行了修复,当start=-1直接return出去了
最新版绕过
plugin_version = ‘2022-0119-1745’
GET /sql6/sql6?test=r+--+aabbccdd&username=123'+union+select+*+from+tb_user+--+aabbccdd HTTP/1.1
原理
之前绕过方式原理是通过参数,控制start值为-1,从而溢出报错绕过
继续研究发现,可以通过参数start值为token的最后一位,比如username传参username=123'+union+select+*+from+tb_user+--+aabbccdd,test参数这次改为r+--+aabbccdd
此时test参数出现在了SQL语句的71位置,对应token是第12个
在寻找token结束点时
raw_tokens[start].stop值为72,而userinput idx + userinput length值为71+13=84,是大于前面的
最后运行完start=12,end=13,但是tokens里时没有第13个的,就导致下面出现了问题
经过第二轮for循环后,sqliAntiDetect.test(raw_tokens[i].text)中i被赋值13,由于raw_tokens没有13,所以text也就未被定义,从而报错产生绕过。
官方修复
暂无
最后
最后……
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:XG小刚 XG小刚《OpenRASP SQL注入绕过》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论