常见的web攻击手段

DNS攻击

DNS劫持

劫持DNS服务器,取得域名的解析记录控制权之后,修改域名的解析结果。在ISP中比较常见,当用户访问某个域名的时候会收到一个假的解析结果(广告站),广告站弹出广告之后再跳转到目标网站。

DNS缓存投毒攻击

cache poisoning,攻击者对运行在UDP 53上的DNS查询进行检测,一旦发现与关键字匹配的请求则立即伪装成目标域名的解析服务器(Name Server)返回虚假结果。

防止劫持可以优先选用公用的、可信的DNS解析服务器。为了避免DNS污染则可以借助其他工具加密查询工具,例如DNSCrypt。

XSS

浏览器的XSS过滤器可能会误报。

1
<textarea><script>alert('1');</script></textarea>

以上代码应该被正常渲染为正常的文本节点,而IE11会过滤。在搜索引擎中搜索<script>alert('1');</script>也会被IE警告并过滤。而Chrome的XSS过滤器基于词法解析。

浏览器在tokenize的时候,标签中的左斜线(/)被视为标签结束的符号,但是仅仅在后面跟着尖括号的时候会这样。如果出现在其他地方(值的范围除外)。那么它同样会被当做“空格”对待,从而被忽略。这也是一些XSS绕过代码可以使用形如<img/src=""/>这样的原因。

分为持久型(存在数据库中的网站评论)和非持久型(url中构造script标签)。可以获取客户端cookie在远程主机复制用户会话。解决方案:对输出进行编码。
CSRF:跨站请求伪造,攻击者通过http请求将数据发送到服务器,盗取会话cookie,攻击者不仅可以获取用户信息还能修改该cookie关联的用户信息。解决方案:使用跨站请求令牌,以防卫来自终端的POST,PUT,DELETE请求。(例如为了防止恶意注册,在生成表单的时候服务器生成一个scrftoken插入到表单的隐藏域,表单提交的时候对scrftoken进行验证,只允许合法请求通过,并生成新的令牌返回给该页面)。

有些网站开放了重定向功能,例如访问主站之前会重定向到要求登录页面要求登录,这也是存在风险的:

正常重定向:http://mysite.com/login?redict=http://mysite.com
异常重定向:http://mysite.com/login?redict=http://mysIte.com

如果我们将mysIte.com做的和mysite.com一模一样,然后在社交网络上散布,如果有人重定向到mysIte.com,他的用户名和密码将会被盗窃。解决方案是只重定向到白名单的网站。

CSFR和XSS正好相反。XSS在于客户端信任服务器数据,而CSRF在于服务端信任客户端数据。

小知识

cookie和网页的同源判定不一样,不区分端口、协议、不严格按照path部分指定隔离。 攻击者可以在http协议中通过设置cookie来覆盖带有secure标记的cookie。

script标签中的html注释是无效的:

1
2
3
4
5
<script>
<!--
alert(1);
-->
</script>

使用js的constructor可以创建匿名函数:

1
2
3
// ""["charAt"] 获取String.prototype.charAt
// 接着调用constructor可以得到一个匿名函数,给要执行的匿名函数前面加上括号,代码就会执行
""["charAt"]["constructor"]("alert(1)")() // 将会执行alert(1)

响应头x-frame-options设置为SAMEORIGIN只能被同源站点的iframe加载。

泛解析,利用通配符(*)来做次级域名,实现所有的次级域名均指向同一地址的解析方式。如果网站使用了泛解析,结合浏览器的同源策略可能带来一些灾难性的后果。http://www.filldisk.com/,打开它不管,一段时间后硬盘就会被撑满。原理localStorage每个子域名拥有5M存储,每个子域名都会被认为是一个独立的源。

针对html5元素的攻击:

1
2
3
4
5
6
7
<input type="text" autofocus onfocus="alert(1)">
<svg>
<script>alert&#40+1&#41</script>
</svg>
<form>
<button formaction="javascript:alert(1)">click</button>
</form>

https的安全性取决于双方如何使用,如果网站同时支持http和https,则攻击者可以通过截获http报文来获得连接中的隐私信息。https机制使用非对称加密系统(公约加密,私钥解密)。发送方用对方公钥来加密消息,再用自己的私钥解开。但是如果一直采用这种方式的话传输效率会比较低。因此浏览器中通常使用混合加密算法:用非对称加密算法交换一个密钥,通过校验之后再用这个密钥进行对称加密并和服务器通信。算法安全性取决于密钥的长度。

HTTP流量升级:当用户访问http网站的时候发送302重定向,并指定Strict-Transport-Security: max-age=31536000头。SSLstrip工具可以流量降级。

wap浏览器不支持cookie,要传递状态只能通过隐藏的web表单或者URL参数。登陆信息放在url参数中是十分危险的,这只是受限于手机性能的折中方案。由于移动端屏幕过小,因此:隐藏地址栏、合并UI,下滑页面自动全屏等操作其实是有风险的。

堆喷射:循环申请内存,并最终覆盖某个特定地址,从而让攻击者执行恶意代码。

正则表达式攻击:

1
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'.replace(/(([a-zA-Z0-9]+)*)@([A-Za-z0-9]+)/,'a');