OpenRASPSQL注入绕过

admin 2025-12-29 00:47:45 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章披露了OpenRASP最新版本存在的SQL注入绕过漏洞。通过精心构造请求参数,作者利用SQL解析过程中的数组越界错误导致检测插件失效。该漏洞影响特定版本插件且暂无官方修复,详细分析了利用原理和复现步骤,展示了控制token索引超出范围从而绕过防护的技术细节。 综合评分: 92 文章分类: 漏洞分析,WEB安全,渗透测试,漏洞预警


cover_image

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注入绕过》

OpenRASPSQL注入绕过 网络安全文章

OpenRASPSQL注入绕过

文章总结: 文章披露了OpenRASP最新版本存在的SQL注入绕过漏洞。通过精心构造请求参数,作者利用SQL解析过程中的数组越界错误导致检测插件失效。该漏洞影响
2025年录课总结 网络安全文章

2025年录课总结

文章总结: 作者haidragon在2025年完成了5套Rust及1套恶意软件课程的录制,主要精力集中在Rust语言教学。2026年规划将重心转移至恶意软件分析
评论:0   参与:  0