说到 XSS 相信大家肯定都不陌生(都 2020 年了,还在讲 XSS 这种老掉牙的东西),有些人甚至看到输入框就想往里面输 ,今天我们就来学习 怎样在 HTTP 头中进行 XSS ?
直奔主题,先几个 XSS 的经典案例:
当然,远不止这些,枚不胜举。
其他关于 XSS 的知识就不多讲了,毕竟是老生常谈的东西,下面就来讲讲不一般的 XSS。
开门见山,在某些情况下,没有清除应用程序 HTTP 头中传递的信息,并将其输出到请求页面的某个位置时,导致的 XSS 情况。
一种情况
我们可以控制 HTTP 头中的某些信息存储在数据库中,然后在同一页面中,应用程序中的其他任何地方甚至在另一个不可访问的系统中检索到。但是,由于 CDN 和 WAF 的存在,还存在另一种非常普遍的情况,无需进行数据库操作即可持续进行攻击:Web 缓存中毒
练习地址:https://brutelogic.com.br/lab/header.php
=json_encode(getallheaders())."n";
在命令行中执行命令 curl -i,它向我们显示了响应的 HTTP 标头以及 JSON 格式的请求头。
curl 是一种命令行工具,作用是发出网络请求,然后获取数据,显示在"标准输出"(stdout)上面,它支持多种协议。
-i 参数可以显示 http response 的头信息,连同网页代码一起。
由于实验靶场的 WAF 提供了最后一个标头 x-sucuri-cache,因此我们需要在 URL 中添加一些内容来避免缓存,该标头的值为 HIT,意思就是它来着 WAF 的缓存。
因此,访问带参数“lololol”的页面,我们能够得到页面的非缓存版本,标头 x-sucuri-cache 的标头值变成了 MISS 。再注入自己的标头(使用参数 -H),以检查它是否以响应的形式出现。
-H --header 在 http request 之中,自行增加一个头信息。
响应成功,得到带有 Test:myValue 的响应。再更改字符串为“kkkkk”发出另一个请求,不然将返回带有“ lololol”字符串的缓存响应。
再使用“kkkkk”作为字符串来再次开始缓存处理。如上图所示,还带入了 XSS payload。但仅是对自己有用,因为只是本机终端发送该标头。payload 不会出现在其他的浏览器请求中。
发另一个请求(注意看 data 时间不同),貌似没有什么区别。这是因为缓存机制是基于 MISS-MISS-HIT,因此下一个为 MISS。
验证是否已经缓存,打开目标 URL
https://brutelogic.com.br/lab/header.php?kkkkk
该 URL 将保持中毒状态,直到缓存过期,这就是缓存投毒。
练习地址2:https://brutelogic.com.br/lab/welcome.php
工作原理跟上面一样,不过没有了那么明显的输出点,执行 XSS 需要先找到输出点。页面的源代码如下:
Welcome, $name!n";
}else{
echo "Welcome, guest!
n";
}
?>