今年十月份我的第二本书《基于的电子商务网站设计》出版了,在这本书中我不仅介绍了如何利用框架搭建电子商务网站,也论述了如何利用的类对所创建的电子商务产品进行接口测试。
在书写极乐口测试代码过程中,我遇到的最大的困难就是如何通过测试程序绕过的防止CSRF攻击的插件,通过近一个多月的努力我终于解决了这个问题,但是同时也揭露了框架的防止CSRF攻击的插件的漏洞。首先我们来看一下什么是CSRF攻击。
1、什么是CSRF攻击?
我们假设一个网站的HTML代码如下:
大家都知道,采用验证码的目的是为了防止“黑客”,利用机器来通过穷举的方法来试图登录系统。检查验证码是否正确用的往往是前端做的判断。这样,“黑客”可以采用自己的网站建立如下页面:
大家可以看见,在这段代码中验证码没有了,form的变成了绝对路径,这样“黑客”就绕过了前端的验证,可以对自己代码进行编写自动化脚本实现用穷举的方法来试图登录系统。这个就是CSRF攻击。
2、的CSRF插件是如何解决CSRF攻击的
下面让我们来看一下的CSR插件是如何解决CSRF攻击的。利用了一个名为..csrf.的中间件(可以在的.py中设置)利用CSRF令牌的方式来控制。具体方式生成一个一百个字符的随机字符串作为CSRF令牌,在表单中产生一个名为的表单,把这个CSRF令牌的值放入这个字段中,然后在提交这个表单的时候产生一个名为的,这个的值也是CSRF令牌的值。
后台检查如果表单的值与的的值一致,则返回200返回码,进入登录后的页面,否则返回403返回码,拒绝进入系统。由于这个CSRF令牌是随机生成的一百个字符的字符串,“黑客”是很难猜到这个字符的,所以就达到了CSRF的攻击防护。
3、的CSRF插件的漏洞
3.1通过类破解
但是这个CSRF插件是有漏洞的,在页面.html页面载入后,黑客可以通过某种手段(比如正则表达式)获得这个CSRF令牌(即中的一百个字符值),然后构造一个名为的,名为刚才过的的CSRF令牌值,这样就有了下面的代码。
代码“ =str(re.(r"name=\'\' =\'(.+?)\'/>",text))”是通过re.正则方法获得CSRF令牌,存在变量中,由于用这个方法获得的值是“["CSRF令牌值"]”格式的,也就是说去前面多了个“["”,后面多了个“"]”,所以后面用语句“ = [2:-2]”过滤出来,然后利用的post方法,先构造post参数:“={"":"","":"","":}”,这里“"":”让表单仍旧为值。通过 = {"":}构造值,通过=作为post参数传给后台。这样表单的值与的值是一致的,所以,登录通过。
后来,我惊奇的发现不用这么麻烦,我们直接把表单的值与的值设置相同,即:
3.2通过框架破解
下面的代码是利用做基于GUI的自动化测试代码。
代码通过 =self..("").("")获取表单的值,通过elf..({"name":"","":})把这个值放入到名为的中。
3.3通过破解
在也可以破解,如下图:
通过正则表达式提取器获取.html中的值。
把获得的值放入名为的中
把获得的值仍旧作为表单参数传给后台处理。
3.4通过破解
在中,录制完毕,脚本就直接把表单参数作为名为的传给后台,不用做任何代码修改。正是不可思议。
文:顾翔
图源:网络