前言
CSRF tokens 是服务器生成的一串随机值, 其主要作用是防止表单重复提交以及请求伪造攻击. 由于该生成值具有随机性, 一次性, 并且是基于服务器端的前一个请求生成的, 因此黑客几乎不可能伪造它.
Burp Suite
虽说无法伪造, 但并不代表我们就不能绕过它. 这里, 不得不提及一款 web 渗透神器 Burp Suite. 在 Burp 上有多种配置其使用宏来绕过 html 表单上 CSRF tokens 的方法, 例如我们可以使用 Burp Active Scans,Burp Intruder,Burp Repeater, 甚至 Burp Proxy. 还有专门用于 Intruder 模块的 Grep-Extract 和 pitchfork 攻击类型. 如果你还觉得不够, Burp 完美的扩展性支持你开发自己的 Burp 插件.
除了 Burp 外, 另一款神器 Sqlmap 也为我们提供了类似的功能. Sqlmap 中有一个 - csrf-token 和 - csrf-url 参数, 可用于绕过 CSRF tokens. 或者你也可以像我刚说的那样, 配置 Burp 使用 - proxy 通过 Burp 运行 sqlmap.
但今天我要介绍另一种绕过方法, 即使用 Python CGIHTTPServer.
实验环境
我的测试环境是一个简单的 PHP+MySQL, 我可以登录并访问受限区域. 我在这里上传了 PHP 代码 , 你可以下载进行测试. 代码可能写的并不完美, 但用于测试目的应该问题不大.
CSRF tokens 是随机生成的数字的 SHA256 哈希值, 并且每个 HTTP 请求的哈希值都不同.
因此, 如果不对 Burp 进行针对性的配置, 它将无法检测到该问题的存在.
sqlmap 也同样.
我使用 - technique,-dbms 和 - p 选项来加速扫描. 由于这只是一个简单的基于布尔的 SQLi, 因此 - level 1(默认值)就足够了. 但是, 如果凭据不正确的话, 则必须将 - risk 设置为 3 才行. 因为只有风险等级为 3 的情况下, 基于布尔的 SQLi 才能被检测到. 基于布尔的 SQLi 是非常危险的, 因为它们可以使任何条件为真. 例如当 UPDATE 或 DELETE 语句的 WHERE 子句存在这种注入, 攻击者就可以实现更改数据库中用户密码, 转储凭据等.
这里, 我使用 sqlmap 的 SQLi -csrf-token ="mytoken" 选项, 检测到了一个基于 OR 的 SQLi:
这是一个登录验证表单, 显然这里是一个 SELECT 语句, 这意味着风险等级 3 没有危害.
当然, 如果你有有效凭据, 它还容易受到基于 AND 的 SQLi 攻击. 但即使我拥有有效凭据, 我也会先用另一个 (有效) 用户名来进行测试, 先找到基于 OR 的 SQLi. 这样做可以避免账户被以外的锁定.
此外, 使用 sqlmap 的 SQLi -csrf-token ="mytoken" 选项, 我还检测到了一个基于 AND 的 SQLi:
CGIHTTPServer
首先, 我们来创建 CGI 脚本:
这个脚本需要创建在 folder_whatever/CGI-bin / 目录中. 我们将其称为 mask.py, 并确保其是可执行的. 创建完成后, 我们从 "folder_whatever" 目录中运行 "python -m CGIHTTPServer". 默认情况下, 它将侦听 8000/tcp 端口.
你可以使用正确的密码对其进行测试:
以及使用一个错误密码:
现在, 我们无需对 Burp 和 sqlmap 进行特定配置, 就能轻松的检测到安全漏洞.
来源: http://www.tuicool.com/articles/7N7fQbR