XSS学习——XSS理论总结

Reflected XSS:

这类输入点在 URL 上, URL 的一种常见组成模式如下:

```
1
2
例如:
```http://www.foo.com/path/f.php?id=1&type=cool#new

对应:

1
2
3
4
5
<scheme> - http
<netloc> - www.foo.com
<path> - /path/f.php
<query> - id=1&type=cool,包括<参数名=参数值>对
<fragment> - new

攻击者可控的输入点有三个部分。但里的值一般不会出现在服务端解析,除非 Web 2.0 网站, URL 格式如: http://twitter.com/evilcos!#status
请求时,第一步会通过 JavaScript 的 location.href 获取到完整的 URL,解析出 status 值,然后通过 AJAX 函数来处理请求,最后进行局部页面的异步刷新。
剩下更加流行。但是payloads有很多种,产生的结果的差异在于输出点和过滤。先不考虑过滤,输出点有四种情况:
1) HTML 标签之间:

[输出]

2) HTML 标签之内:
3) 成为 JavaScript 代码的值:
4) 成为 CSS 代码的值:
反射型的XSS的利用一般都会事先写好一个Payload,然后将链接发给用户,诱使用户访问含有Payload的URL达到JS代码执行。

Stored XSS:

这个过程令大家头疼的莫过于这个“输出”。到底在哪里输出呢?有以下几种情况:
表单提交后跳转到的页面有可能是输出点。
表单所在的页面有可能就是输出点。
表单提交后不见了,然后就要整个网站去找目标输出点,这个需要爬虫对网站进
行再次爬取分析,当然这个过程是可以优化的,比如,使用页面缓存技术,判断 目标页面是否变动,一般发送 Last-Modified 与 Etag 头部,根据响应状态码进行判 断即可。

DOM型XSS:

网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
可能触发DOM型XSS的属性: