OpenRASP xss 算法的几种绕过方法
openrasp 默认只能检测反射型 XSS,存储型 XSS 仅 IAST 商业版支持。对于反射型 xss,openrasp 也只能检测可控输出点在 html 标签外的情况,本文的绕过方法是针对这种情况。如果可控输出点在 html 标签内,如<input type="text" value="$input">
或<script>...</script>
内部,openrasp 几乎检测不到。
测试环境
【网安学习资料】
windows / tomcat / jdk1.8 / openrasp 1.3.7-beta
测试环境部署参见https://www.anquanke.com/post/id/241107,或者官网文档。
在 official.js 中 xss_userinput 算法默认配置为 ignore,修改为 block 来开启拦截。此时点击官方测试用例中下面链接,即可触发 openrasp 拦截。
openrasp xss 算法
openrasp xss 算法有 2 种。算法 1 是针对 PHP 环境,此处不考虑。算法 2 是用户输入匹配算法,根据注释说明,算法原理是”当用户输入长度超过 15,匹配上标签正则,且出现在响应里,直接拦截”。
标签正则含义使用 regexper 网站解析如下
标签正则从整体上来说匹配两种情况,一是请求参数值中有子字符串以<!
开头的;二是请求参数值中有子字符串以<
开头的。对于第二种情况,标签正则会匹配<
字符后接 1 到 12 个大小写字母,再后接/
或>
或0x00 - 0x20
字符的字符串。所以下面这些常见的 xss 测试 payload 都会拦截。
<img src=1 onerror=alert()>
触发拦截
标签正则绕过
【网安学习资料】
整理网上的一些 xss 绕过 payload,发现下面这些可以顺利绕过标签正则
浏览器直接输入上面那些 xss payload 会报 400 响应错误。对 payload 进行 url 编码所有字符。
burpsuite repeater 中右键”copy url”,复制 url 到浏览器中访问,点击即可触发弹框。
标签后接单双引号
【网安学习资料】
收集过程中还发现下面这两种 xss payload 也可以绕过。
简单测了下其他标签后接单引号或双引号进行绕过,好像蛮多都行的。
例如,使用123<img' src=1 onclick=alert()>123
,url 编码后,点击也能弹框。
构造无效标签
【网安学习资料】
这种也可以用于绕过 openrasp。看到这种绕过方式,感觉前面的都不香了。
只要构造如下 payload 即可
验证如下
或者
程序逻辑绕过
【网安学习资料】
还有一种绕过方法,是从程序检测逻辑上进行绕过。
openrasp xss 具体检测代码实现在这个文件中agent/java/engine/src/main/java/com/baidu/openrasp/plugin/checker/local/XssChecker.java
。下面的一段代码是对”当用户输入长度超过 15,匹配上标签正则,且出现在响应里,直接拦截”的具体实现。
但代码中多了一处逻辑。如果请求会传递多个参数,当某个参数值长度大于 15,且匹配之前的标签正则<![\-\[A-Za-z]|<([A-Za-z]{1,12})[\/\x00-\x20>]
,如果对应参数值没有在响应中出现时,变量 count 值会加 1。当 count 值大于 10 时,openrasp 会直接放行。控制程序运行到上面图片中第二个方框中即可产生绕过。
绕过演示
【网安学习资料】
此处为了查看 payload 内容方便,使用了 post 请求。如果转换成 get 请求,并对参数值 url 编码,效果一样。
原始请求会触发拦截
绕过 payload。在 input 参数前面添加多个 input[n]的参数,且参数值为其他 xss payload。
转换成 get 请求,并对 payload 进行编码。
绕过 payload 分析
【网安学习资料】
构造的绕过 payload 有几点要求。一是,虚构的请求参数理论上至少要有 11 个,如前面 input0 到 input11 请求参数。如果没成功,最好在增加几个请求参数。二是,虚构的请求参数名取值有些要求。三是,虚构的请求参数值不能与真实请求参数值相同。
因为这样的话,input0 到 input11 这些请求参数在parameterMap
中会排在 input 参数前面,见下图。
这样 input0 到 input11 这些参数就会优先 input 请求参数被 openrasp 检测逻辑处理,从而击中count > exceedLengthCount
的条件进行绕过。
评论