《Web安全测试学习手册》- XSS跨站脚本漏洞
0x00 XSS跨站脚本漏洞
1)什么是XSS跨站脚本漏洞
跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。
XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
2)XSS跨站脚本漏洞的特点
- 所有攻击操作均在浏览器上实现
- 大多使用Javascript代码
0x01 XSS跨站脚本漏洞 - 风险等级
高
0x02 XSS跨站脚本漏洞 - 原理
是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。
0x03 XSS跨站脚本漏洞 - 常见场景
- 留言板
- SNS社区
- 文章发布
- 论坛
- ….
0x04 测试方案
在输入点提交如下payload,查看响应内容、结果,判断>、"、'、<、/、*
等字符是否过滤
>"'
'';!--"<XSS>=&{()}
'';!--"<script>alert(0);</script>=&{()}
'';!--"<script>alert(0);</script>=&{(alert(1))}
><script>alert(0)</script>
');alert(0);//
/><SCRIPT>/*s*/alert(String.from+CharCode(88, 83, 83))</script>
//"><scriPT>console.log(0);</sCRIpt>
<script/onreadystatechange=alert(1)>
<img src="--><img src=x onerror=alert(1)//">
<svg/onload=alert(1)>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
....
若代码能够执行,则存在XSS跨站脚本漏洞
0x05 修复方案
PHP
strip_tags($str, [允许标签]) #从字符串中去除 HTML 和 PHP 标记
htmlentities($str) #转义html实体
html_entity_decode($str) #反转义html实体
addcslashes($str, '字符') #给某些字符加上反斜杠
stripcslashes($str) #去掉反斜杠
addslashes ($str ) #单引号、双引号、反斜线与 NULL加反斜杠
stripslashes($str) #去掉反斜杠
htmlspecialchars() #特殊字符转换为HTML实体
htmlspecialchars_decode() #将特殊的 HTML 实体转换回普通字符
Java
方法一:特殊字符替换
public static String html(String content) {
if(content==null) return "";
String html = content;
html = html.replace( "'", "'");
html = html.replaceAll( "&", "&");
html = html.replace( "\"", """); //"
html = html.replace( "\t", " ");// 替换跳格
html = html.replace( " ", " ");// 替换空格
html = html.replace("<", "<");
html = html.replaceAll( ">", ">");
return html;
}
方法二:
apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml,java等的转义与反转义
org.apache.commons.lang3
包有个StringEscapeUtils
StringEscapeUtils.unescapeHtml4(str);
方法三:
org.springframework.web.util.HtmlUtils 可以实现HTML标签及转义字符之间的转换。
/** HTML转义 **/
String s = HtmlUtils.htmlEscape("<div>hello world</div><p> </p>");
System.out.println(s);
String s2 = HtmlUtils.htmlUnescape(s);
System.out.println(s2);
执行结果
<div>hello world</div><p>&nbsp;</p>
<div>hello world</div><p> </p>