Web应用安全 四 跨站请求伪造(CSRF)

跨站请求伪造(CSRF)

一个跨站请求伪造攻击迫使登录用户的浏览器将伪造的HTTP请求,包括受害者的会话cookie和所有其他自动填充的身份认证信息,发送到一个存在漏洞的web应用程序。这种攻击允许攻击迫使受害者的浏览器生成让存在漏洞的应用程序认为是受害者的合法请求的请求。

跨站请求伪造(CSRF)

我存在CSRF漏洞?

检测应用程序是否存在该漏洞的方法是查看是否每个链接和表单都提供了不可预测的CSRF令牌。没有这样的令牌,攻击者就能够伪造恶意请求。另一种防御的方法是要求用户证明是他们要提交请求,如重新认证。
重点关注那些调用能够改变状态功能的链接和表单,因为他们是跨站请求伪造攻击的最重要的目标。多步交易并不具备内在的防攻击能力,并且攻击者也可以利用SSRF来诱导应用程序和API来产生任意的HTTP请求。
请注意:会话cookie、源IP地址和其他浏览器自动发送的信息不能作为防攻击令牌,因为这些信息已经包含在伪造的请求中。

攻击案例场景

应用程序允许用户提交不包含任何保密字段的状态改变请求,如:
http://example.com/app/transferFunds?amount=1500&destinationAccount=4673243243
因此,攻击者构建一个请求,用于将受害用户账户中的现金转移到自己账户。然后攻击者在其控制的多个网站中以图片请求或iframe中嵌入这种攻击。
<imgsrc="http://example.com/app/transferFunds?amount=1500&destinationAccount=attackersAcct#“width="0" height="0" />
如果受害用户通过了example.com认证,则伪造的请求将自动包含用户的会话信息,授权执行攻击者的请求。

我如何防止CSRF?

优先考虑的就是利用已有的CSRF防护方案。许多框架,如Spring, Play, Django以及AngularJS,都内嵌了CSRF防护,一些web开发语言如.Net也提供了类似的防护。OWASP CSRF Guard对Java应用提供了CSRF防护,OWASPCSRFProtector对PHP应用和Apache server也提供CSRF了防护。否则需要在每个HTTP请求中添加一个不可预测的令牌,这种令牌至少应该对每一个用户会话来说是唯一的。
1.最好的方法是将独有的令牌包含在一个隐藏字段中。这将使得该令牌通过HTTP请求体发送,避免其包含在URL中从而被暴露出来。
2.将令牌放在URL中或作为一个URL参数,但是这种方法的风险在于令牌会暴露给攻击者。
3.考虑对所有cookie使用”SameSite=strict”标签,该标签逐渐被各类浏览器所支持。

常用防止方法(ASP为例)

在共用页面创建一个产生随机字符串的方法,再在表单页面创建一个token,在form表单中建立一个隐藏字段,用来将token值传递给action中的页面,要跳转的页面接受到传递过来的token进行验证。

  • 注:不是所有的表单都适合用这样的方法,但是绝大多数可以,像跳转成功后的页面,有频繁的刷新操作,这时传过来的token值就没有值,校验不成功,这时,处理就比较难处理,所以在用时具体分析而定。

  • 1、创建一个随机字符串

Function randKey(obj)
 Dim char_array(80)
 Dim temp
 For i = 0 To 9 
  char_array(i) = Cstr(i)
 Next
 For i = 10 To 35
  char_array(i) = Chr(i + 55)
 Next
 For i = 36 To 61
  char_array(i) = Chr(i + 61)
 Next
 Randomize
 For i = 1 To obj   
  'rnd函数返回的随机数在0~1之间,可等于0,但不等于1
  '公式:int((上限-下限+1)*Rnd+下限)可取得从下限到上限之间的数,可等于下限但不可等于上限
  temp = temp&char_array(int(62 - 0 + 1)*Rnd + 0)
 Next
 randKey = temp  'N2fIgeYvD0mVyUPejm8ZeYtVi1iTgloWjMAHFZJeudQlaoT9xErIz03CvYmRL33
End Function 
  • 2、创建token
    创建一个token,值等于随机字符串
    session("CsrfToken")=randKey("64")

  • 3、表单中隐藏的token值,用来将token传递给下一个页面,下一个页面接受到传递过来的token进行验证
    <input name="eToken_DSI" type="hidden" value="<%=session("CsrfToken") %>" />

  • 4、 接收到的token值,与session中的值进行比对,一样则可以跳转,不一样则重定向页面

if Request("eToken_DSI") <> session("CsrfToken") or IsEmpty(session("CsrfToken"))  then
        response.Write "<script>window.history.go(-1);</script>"  
        response.End    
    else
        'response.Write "true"
    end if
        session("CsrfToken")=""
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容