代码之家  ›  专栏  ›  技术社区  ›  Jack

ColdFusion CSRF XSS攻击防范

  •  3
  • Jack  · 技术社区  · 5 年前

    在尝试防止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
    

    <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>
    

    更新配置文件.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>
    

    如果两个帐户在同一个浏览器上登录,并且其中一个试图更新另一个,则此操作将有效。但是,当我简单地从其中一个保存结果html的副本并将其另存为csrf时-攻击.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="test@test.com">
        <input type="text" name="phoneNumber" value="1-222-3333">
        <input type="submit" name="btnSubmit" value="Change Profile Info">
    </form>
    </body><html>
    

    然后我转到我保存的静态HTML页面,简单地将电子邮件地址的值改为test2@test.com而不是test@test.com测试有了旧的令牌,然后点击“更改配置文件信息”按钮,我就可以将其更新到站点!!

    是我做错了什么事还是它的工作原理?如果我可以简单地复制令牌值并操作内容,然后发布它,那么令牌似乎是没有用的。我如何在接收页面上减轻这样的问题?

    提前谢谢。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Pete Freitag    5 年前

    这个 csrfVerifyToken csrfGenerateToken 同样的 tokenVar 你打电话后 CSR验证令牌

    https://www.petefreitag.com/item/856.cfm