ColdFusion的CSRF XSS攻击防范

问题描述 投票:3回答:1

我在尝试阻止CSRF攻击实施的csrfGenerateToken和csrfVerifyToken功能。

我已经设置了这些网页标题:

set X-XSS-Protection "1; mode=block"
always set X-Frame-Options SAMEORIGIN
X-Content-Type-Options nosniff
Strict-Transport-Security "max-age=63072000" env=HTTPS

我做了一些研究,并进行推荐由Adobe做这样的事情:

<cfset tokenVar = 't' & lCase( hash( createUUID() & randRange( 1000, 100000 ), 'MD5', 'UTF-8', 250 ) )>
<form action="updateprofile.cfm" method="post">
    <input type="hidden" name="f#hash( 'tokenVar', 'SHA-256', 'UTF-8')#" value="#tokenVar#">
    <input type="hidden" name="f#hash( 'formToken', 'SHA-256', 'UTF-8')#" value="#csrfGenerateToken( tokenVar, true )#">
    <input type="text" name="emailAddress" value="#EmailAddress#">
    <input type="text" name="phoneNumber" value="#PhoneNumber#">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>

Updateprofile.cfm将有:

<cfparam name="FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')]" default="0">
<cfparam name="FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')]" default="0">
<cfif not csrfVerifyToken( FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')], FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')] )>
    <!--- CSRF attack. Clear cookies and kick user out --->
    <cfinclude template="clearcookies.cfm">
    <cflocation url="signin.htm" addToken = "no">
</cfif>

这将工作,如果2个帐户在同一个浏览器登录,然后如果尝试更新等。然而,当我仅保存生成的HTML的副本,从其中的一个,并保存为CSRF-attack.htm本地:

<html><body>
<script>history.pushState('', '', '/')</script>
<form action="http://www.exsample.com/updateprofile.cfm" method="post">
    <input type="hidden" name="f41BE6B4E09CBA69BDB76DBB69B493E8D49F5DD9ED230085913397B4C751D4E60" value="t93315a7c3ecb43d4d1b9422da97ffb09">
    <input type="hidden" name="f08DFC2607D4119D7B16B4C01DC5C00F54B044DC937257ABC411F9A7E55BB4191" value="A0EED67C55F5E17683E2E1B21FF3454FE690E0B1">
    <input type="text" name="emailAddress" value="[email protected]">
    <input type="text" name="phoneNumber" value="1-222-3333">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>
</body><html>

我处理的原始形式更新的电话号码1-333-4444。然后,我又重新回到了形式一次。这时一个新的CSRFToken应该已经创建,因为ForceNew设置为true。

然后我去,我有救了,根本改变了电子邮件地址的值[email protected]代替[email protected]与老令牌静态的HTML页面,然后点击“更改资料信息”按钮,我可以把它更新到网站!

我是不是做错了什么或者是它如何工作的?看来这个令牌是无用的,如果我可以简单地复制令牌值和操作的内容,然后将它张贴。我怎样才能接收页面上缓解这样的问题?

提前致谢。

coldfusion csrf coldfusion-10 csrf-protection
1个回答
1
投票

csrfVerifyToken结果仍然会通过,直到生成另一个CSRF令牌使用相同的密钥,在这一点上它就会无效。所以,如果你正在使用单令牌,那么你需要通过调用csrfGenerateToken具有相同tokenVar你打电话csrfVerifyToken后废止旧令牌

我写了一个代码示例博客文章来说明这一点:https://www.petefreitag.com/item/856.cfm

© www.soinside.com 2019 - 2024. All rights reserved.