日常工作过程中,偶然发现一个网站登录页面,在页面返回包中存在一个隐藏参数“mess”,且该页面部署了百度RASP进行防护,本文介绍如何发现隐藏参数以及如何通过参数污染方式造成XSS攻击。涉及信息较为敏感,请各位看官见谅。

一、参数污染

HTTP参数污染,也叫HPP(HTTP Parameter Pollution)。当给一个参数赋两个值或者更多的值时,服务器对多次赋值参数的数据处理也是不同的,根据这个特征,可以对某些防护设备进行绕过。

       如下:

       url:http://example.com/search.php?id=666&id=999

       服务端接收到id参数后会对id进行解析。

       谷歌处理如下:

两个值都进行了选择

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

百度如下:

只有第一个值被选择,第二个值没有被选择。

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

       雅虎如下:

       第二个p值被选择。

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

       故我们可以利用这个特征,对某些防护设备进行尝试绕过。

二、隐藏参数

       登录页面随意输入信息后进行抓包,返回包如下:

在返回包中搜索“hidden”,发现参数“mess”。

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

在请求包内添加“mess”参数进行测试

请求包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

返回包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

三、尝试绕过百度RASP

百度RASP:OpenRASP 抛弃了传统防火墙依赖请求特征检测攻击的模式,创造性的使用RASP技术(应用运行时自我保护),直接注入到被保护应用的服务中提供函数级别的实时防护,可以在不更新策略以及不升级被保护应用代码的情况下检测/防护未知漏洞,尤其适合大量使用开源组件的互联网应用以及使用第三方集成商开发的金融类应用,详细介绍可自行搜索官方文档。

尝试常规XSS payload被拦截

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

       经测试使用常规XSS payload均被RASP拦截

      

使用参数污染进行绕过:

Step1:

       尝试输入两个”mess”参数,确认可被服务端接收的值

请求包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

返回包: 1和2都被接收,但在1结束处出现了“,”

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

Step2:

       对前面的语句进行闭合:

请求包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

返回包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

Step3:

       尝试构造常规XSS payload

请求包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

返回包:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

此时出现了一个问题,在每次参数赋值后,都会出现“,”且“,”的出现是无法避免的,因此我们需要构造一个payload,使其能够合理的存在“,”,在这儿使用定义参数来进行构造,将“,”合理的包含在payload中。

第一个“,”定义var a,b=alert(1)   #在<script>后增加var a,把赋值出现的“,”当做对a和b参数定义的间隔。

第二个“,”在alert(1)后面再次赋值c=1</script>  #将alert(1)后出现的“,”包含在payload当中,使</script>前面紧跟的是c=1而不是“,”

最终这个payload可以写成:<script>var a,b=alert(1),c=1</script>

本地测试:

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

那么请求包内可以写成:mess=”>&<script>var a&mess=b=alert(1)&mess=c=1</script>

 一枚通过参数污染绕过百度RASP的XSS-LMLPHP

Step4:

最终成功弹窗

一枚通过参数污染绕过百度RASP的XSS-LMLPHP

四:总结

       本文从寻找隐藏参数到常规payload被RASP拦截,再到参数污染方式进行绕过并处理多值接收的“,”问题,最终构造出了可成功执行的payload。文章中涉及漏洞实际风险有限,但可当做一个参数污染绕过防护设备的典型案例,在之后遇到XSS或者SQL注入被拦截时,使用参数污染方式尝试绕过,可能会有奇效。

06-11 00:32