Writer:BYSocket(泥沙砖瓦浆木匠) javascript
Reprint it anywhere u want. html
文章Points:
1. 认识XSS java
2. XSS攻击 浏览器
3. XSS防护(重点) 安全
先说个故事吧,在上一篇,我还想说这个案例。其实什么叫攻击,很简单。获取攻击者想要的信息,就黑成功了。抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行。OK,搞定了。因此,没有绝对的安全。 服务器
今天,泥瓦匠带大家认识下XSS,而后关于怎么防护的问题。至于防护的话,仁者见仁智者见智。尔等啥都不配不上的就绰见,望各位阅读者相互讨论。泥瓦匠目前是搞JAVA的,因此例子上JAVA比较多。 cookie
Q: 什么是XSS? 为啥有这个呢? app
A: 全名:Cross Site Script,中文名:跨站脚本攻击。顾名思义,是指“HTML注入”纂改了网页,插入恶意的脚本,从而在用户用浏览网页的时候,控制用户浏览器的一种攻击。 socket
XSS根据攻击的稳定性可分为三种:反射型XSS, 存储型XSS,DOM Based XSS. 编码
再来了解下XSS,是如何攻击?泥瓦匠这时候想到一句话:知己知彼,百战百胜吧。这攻击咱们不会很详细解释,毕竟想说的是XSS防护嘛。首先,泥瓦匠要介绍下的是:
XSS Payload,所谓用以完成各类具体的功能的恶意脚本。这时候我想到了黑客精神中的小插曲,如今所谓的“黑客”不是真正的黑客,而是称为脚本小子(Script Kid)。常见的一个XSS Payload,就是经过读取浏览器的Cookie对象,从而发起了‘Cookie劫持’攻击。这个泥瓦匠会教大家去防护哈,其中Cookie的‘HttpOnly’标识能够防止哦。
强大的XSS Payload能够作如下的事情哈:一、构造 GET 与 POST 请求 二、各类钓鱼 三、识别用户浏览器 等等
Q&A
Q:什么叫作钓鱼呢?
A:顾名思义,愿者上钩,这里作贬义用法。好比,人家用一个假的弹出框,或者假的页面让你输入QQ信息,或者啥帐号信息。其实你一输入人家服务器获取到你的帐户密码了。这就是鱼儿上钩了。 如图比喻:
兵来将挡,水来土掩。泥瓦匠在Web安全上,想提醒你们的是:“再高的树,猴子也能爬上去。”所以,咱们考虑的地方有些默认都给你作好了,有些须要咱们本身去关心,去设置。
其实在看不到的地方不少已经对抗XSS作了些措施。好比各类浏览器等。
1、按着上面的思路,泥瓦匠先聊下Cookie,一个Cookie,咱们是这样使用的:
一、浏览器下服务器发送请求,准备获取Cookie
二、服务器返回发送Cookie头,向客户端浏览器写入Cookie。(注意哦,这里是浏览器,不要当成什么浏览器内核)
三、在Cookie到期前,浏览器全部页面,都会发送Cookie。
这就意味着,咱们Cookie不能乱用。就像Session同样,因此在使用的时候,要注意下。有时候Cooike在用于记住密码的时候,千万要注意要将Cookie设置HttpOnly属性为Ture。这里我以SpringMVC为例子。若是用到Cookie的时候,应该这样:
1
2
3
4
5
6
7
|
// create cookie and set it in response
Cookie cookie1 = new Cookie("cookie1", "cookieValueHttpOnly");
Cookie cookie2 = new Cookie("cookie2", "cookieValue");
cookie1.setHttpOnly(true);
response.addCookie(cookie1);
response.addCookie(cookie2);
|
咱们打开浏览器能够看到下面这种结果,访问URL这个Controller层,打开Firebug查看:
2、输入校验
输入校验的逻辑必须放在服务端中实现。若是用JS进行的话,容易被攻击者绕过去。因此广泛的作法是,相似不少代码同样进行Double Check:”客户端JS校验和服务端校验一块儿,这样客户端JS校验会阻挡大部分甚至说99%的用户的误操做。”
在XSS防护上,咱们须要对用户输入的一些特殊字符校验,过滤或者是编码。这种输入校验的方式成为“XSS Filter”。首先咱们在配置文件中,
其中的路径配置固然,在你须要的地方配置下咯。而后泥瓦匠在这里写了个,Http请求装饰类,用来对这些参数的过滤。说干就干呗~实战出经验。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
{
public XssHttpServletRequestWrapper(HttpServletRequest request)
{
super(request);
}
public String[] getParameterValues(String parameter)
{
String[] values = super.getParameterValues(parameter);
if (values==null)
{
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i <
count; i++)
{
encodedValues[i] = cleanXSS(values[i]);
}
return encodedValues;
}
public String getParameter(String parameter)
{
String
value=
super.getParameter(parameter);
if (value == null)
{
return null;
}
return cleanXSS(value);
}
public String getHeader(String name)
{
String
value=
super.getHeader(name);
if (value == null)
return null;
return cleanXSS(value);
}
/**
* @Title: cleanXSS
* @Description: You'll need to remove the spaces from the html entities below
*
@param @return
* @return String
*/
private String cleanXSS(String value)
{
value= value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
value = value.replaceAll("'", "& #39;");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
value = value.replaceAll("script", "");
return value;
}
}
|
3、输出校验
通常来讲,除了富文本以外,在变量输出到HTML页面,可使用编码或者转义的方式来防护XSS攻击。这是一种各家委婉的方式吧。
用兵之道在于,如何正确的使用,才能以少胜多。Web安全这场战争也同样,因此要如何正确的使用XSS防护。
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want.