sqlmap遇上Cloudflare:一场猫鼠游戏
Cloudflare的绕过防护墙不是纸糊的。我拿一个真实目标做测试,绕过站点套了Cloudflare免费版,绕过WAF规则全开。绕过sqlmap直接跑,绕过连数据库指纹都摸不到——请求全被403挡回来。绕过日志里只有一串“Access denied”,绕过连个SQL报错都不给。绕过
问题出在流量特征上。绕过sqlmap的绕过默认User-Agent、请求频率、绕过甚至TCP包大小,绕过都带着明显的绕过自动化痕迹。Cloudflare的绕过Bot Management不傻,它看的绕过是行为模式,不是单纯匹配关键字。
绕的第一步,是让流量“像人”。
改User-Agent只是基本功,我直接伪造Chrome 120的完整头,连Accept-Language都按浏览器习惯排序。但光改头不够——Cloudflare会检测请求间隔。sqlmap默认的并发线程像机关枪,我压到单线程,加`--delay=3`,每发请求间隔3秒。慢是慢点,但终于能过第一道JS挑战。真正的坎在WAF规则层。目标站点有个`id`参数,我手动测了下,`id=1'`直接触发拦截页面。Cloudflare的SQL注入规则库更新很勤,常见payload基本秒杀。这时候得换个思路——用sqlmap的`--tamper`参数做混淆。
我试了`space2comment`(空格换注释),没用,规则里预置了。换成`between`(把`>`换成`NOT BETWEEN`),还是被识别。最后用`charencode`配合`randomcase`,把关键字大小写打乱,再对部分字符做URL编码——终于绕过第一层检测。但代价是payload膨胀得厉害,请求体大了一倍,速度更慢了。
有个细节特别有意思。Cloudflare的WAF对POST请求的检测比GET严格得多。我把请求全部改成GET,参数挪到URL里,再用`--method=GET`强制sqlmap走这个通道。配合`--data`留空,居然比POST模式更容易混过去。原因可能是Cloudflare对GET的解析器有性能取舍,某些嵌套编码处理得不彻底。
还有一招是打时间差。Cloudflare的规则引擎有缓存,同一IP的首次请求会走全量检测,但后续如果带上合法的`cf_clearance` cookie,检测强度会降档。我手动用浏览器过一遍JS挑战,拿到cookie,再喂给sqlmap的`--cookie`参数。这时候WAF的敏感度明显降低,像是“信任”了这个会话。
最折腾的是绕过速率限制。Cloudflare对单IP的每分钟请求数有阈值,超了直接封IP 30分钟。我租了5个代理池,用`--proxy`轮换,每个IP只跑15个请求就换。配合`--check-interval`定期探测IP存活,总算把扫描时间拉长了3倍,但没再触发封禁。
最终拿下的方式有点取巧。目标站点有个搜索功能,参数在POST的JSON体里。Cloudflare对JSON格式的解析不如表单深,我手动构造了`{ "q":"1' OR '1'='1"}`,发现能触发数据库报错。sqlmap的`--data`直接塞JSON字符串,加`--headers="Content-Type: application/json"`,居然一路畅通。WAF对非标准Content-Type的检查明显松懈。
整个过程中,我注意到Cloudflare的免费版和付费版差距巨大。免费版的WAF规则集是公开的,用tamper能绕。但企业版的“托管规则集”带机器学习,会实时学习流量基线,固定tamper没用。后来我换了个用了企业版的目标测试,同样的方法完全失效,请求全被标记为“可疑”,连JS挑战都不给过。
说到底,绕过Cloudflare不是单点突破,而是组合拳。改头、降速、换协议、伪造会话、动态代理,每一步都像在走钢丝。sqlmap本身只是工具,真正的功夫在怎么理解防护系统的判定逻辑。Cloudflare的拦截页上那句“Sorry, you have been blocked”看着死板,背后是无数规则在权衡——而你只需要找到那个权衡的缝隙。
顶: 12踩: 9






评论专区