csrf攻击原理与解决方法_CSRF攻击防御原理,2024年最新大专生三面蚂蚁金服

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

c). 签名[signature]:signature。signature签名,是对“msg消息”用特定算法进行加密后的串。

token = base64(msg)格式化..base64(sha256("密锁", msg))

Token由被Base64的msg编码串+先256加密msg再进行Base64编码,两个串的内容结合。

2.Token的加密

首先,是按照合适的加密方法对数据进行加密。这里我们通用的就使用了sha256散列算法,然后进行BASE64的格式转换。然后,我们需要在token串中隐含过期时间的设定,这种机制要保证,每条与服务器交互的Token有过期时间控制,一旦token过期服务器不处理请求。

3.Token的验证校验

当用户向服务提出访问请求时,产生Token再提交给服务器的时候,服务器需要判断token的有效性(是否过期,签名有效),一旦传向服务器的请求中的Token异常,就可以判定是可疑行为不做处理,返回异常提示。

Token校验

a. Token解包

先把接受到的token,进行分解,“.”为分隔符,分为msg部分+signature签名部分。

b. 比对签名

对msg部分的base64码反向decode_base64(msg)解码,在对解码后的msg明文,进行同样的encode_base64(sha256(msg))签名串转换处理。如果密锁相同,判断加密后的数据和客户端传过来的token.signature的部分是否一致。如果一致,说明这个token是有效的。

c. 判断时间过期

如果签名有效的,取出msg中的timestamp字段数据,与当前系统时间进行比较,如果过期时间小于当前时间,那这个token是过期的,需要重新的取得token。

0x05 流程实现

文字版本的防护原理上面讲了,下面我们将整个防护流程分解成函数实现, 直接通过代码的形式来看实现,其实比看文字描述更简单。

Lua代码如下:

local gen_token = function(key, expires) --做成一个过期时间戳。 if expires == nil then expires = os.time() + 60 + 60 * 8 end --对msg部分进行base64编码。 local msg = encode_base64( json.encode({ key = key, expires = expires })) --进行sha256哈希。 local signature = encode_base64(hmac_sha256('testkey', msg)) --拼接成一条token。 return msg .. "." ..signature``end``local val_token = function(key,token) --对输入数据的判空操作 if not (token) then return nil, 'mssing csrf token' end --对token的msg部分,signature签名部分进行拆分。 local msg, sig = token:match("^(.*)%.(.*)$") if not (msg) then return nil, "malformed csrf token" end sig = encoding.decode_base64(sig) --对解包后msg,按照相同的加密key:"testkey",重新进行sha256哈希,比对signature, --如果不一致,说明这个token中的数据有问题,无效的token。 if not (sig == hmac_sha256('testkey', msg)) then return nil, "invalid csrf token(bad sig)" end --对msg进行base64解码,判断其中的key和传入的key是否一致。 --如果不一致说明token也是无效的。 msg =json.decode(decode_base64(msg)) if not (msg.key == key) then return nil, "invalid csrf token (bad key)" end --取出msg部分的时间戳,判断是否大于当前时间,如果大于,说明token过期无效了。 if not (not msg.expires or msg.expires > os.time()) then return nil, "csrf token expired" end``end

因为本文提到的 CSRF防护,是Moonscript实现的,最后翻译成Lua语言, 而用的Token编码的函数与signature签名用的加密算法,也都是基于Lua库,所以下面列出了这些常用的库的相关信息。

库一览列表:

http://lua-users.org/wiki/CryptographyStuff

0x06 核心安全算法库

要实现上文所说的Token机制,要有库函数Bash64与sha256加密的工具包库支持。

1.SecureHashAlgorithm和SecureHashAlgorithmBW

这个工具包是支持sha256加密的,而且是纯lua方法的实现,问题是,这两个包分别依赖lua5.2和lua5.3。

大部分老系统的运行环境是lua5.1,因为大部分的生产环境都是lua5.1,因为历史原因暂时没法改变。如果要把5.2的程序移植到5.1下运行,还需要移植一个lua5.2才独有的包,这是lua5.2升级之后才有的部件:bit32,而在lua5.3中又将这个部件去掉了,移植的动力不大,lua5.1的用户可以考虑使用其他的库。

2.Lcrypt

这个包不是纯lua的实现,底层加密用的是C语言,而且额外还有依赖另外另个工具包 libTomCrypt和libTomMath,github上有源码,所以要想让这个包正常运行需要手动make安装3个源码工程。

网站:

http://www.eder.us/projects/lcrypt/

3.LuaCrypto

这个包的安装用的是luarocks,就比较简单了

luarocks install luacrypto

我们选用这个包进行加密处理。LuaCrypto其实是openssl库的前端lua调用,依赖openssl,openssl库显然会支持sha256加密,相对也比一般的第三方实现更可靠。写一个简单的加密程序:

local crypto = require("crypto")``local hmac = require("crypto.hmac")``local ret = hmac.digest("sha256", "abcdefg", "hmackey")``print(ret)

ret的返回结果是,如下这个字符串。

704d25d116a700656bfa5a6a7b0f462efdc7df828cdbafa6fbf8b39a12e83f24

我们需要改造一下代码,在调用digest的时候指定输出的形式是raw二进制数据形式,然后在编码成base64的数据形式。

local ret = hmac.digest("sha256", "abcdefg", "hmackey",rawequal)``print(ret)

这时候的输出结果是:

cE0l0RanAGVr+lpqew9GLv3H34KM26+m+/izmhLoPyQ=``lua-base64

使用的是下面的库,lua库就是这样,有很多功能程序有很多的实现,并且很多非官方的第三方实现。

https://github.com/toastdriven/lua-base64

关于库的部分就介绍这些,可以找一个可运行lua的运行环境实践这个处理过程。

0x07 总结

现在随着对安全的重视,过去的攻击行为都会遇到新的防御方法。对抗在此消彼长的过程中动态变化,开发工程师应该比过去任何时候都应该注意自己程序输入数据的有效性, 而渗透攻击也不是一成不变,如果防护采用新的手段,也需要渗透人员了解防御背后的工作原理,从新的角度发现问题,只要是人写的程序可能都会不同程度的出现漏洞,都会因为软件之间不得不产生的依赖,而彼此关联, 安全问题从攻击与防御的双重角度去了解,才能适应未来动态变化的安全情态。

*本文原创作者:糖果L5Q,本文属于FreeBuf原创奖励计划,未经许可禁止转载

bca10f2f4996bb73c17bf7fca2f81734.gif
精彩推荐

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-uAhjmXsa-1713294192911)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值