web基础漏洞-反射型和存储xss测试
1、异同
反射型基于单次请求-响应过程,payload在请求中提交,然后直接在响应中包含。测试过程中,分析payload在唯一响应体部中的表现。
存储型基于两次请求-响应过程,payload在初次请求中提交,然后在第二次请求的响应中包含。测试过程中,分析的是payload在第二次响应体部中的表现。
2、测试过程
2.1 样本请求
2.2 索引检查
2.3 存储型xss判断与处理
2.4 响应头部字段分析
(1)x-xss-protection
(2)csp
2.5 逐参数测试
- 参数是否包含
- 敏感字符包含
- 脚本payload包含
3、是否包含测试
该步骤测试,是为了均衡效率与请求需求。如果不满足参数包含返回,那么就可以直接判断该参数不存在xss漏洞。反之,则继续测试。
- 如果参数值是常见的、短小的字符串,那么在响应体部包含并不足以说明满足xss的参数包含返回条件,比如html、<、1等参数值是不建议使用的。
- 如果参数值是路径参数,自定义构造极有可能导致404或跳转其它页面。类似的,如果参数值在服务端导致程序异常或者检查错误,那么也可能导致输出异常信息或跳转其它页面。
- 如果参数值被服务端拆分进行使用,典型的是分词匹配搜索技术,那么响应包含参数个数会失真。如果查询结果包含参数值,响应包含参数个数也会失真。建议搜索为空结果集。
- 一方面,参数值即使经过一定的选择构造,在响应体部中仍然可能存在非参数包含。另一方面,参数值在请求的其它参数中可能作为子串,由此影响该参数在响应体部中的包含个数。
综合来看,选择一个参数值替代样本参数是有必要的,尽量避免常见字符组合和敏感字符,以及适当的长度,比如t404t。分析时,直接参考其在当前响应体部的个数即可。
这样的测试并不完美,但是相对均衡。
4、敏感字符包含测试
5、特殊性测试
(1)控制浏览器,请求中写入payload,发起请求
(2)payload响应然后解析,其预期作用是向自搭建的某服务器发起请求
(3)自搭建服务器接收请求之后存储相关数据,并且供请求
(4)分析服务器被请求的数据,是否存在xss,以及对应的paylaod
该测试除了技术方面比较麻烦,从适应的需求来说,要么极简,只测试具有代表性的payload。要么极繁,测试几乎所有的payload。