1. 
      
      1. Web 安全 PHP 代碼審查之常規漏洞

        2018-08-21

        工欲善其事,必先利其器。我們做代碼審計之前選好工具也是十分必要的。下面我給大家介紹兩款代碼審計中比較好用的工具。

        一、審計工具介紹

        PHP 代碼審計系統— RIPS

        功能介紹

        RIPS 是一款基于 PHP 開發的針對 PHP 代碼安全審計的軟件。

        另外,它也是一款開源軟件,由國外安全研究員 Johannes Dahse 開發,程序只有 450KB,目前能下載到的新版是0.55。

        在寫這段文字之前筆者特意讀過它的源碼,它大的亮點在于調用了 PHP 內置解析器接口token_get_all,

        并且使用Parser做了語法分析,實現了跨文件的變量及函數追蹤,掃描結果中非常直觀地展示了漏洞形成及變量傳遞過程,誤報率非常低。

        RIPS 能夠發現 SQL 注入、XSS 跨站、文件包含、代碼執行、文件讀取等多種漏洞,支持多種樣式的代碼高亮。比較有意思的是,它還支持自動生成漏洞利用。

        二、代碼審計實戰

        通過剛才安裝的兩個審計工具運行后我們可以發現,會分析出很多隱藏的漏洞,那下面我們看看其中的SQL注入、XSS、CSRF產生的原因,通過原因來分析如何去審計代碼。

        SQL注入

        SQL注入漏洞一直是web系統漏洞中占比非常大的一種漏洞,下面我們來看看SQL注入的幾種方式。

        SQL 注入漏洞分類

        從利用方式角度可以分為兩種類型:常規注入、寬字節注入。

        常規注入方式,通常沒有任何過濾,直接把參數存放到了SQL語句當中

        開發者一般都會做一些過濾,比如使用addslashes(),但是過濾有時候也不一定好使。

        編碼注入方式

        寬字節注入,這個是怎么回事呢?

        在實際環境中程序員一般不會寫上面類似的代碼,一般都會用addslashes()等過濾函數對從web傳遞過來的參

        數進行過濾。不過有句話叫做,道高一尺魔高一丈,我們看看白帽子是怎么突破的。用PHP連接MySQL的時候

        ,當設置 character_set_client=gbk時候會導致一個編碼漏洞。我們知道addslashes() 會把參數 1’ 轉換成 1\’,

        而我們提交參數 1%df’ 時候會轉成 1縗’,那我們輸入 1%df’ or 1=1%23時候,會被轉換成 1縗’ or 1=1#’。

        簡單來說%df’會被過濾函數轉義為%df\’ ,%df\’ = %df%5c%27  在使用gbk編碼的時候會認為%df%5c是一個寬字節%df%5c%27=縗’,這樣就會產生注入。

        那如何防御這個寬字節呢?我希望大家開發網站盡量使用UTF8編碼格式,如果轉換麻煩,安全的方法就是

        使用PDO預處理。挖掘這種漏洞主要是檢查是否使用了gbk,搜索guanjianc character_set_client=gbk 和

        mysql_set_chatset('gbk') 。

        二次urldecode注入,這中方式也是因為使用了urldecode不當所引起的漏洞。

        我們剛才知道了 addslashes()函數可以防止注入,他會在(‘)、(“)、()前面加上反斜杠來轉義。

        那我們假設我們開啟了GPC,我們提交了一個參數,/test.php?uid=1%2527,因為參數中沒有單引號,所以第一次解碼會變成uid=1%27,%25解碼出來就是%,

        這時候程序里如果再去使用urldecode來解碼,就會把%27解碼成單引號(‘),終的結果就是uid=1’.

        我們現在知道了原有是因為urldecode引起的,我們可以通過編輯器的搜索urldecode和rawurldecode找到二次url漏洞。

        從漏洞類型區分可以分為三種類型:

        可顯

        攻擊者可以直接在當前界面內容中獲取想要獲得的內容。

        報錯

        數據庫查詢返回結果并沒有在頁面中顯示,但是應用程序將數據庫報錯信息打印到了頁面中。

        所以攻擊者可以構造數據庫報錯語句,從報錯信息中獲取想要獲得的內容,所以我建議在數據庫類中設置不拋出錯誤信息。

        盲注

        數據庫查詢結果無法從直觀頁面中獲取攻擊者通過使用數據庫邏輯或使數據庫庫執行延時等方法獲取想要獲

        得的內容。

        SQL 注入漏洞挖掘方法

        針對上面提到的利用漏洞方法,總結了以下的挖掘方法:

        參數接收位置,檢查是否有沒過濾直接使用  _POST、$_COOKIE 參數的。

        SQL語句檢查,搜索關鍵詞 select update insert 等SQL語句關鍵處,檢查SQL語句的參數是否可以被控制。

        寬字節注入,如果網站使用的 GBK 編碼情況下,搜索guanjianc character_set_client=gbk 和mysql_set_chatset('gbk') 就行。

        二次 urldecode 注入,少部分情況,gpc 可以通過編輯器的搜索 urldecode 和 rawurldecode 找到二次url

        漏洞。

        SQL 注入漏洞防范方法

        雖然SQL注入漏洞非常多,但是防范起來卻挺簡單的,下面介紹幾個過濾函數和類:

        XSS 又叫 CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往 Web 頁面里插入惡意 html 

        代碼,當用戶瀏覽該頁之時,嵌入其中 Web 里面的 html 代碼會被執行,從而達到惡意的特殊目的。

        XSS 屬于被動式的攻擊,因為其被動且不好利用,所以許多人常呼略其危害性。在 WEB2.0 時代,強調的是

        互動,使得用戶輸入信息的機會大增,在這個情況下,我們作為開發者,在開發的時候,要提高警惕。

        xss 漏洞分類

        反射型,危害小,一般

        反射型XSS原理:就是通過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特定的代碼參數會

        被HTML解析,執行,如此就可以獲取用戶的COOIKE,進而盜號登陸。比如hack甲構造好修改密碼的URL并把密

        碼修改成123,但是修改密碼只有在登陸方乙才能修改,乙在登陸的情況下點擊甲構造好的URL將直接在不知

        情的情況下修改密碼。

        特點是:非持久化,必須用戶點擊帶有特定參數的鏈接才能引起。

        存儲型,危害大,影響時間長

        存儲型XSS原理,假設你打開了一篇正常的文章頁面,下面有評論功能。這個時候你去評論了一下,在文本框

        中輸入了一些JavaScript代碼,提交之后,你刷新這個頁面后發現剛剛提交的代碼又被原封不動的返回來并且執行了。

        這個時候你會想,我要寫一段 JavaScript 代碼獲取 cookie 信息,然后通過ajax發送到自己的服務器去。構

        造好代碼后你把鏈接發給其他的朋友,或者網站的管理員,他們打開 JavaScript 代碼就執行了,你服務器

        就接收到了sessionid,你就可以拿到他的用戶權限了。


        上一條:開發一款app需要幾個階段

        下一條:沒有了

        1. 
          
            {关键词}