Web Hacking 101 中文版 十八、內存(二)

2. Python Hotshot 模塊

難度:高

URL:無

報告鏈接:http://bugs.python.org/issue24481

報告日期:2015.7.20

獎金:$500

描述:

像 PHP 一樣,Python 編程語言也是用 C 編寫的,它在之前提到過,自己管理內存。Python Hotshot 模塊是一個現(xiàn)有 profile 模塊的替代品,并且?guī)缀醵际怯?C 編寫,比現(xiàn)有的 profile 模塊產生一些更微小的性能影響。但是 2015 年 7 月,該模塊中發(fā)現(xiàn)了緩沖區(qū)溢出漏洞,和嘗試將字符串從一個內容位置復制到另一個的代碼有關。

本質上,這個漏洞的代碼叫做memcpy方法,它將內容從一個地方復制到另一個地址,接受要復制的字節(jié)數(shù)。像這樣:

memcpy(self->buffer + self->index, s, len);

這個方法接受 3 個參數(shù),str,str2n。str是目標,str2是要復制的來源,n是要復制的字節(jié)數(shù)。這里,它們對應self->buffer + self->index,slen

這里,漏洞實際上是,self->buffer總是固定長度的,但是s可以為任意長度。

因此,在執(zhí)行copy函數(shù)時(就像上面的 Apple 圖表那樣),memcpy函數(shù)忽視了目標區(qū)域的真實大小,因此造成了溢出。

重要結論

我們現(xiàn)在查看了兩個函數(shù)的例子,它們的不正確實現(xiàn)都收到了緩沖區(qū)溢出的影響,memcpystrcpy。如果我們知道某個站點或者應用依賴 C 或者 C++,我們就可以遍歷還語言的源代碼庫(使用類似grep的東西),來尋找不正確的實現(xiàn)。

關鍵是尋找這樣的實現(xiàn),它向二者之一傳遞固定長度的變量作為第三個函數(shù),對應被分配的數(shù)據(jù)長度,在數(shù)據(jù)復制時,它實際上是變量的長度。

但是,像之前提到的那樣,如果你剛剛起步,可能你需要放棄搜索這些類型的漏洞,等你更熟悉白帽子滲透時再回來。

3. Libcurl 越界讀取

難度:高

URL:無

報告鏈接:http://curl.haxx.se/docs/adv_20141105.html

報告日期:2014.11.5

獎金:$1000

描述:

Libcurl 是一個免費的客戶端 URL 庫,并且由 CURL 命令行工具用于轉送數(shù)據(jù)。libcurl 的curl_easy_duphandle()函數(shù)中發(fā)現(xiàn)了一個漏洞,它可以利用來發(fā)送本不應傳輸?shù)拿舾袛?shù)據(jù)。

在使用 libcurl 執(zhí)行數(shù)據(jù)傳輸時,我們可以使用一個選項,CURLOPT_COPYPOSTFIELDS,來為要發(fā)送給遠程服務器的數(shù)據(jù)指定內存區(qū)域。換句話說,為你的數(shù)據(jù)找一塊地方。區(qū)域大小使用單獨的選項來設置。

現(xiàn)在,我們沒必要非常技術化,內存區(qū)域和一個“句柄”相關(理解清楚“句柄”超出了本書范圍,所以沒必要了解),并且應用會復制句柄來創(chuàng)建數(shù)據(jù)的副本。這就是漏洞所在,復制的實現(xiàn)使用了strdup,而數(shù)據(jù)被假設擁有空字符作為字符串末尾。

這種情況下,數(shù)據(jù)可能沒有,或者在任意位置上擁有空字符。因此,復制的句柄可能過小,過大,或者使程序崩潰。此外,在復制之后,發(fā)送數(shù)據(jù)的函數(shù)并沒有考慮已經讀取和復制的數(shù)據(jù),所以它也越過了預期的內存地址來訪問和發(fā)送數(shù)據(jù)。

重要結論

這是一個非常復雜的漏洞的示例。雖然它對于這本書來說,過于技術化了,我將其包含來展示它與我們所學的東西的相似性。當我們將其分解時,這個漏洞也與 C 語言代碼實現(xiàn)中的一個錯誤相關,而 C 語言與內存管理和復制相關。同樣,如果你打算開始 C 程序的漏洞挖掘,要尋找數(shù)據(jù)從一塊區(qū)域復制到另一塊區(qū)域的地方。

4. PHP 內存截斷

難度:高

URL:無

報告鏈接:https://bugs.php.net/bug.php?id=69453

報告日期:2015.4.14

獎金:$500

描述:

phar_parse_tarfile函數(shù)并沒有考慮以空字符開始的文件名稱,空字符是值為 0 的字節(jié),即十六進制的0x00。

在該方法的執(zhí)行期間,當使用文件名稱時,數(shù)組會發(fā)生下溢(即嘗試訪問不存在的數(shù)據(jù),并超出了數(shù)組分配的內存)。

這是個重要漏洞,因為它向黑客提供了本該限制的內存的訪問權。

重要結論

在處理自己管理內存的應用時,特別是 C 和 C++,就像緩沖區(qū)溢出那樣,內存截斷是個古老但是仍舊常見的漏洞。如果你發(fā)現(xiàn),你正在處理基于 C 語言的 Web 應用(PHP 使用它編寫),要留意內存操作的方式。但是同樣,如果你剛剛起步,你可能值得花費更多時間來尋找簡單的注入漏洞,當你更熟練時,再回到內存截斷。

總結

雖然內存相關的漏洞能搞個大新聞,但他們也非常難以處理,并需要相當大量的技巧。這些類型的漏洞最好還是留著,除非你擁有底層編程語言的編程背景。

雖然現(xiàn)代的程序語言不太可能受其影響,由于它們的內存處理和垃圾收集策略,用 C 語言編寫的應用仍然易受影響。此外,當你處理用 C 語言編寫的現(xiàn)代語言時,事情可能需要一些技巧,就像我們在 PHPftp_genlist()和 Python Hotspot 模塊的示例中看到的那樣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容