一、序言
在Burp上,我们可以利用多种方法来配置宏(macro),以绕过HTML表单上的CSRF tokens,这样一来,我们就可以利用Burp Active Scans、Burp Intruder、Burp Repeater,乃至也可以利用Burp Proxy进行渗透测试。我们也可以找到专为Intruder模块设计的Grep-Extract以及pitchfork攻击类型。当然,如果我们乐意的话,也可以开拓自己的Burp Extension。Sqlmap上也有-csrf-token以及-csrf-url参数来搪塞类似场景,如果不该用这些命令,我们可以按照之前描述的方法来配置Burp,然后在sqlmap中通过-proxy参数与Burp合营利用。
在本文中,我们会先容另一种办法,那便是利用python中的CGIHTTPServer来完成这一任务。

二、实验环境
我们布局了一个非常大略的PHP/mysql环境,登录后,你可以访问某个受限区域。你可以访问此链接获取实验所用的PHP代码,以便在其他场景做些修正或调度。不要在意代码细节,毕竟我并不是PHP专家,只是热衷于搭建知足需求的测试环境而已。实验环境有助于我们理解测试过程,在现实场景中探求真正目标。
实验所用的CSRF tokens为一串随机天生的SHA256散列字符串,每个HTTP要求都对应一个不同的tokens。
三、面临的问题
不经由分外配置时,Burp不会检测到这个问题。
同理,没有利用-csrf-token参数时,sqlmap也无能为力:
我利用了–technique、–dbms以及-p参数来加快扫描速率。由于这是一个大略的基于布尔值的SQL注入(boolean-based SQLi),我们只须要利用默认的-level 1参数即可。但我们须要将-risk设置为3,由于只有利用较高的风险数值,我们才能测试OR类型的SQL注入(OR boolean-based SQLi)场景。OR类型的SQL注入非常危险,由于这种语句可以使任何条件的结果为真。比如,在利用WHERE子句的UPDATE或DELETE语句中,利用这种注入办法,你很有可能会欠妥心更新数据库中所有用户的密码,或者导出用户的凭据表,而这正是你在渗透测试中该当尽力避免的结果。
在sqlmap中,我们可以利用–csrf-token=”mytoken”参数检测到OR类型的SQL注入:
由于这是一个登录验证表单,很明显会对应一条SELECT语句,这意味着利用最高的风险等级3不会带来任何风险。
当然,如果你有有效的凭据(实际渗透测试中你很难具备这个条件),此时该场景也会受AND类型的SQL注入(AND boolean-based SQLi)影响。然而,纵然我拥有有效的凭据,我首先还是会利用另一个(有效的)用户名来探求可用的OR类型SQLi,以免欠妥心锁定账户(如果存在账户锁定机制的话)。
在sqlmap中,我们可以利用–csrf-token=”mytoken”来检测AND类型的SQL注入:
四、利用CGIHTTPServer
创建如下CGI脚本:
我们将该脚本命名为mask.py,存放在xxx/cgi-bin/目录中,同时请确保.py文件为可实行文件。创建该文件后,我们须要在xxx目录中运行python -m CGIHTTPServer命令。默认情形下,做事器会在8000/tcp端口上监听。
首先,利用精确的密码测试这个做事器:
然后,测试一下缺点的密码:
现在,无需分外配置,我们就可以利用Burp以及sqlmap来检测SQL注入漏洞。
这就彷佛我们添加了一个中间层,可以简化CSRF tokens给我们测试过程所带来的繁芜度,现在我们无需刻意去提交这个token信息了。
五、参考文献
[1] Sqlmap
[2] 其余我们还可以利用Mechanizer来完成类似功能,以便扫描器能够检测到相应数据中存在的差异。
[3] Burp宏
[4] 对渗透测试职员较为实用的Python代码