应该带着‘所有的输入都是有害的’ 的思想去解决问题。
主要危害形式:
- 网络钓鱼,包括窃取用户账号;
- 窃取用户cookies资料,从而获得用户隐私信息,或利用用户身份进一步对网站执行操作;
- 劫持用户会话,进行非法转账、强制发表日志、发送电子邮件等;
- 强制弹出广告、刷流量等;
- 恶意操作,删除文章等;
- 网页挂马;
- 传播跨站脚本蠕虫等
CSRF恶意请求
webA:安全信任网站 webB:攻击者网站 (带有恶意请求) userA:安全操作者 userB:攻击者
CSRF概念:跨站点请求伪造(Cross—Site Request Forgery),
一、CSRF的攻击原理及实现过程:
- userA访问webA网站,登录账号和密码,验证信息通过,webA的服务器把生成的cookie返给浏览器,并保存下来,这样可以正常发请求给webA;
- 用户未退出webA之前,在同一浏览器中,打开一个TAB页访问webB;
- webB接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
二、 诱导点击的方式
- 通过放入广告诱导用户点击webB,
- 邮件
- 短信
攻击性代码形式:
- 通过cookie转账
- 模仿用户提交表单行为
- 删除帖子
总之,是骗取userA访问恶意网页webB
三、 实例场景:
-
url,比如 bank.example/withdraw?ac… 此url可以通过请求把userA的1000000元转给userB
-
删除帖子(比如url中带有id,就能删除帖子)
这个利用了img的src可以跨域请求的特点,这种情况比较少,因为
一般网站不会利用get请求修改资源信息。(get一般是获取信息,不会用来修改资源。)
举最简单的例子
恶意网站这么写一样可以攻击:
<body>
<iframe display="none">
 <form method="post" action="http://localhost/list.php">
  <input type="hidden" name="action" value="delete">
  <input type="hidden" name="id" value="12">
<input id="csfr" type="submit"/>
 </form>
</iframe>
<script type="text/javascript">
document.getElementById('csfr').submit();
</script>
</body>
四、 防御手段: 目前防御手段主要有三种:验证http referer字段、在请求头中添加token并验证、在http中自定义属性并验证
验证http referer字段 验证 Referer 值,如果是安全网站就通过,否则拒绝请求
好处是简单易行,但是不排除有些浏览器允许修改referer的风险
在请求头中添加token并验证 换句话说,也就是对请求进行认证,加上token验证,证明是安全用户本来发起的
验证码(通过手机或者邮箱,得到验证码,可以证明是本人,不是第三方伪造的)
要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求
在http中自定义属性并验证 把token放在http头自定义的属性里
跨域 设置白名单和黑名单
采用post请求 post可以增加攻击的难度,请求更安全,需要用js实现,
XSS 跨站点脚本攻击
反射型XSS 通过输入url,将恶意脚本附加到url上,通常出现在网站的搜索栏和用户登录的地方。 weibo.com/login.php?'…'
XSS 跨框架钓鱼 怎么构造钓鱼?使用标签iframe. weibo.com/login.php?'…'
此种url别人可能会问,一眼就看出来不合法的链接,攻击者会对url进行编码
怎么盗取到cookie的呢
现在大部分主流浏览器已经对url攻击做了预防方法。
登录银行的页面,把iframe框覆盖页面的登录框,这样可以获取到账号和密码,
HTML注入式钓鱼 直接利用XSS漏洞注射HTML/JavaScript代码到页面中,或者是把用户输入的数据”存储“在服务器端。
现在浏览器和后端都设置了安全机制。
常见的解决办法:
-
XSS Filter,分析用户提交的输入,并消除潜在的跨站脚本攻击、恶意的HTML等。在需要html输入的地方对html标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
-
如果检测到不合法的输入字符,返回404或者405(访问被阻断)
持久型 概念:攻击者想方设法把恶意代码上传或者存储到服务器中。
攻击方式:
- 通常出现在博客日志、留言、评论等
比如输入:
<script>alert('包小姐')</script>
<script>alert(document.cookie)</script>
- 实现蠕虫行为:将xss shellcode写进xss点(例如个人档案),引诱用户查看,攻击者利用ajax修改受害用户的个人档案信息(怎么修改?post请求改个人档案),将恶意的代码复制进去。随后任何查看受害者个人档案的也会被感染,执行重复操作,直到xss蠕虫传播。
xss蠕虫: 利用ajax/js 编写的蠕虫病毒,能够在网站中实现病毒的几何数级传播,其感染速度和攻击效果都很可怕
- 绕过xss Filter: 1)利用<>标记注射HTML/js 解决:过滤和转义<>或 2)利用HTML标签属性值执行xss
3)产生自己的事情 比如:只要图片不存在就触发onError
4)用十进制、十六进制等编码标签属性值逃过服务器的过滤
<div style="xss:expression(alert(1));"></div>
<img STYLE="background-image:\75\72\6c\28\6a\61\76\61\73\63\72\69\70\74\3a\61\6c\65\72\74\28\27\58\53\53\27\29\29">
5)利用css跨站剖析
<div style="background-image:url(javascript:alert('xss')">
<style>
<body {background-image:url("javascript:alert('xss')");}
</style>
防御办法 1)输出编码
- < 转成 & lt ;
-
转成 & gt;
- & 转成 & amp; 2)白名单、黑名单 3)URL属性
- 规定href和src是以http://开头;
- 规定不能有十进制和十六进制的编码字符
- 规定属性以双引号“界定
Http Header攻击
url中重定向到地址,比如微信授权登录就有这种操作,(跟第三方打通,基本上有这些操作。) 被重定向的地址中包含script等恶意代码,可以编码或者过滤。
添加恶意代码:在请求头的cookie中加入内容,可能会超过8k,所以限制请求头大小(限制request headers的大小)
把超过8k的header链接发给受害者,就会被服务器拒绝访问。解决办法就是检查cookie的大小,限制新cookie的总大写,减少因header过大而产生的拒绝访问攻击
总结
通过研究此专栏,学习知识(专栏和其他拓展知识)如下
- Referer 值会记录下用户的访问来源,用户自己可以设置浏览器使其在发送请求时不再提供 Referer
- 通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏
- 多种防御方法
- token认证的原理
- 攻击手段
参考链接: