openrasp默认只能检测反射型XSS,存储型XSS仅IAST商业版支持。对于反射型xss,openrasp也只能检测可控输出点在html标签外的情况,本文的绕过方法是针对这种情况。如果可控输出点在html标签内,如或 内部,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都会拦截。
<script>alert(1)</script> // "<script>"部分匹配标签正则
<img src=1 onerror=alert()> // "<img "部分匹配正则,空格符对应正则中0x20
<svg/onload=alert()>