<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 十八、內存 > 作者:Peter Yaworski > 譯者:[飛龍](https://github.com/) > 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) ## 描述 緩沖區溢出是一個場景,其中程序向緩沖區或內容區域寫入數據,寫入的數據比實際分配的區域要多。使用冰格來考慮的話,你可能擁有 12 個空間,但是只想要創建 10 個。在填充格子的時候,你添加了過多的水,填充了 11 個位置而不是 10 個。你就溢出了冰格的緩存區。 緩沖區溢出在最好情況下,會導致古怪的程序行為,最壞情況下,會產生嚴重的安全漏洞。這里的原因是,使用緩沖區移除,漏洞程序就開始使用非預期數據覆蓋安全數據,之后會調用它們。如果這些發生了,覆蓋的代碼會是和程序的預期完全不同的東西,這會產生錯誤。或者,惡意用戶能夠使用移除來寫入并執行惡意代碼。 這里是來自 Apple 的一個圖片: ![](https://img.kancloud.cn/76/5d/765d8f26cca152970f49854988dd255f_359x248.jpg) 這里第一個例子展示了可能的緩沖區溢出。`strcpy`接受字符串`Larger`,并將其寫入到內存,無論分配的可用空間(白色格子),以及將其寫入非預期的內容中(紅色格子)。 ### 越界讀取 除了越過分配的內容寫入數據之外,另一個漏洞時越過內容邊界讀取數據。這是一類緩沖區溢出,因為內容被越界讀取,這是緩存區不允許的。 越界讀取數據漏洞的一個著名的近期示例,是 OpenSSL Heartbleed 漏洞,在 2014 年 4 月發現。在發現的時候,大約 17%(500K)的互聯網安全服務器,由可信授權機構頒發證書,被認為存在此漏洞。 Heartbleed 可以利用來盜取服務器的私鑰,回話數據,密碼,以及其他。它通過向服務器發送“Heatbleed 請求”消息來執行,服務器會向請求者發送相同信息。消息包含長度參數。那些漏洞服務器會基于長度參數為消息分配內存,而不驗證消息的真實大小。 因此,Heartbleed 消息通過發送小型消息以及較大的長度參數來利用,存在漏洞的接受者會讀取額外數據,這超出了為消息分配的內存長度。這里是來自維基百科的圖片: ![](https://img.kancloud.cn/6d/31/6d31eaec25289b94a5918136925e5fd3_1021x1021.jpg) 雖然緩沖區溢出需要更詳細的分析,讀取越界和 Heartbleed 超出了本書的范圍。如果你對它們感興趣,這里是一些不錯的資源: + [Apple 的文檔](https://developer.apple.com/library/mac/documentation/Security/Conceptual/SecureCodingGuide/Articles/BufferOverflows.html) + [維基百科:緩沖區溢出詞條](https://en.wikipedia.org/wiki/Buffer_overflow) + [維基百科:NOP 墊](https://en.wikipedia.org/wiki/NOP_slide) + [OWASP:緩沖區溢出](https://www.owasp.org/index.php/Buffer_Overflow) + [`heartbleed.com`](http://heartbleed.com) ### 內存截斷 內存截斷是一種技巧,用于通過使代碼執行一些不常見或者非預期的行為,來發現漏洞。它的效果類似于緩沖區溢出,其中內容在不該暴露的時候暴露了。 一個例子是空字節注入。這發生在提供了空字節`%00`或者十六進制的`0x00`,并導致接收程序的非預期行為時。在 C/C++,或低級編程語言中,空字節表示字符串的末尾,或者字符串的終止符。這可以告訴程序來立即停止字符串的處理,空字節之后的字節就被忽略了。 當代碼依賴字符串長度時,它的影響力十分巨大。如果讀取了空字節,并停止了處理,長度為 10 的字符串就只剩 5 了。例如: ``` thisis%00mystring ``` 這個字符串的長度應該為 15,暗示如果字符串以空字節終止,它的長度為 6。這對于管理自己的內存的低級語言是有問題的。 現在,對于 Web 應用,當 Web 應用和庫、外部 API 以及其它用 C 寫成的東西交互的時候,這就有關系了。向 URL 傳入`%00`可能使攻擊者操作更廣泛服務器環境中的 Web 資源。尤其是當編程語言存在問題的時候,例如 PHP,它是使用 C 語言編寫的。 > OWASP 鏈接 > 查看 [OWASP 緩沖區溢出](https://www.owasp.org/index.php/Buffer_Overflows),[OWASP 為緩沖區覆蓋和溢出復查代碼](https://www.owasp.org/index.php/Reviewing_Code_for_Buffer_Overruns_and_Overflows),[OWASP 檢測緩沖區溢出](https://www.owasp.org/index.php/Testing_for_Buffer_Overflow),[OWASP 檢測堆溢出](https://www.owasp.org/index.php/Testing_for_Heap_Overflow),[OWASP 檢測棧溢出](https://www.owasp.org/index.php/Testing_for_Stack_Overflow),[OWASP 嵌入空字符](https://www.owasp.org/index.php/Embedding_Null_Code)。 ## 示例 ### 1\. PHP`ftp_genlist()` 難度:高 URL:無 報告鏈接:`https://bugs.php.net/bug.php?id=69545` 報告日期:2015.5.12 獎金:$500 描述: PHP 編程語言使用 C 語言寫成,C 語言自己管理內存。像上面描述的那樣,緩沖區溢出允許惡意用戶寫入應該為不可訪問的內存,并可能執行遠程代碼。 這里,FTP 擴展 的`ftp_genlist()`函數允許溢出,或者發送多于 ~4293MB 的數據,它們會被寫入到臨時文件中。 這使得分配的緩沖區太小,而不能存放寫入臨時文件的數據,在將文件內容加載回內存時,這會造成堆溢出。 > 重要結論 > 緩沖區溢出是非常古老,知名的漏洞,但是在處理自己管理內存的應用時,還是很普遍的,特別是 C 和 C++。如果你發現,你正在處理基于 C 語言(PHP 用它編寫)的 Web 應用,緩沖區溢出是一個明顯的可能性。但是,如果你剛起步,可能你值得花費更多時間,來尋找和漏洞相關的簡單注入,在更有經驗時,再返回到緩沖區溢出。 ### 2\. Python Hotshot 模塊 難度:高 URL:無 報告鏈接:`http://bugs.python.org/issue24481` 報告日期:2015.7.20 獎金:$500 描述: 像 PHP 一樣,Python 編程語言也是用 C 編寫的,它在之前提到過,自己管理內存。Python Hotshot 模塊是一個現有 profile 模塊的替代品,并且幾乎都是用 C 編寫,比現有的 profile 模塊產生一些更微小的性能影響。但是 2015 年 7 月,該模塊中發現了緩沖區溢出漏洞,和嘗試將字符串從一個內容位置復制到另一個的代碼有關。 本質上,這個漏洞的代碼叫做`memcpy`方法,它將內容從一個地方復制到另一個地址,接受要復制的字節數。像這樣: ```c memcpy(self->buffer + self->index, s, len); ``` 這個方法接受 3 個參數,`str`,`str2`和`n`。`str`是目標,`str2`是要復制的來源,`n`是要復制的字節數。這里,它們對應`self->buffer + self->index`,`s`和`len`。 這里,漏洞實際上是,`self->buffer`總是固定長度的,但是`s`可以為任意長度。 因此,在執行`copy`函數時(就像上面的 Apple 圖表那樣),`memcpy`函數忽視了目標區域的真實大小,因此造成了溢出。 > 重要結論 > 我們現在查看了兩個函數的例子,它們的不正確實現都收到了緩沖區溢出的影響,`memcpy`和`strcpy`。如果我們知道某個站點或者應用依賴 C 或者 C++,我們就可以遍歷還語言的源代碼庫(使用類似`grep`的東西),來尋找不正確的實現。 > 關鍵是尋找這樣的實現,它向二者之一傳遞固定長度的變量作為第三個函數,對應被分配的數據長度,在數據復制時,它實際上是變量的長度。 > 但是,像之前提到的那樣,如果你剛剛起步,可能你需要放棄搜索這些類型的漏洞,等你更熟悉白帽子滲透時再回來。 ### 3\. Libcurl 越界讀取 難度:高 URL:無 報告鏈接:`http://curl.haxx.se/docs/adv_20141105.html` 報告日期:2014.11.5 獎金:$1000 描述: Libcurl 是一個免費的客戶端 URL 庫,并且由 CURL 命令行工具用于轉送數據。libcurl 的`curl_easy_duphandle() `函數中發現了一個漏洞,它可以利用來發送本不應傳輸的敏感數據。 在使用 libcurl 執行數據傳輸時,我們可以使用一個選項,`CURLOPT_COPYPOSTFIELDS`,來為要發送給遠程服務器的數據指定內存區域。換句話說,為你的數據找一塊地方。區域大小使用單獨的選項來設置。 現在,我們沒必要非常技術化,內存區域和一個“句柄”相關(理解清楚“句柄”超出了本書范圍,所以沒必要了解),并且應用會復制句柄來創建數據的副本。這就是漏洞所在,復制的實現使用了`strdup`,而數據被假設擁有空字符作為字符串末尾。 這種情況下,數據可能沒有,或者在任意位置上擁有空字符。因此,復制的句柄可能過小,過大,或者使程序崩潰。此外,在復制之后,發送數據的函數并沒有考慮已經讀取和復制的數據,所以它也越過了預期的內存地址來訪問和發送數據。 > 重要結論 > 這是一個非常復雜的漏洞的示例。雖然它對于這本書來說,過于技術化了,我將其包含來展示它與我們所學的東西的相似性。當我們將其分解時,這個漏洞也與 C 語言代碼實現中的一個錯誤相關,而 C 語言與內存管理和復制相關。同樣,如果你打算開始 C 程序的漏洞挖掘,要尋找數據從一塊區域復制到另一塊區域的地方。 ### 4\. PHP 內存截斷 難度:高 URL:無 報告鏈接:`https://bugs.php.net/bug.php?id=69453` 報告日期:2015.4.14 獎金:$500 描述: `phar_parse_tarfile`函數并沒有考慮以空字符開始的文件名稱,空字符是值為 0 的字節,即十六進制的`0x00`。 在該方法的執行期間,當使用文件名稱時,數組會發生下溢(即嘗試訪問不存在的數據,并超出了數組分配的內存)。 這是個重要漏洞,因為它向黑客提供了本該限制的內存的訪問權。 > 重要結論 在處理自己管理內存的應用時,特別是 C 和 C++,就像緩沖區溢出那樣,內存截斷是個古老但是仍舊常見的漏洞。如果你發現,你正在處理基于 C 語言的 Web 應用(PHP 使用它編寫),要留意內存操作的方式。但是同樣,如果你剛剛起步,你可能值得花費更多時間來尋找簡單的注入漏洞,當你更熟練時,再回到內存截斷。 ## 總結 雖然內存相關的漏洞能搞個大新聞,但他們也非常難以處理,并需要相當大量的技巧。這些類型的漏洞最好還是留著,除非你擁有底層編程語言的編程背景。 雖然現代的程序語言不太可能受其影響,由于它們的內存處理和垃圾收集策略,用 C 語言編寫的應用仍然易受影響。此外,當你處理用 C 語言編寫的現代語言時,事情可能需要一些技巧,就像我們在 PHP`ftp_genlist()`和 Python Hotspot 模塊的示例中看到的那樣。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看