<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>WAF on SYM01</title>
    <link>https://sym01.com/tags/waf/</link>
    <description>Recent content in WAF on SYM01</description>
    <generator>Hugo -- 0.145.0</generator>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 02 Aug 2021 02:28:33 +0800</lastBuildDate>
    <atom:link href="https://sym01.com/tags/waf/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>利用 multipart boundary 绕过 WAF</title>
      <link>https://sym01.com/posts/2021/bypass-waf-via-boundary-confusion/</link>
      <pubDate>Mon, 02 Aug 2021 02:28:33 +0800</pubDate>
      <guid>https://sym01.com/posts/2021/bypass-waf-via-boundary-confusion/</guid>
      <description>&lt;h2 id=&#34;0x00-前言&#34;&gt;0x00 前言&lt;/h2&gt;
&lt;p&gt;WAF（Web Application Firewall）是很常见的 Web 安全基础设施，许多云厂商、大厂、乙方安全公司均有相应的产品。然而，不得不承认，WAF 只能&lt;strong&gt;有限&lt;/strong&gt;提升安全防护能力，不能拦截一些稍微复杂的攻击。正常业务不应当过度依赖 WAF，况且 WAF 还存在误拦截正常业务流量的可能。&lt;/p&gt;
&lt;p&gt;目前已知的一些绕过 WAF 的手段包括但不限于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chunked encoding 绕过&lt;/li&gt;
&lt;li&gt;IBM037 等罕见编码绕过&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;多嘴一句：最早提出 IBM037 编码绕过 WAF 的应该是 Soroush Dalili 在 &lt;a href=&#34;https://www.slideshare.net/SoroushDalili/a-forgotten-http-invisibility-cloak&#34;&gt;SteelCon 2017 上的议题&lt;/a&gt;，然而国内众多相关文章，基本没有标记出处，很奇怪。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;笔者最近在分析 Go 语言的 HTTP 协议解析实现的时候，发现了一种能够利用 multipart boundary 绕过 WAF 的方法，在 Python 的一些 Web 框架上也适用，因而将其分享出来。&lt;/p&gt;
&lt;h2 id=&#34;0x01-绕过&#34;&gt;0x01 绕过&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;multipart/form-data&lt;/code&gt; 是一种非常常见的 HTML 表单编码方式，绝大部分的 Web 服务器、框架实现，均支持此编码。其编码后的请求大致如下所示，表单数据通过&lt;code&gt;boundary&lt;/code&gt;分割。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;POST&lt;/span&gt; /test &lt;span style=&#34;color:#66d9ef&#34;&gt;HTTP&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;example.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-Type&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;multipart/form-data; boundary=“boundary”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;—boundary
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-Disposition: form-data; name=“field1”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;value1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;—boundary
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Content-Disposition: form-data; name=“field2”; filename=“example.txt”
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;value2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;—boundary—
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;那么只要满足上述协议要求，服务端就可以正常获取到字段内容了，如下图所示。
&lt;picture&gt;
  &lt;source srcset=&#34;https://sym01.com/posts/2021/bypass-waf-via-boundary-confusion/980F2804-97C8-43C8-A106-1238BA2EF1DE_hu_797e72a1f53eb970.webp&#34; type=&#34;image/webp&#34; /&gt;
  &lt;img
    src=&#34;./980F2804-97C8-43C8-A106-1238BA2EF1DE.png&#34;
    
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;
  /&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
