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

2018-02-28 17:08:46 ortotra

前言

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

一、審計工具介紹

PHP 代碼審計系統— RIPS

功能介紹

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

另外,它也是(shì)一款開源軟件,由國外安全研究員(yuán) Johannes Dahse 開發,程序隻有 450KB,目前能下(xià)載到的最新版是(shì)0.55。

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

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

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


下(xià)載地址:https://jaist.dl.sourceforge.net/project/rips-scanner/rips-0.55.zip.

解壓到任意一個PHP的運行目錄

在浏覽器輸入對應網址,可以通過下(xià)圖看到有一個path 在裏面填寫你要分析的項目文件路徑,點擊 scan.

界面截圖


seay 源代碼審計系統

功能介紹

這些是(shì)seay 第一個版本的部分功能,現(xiàn)在最新版本是(shì)2.1。

傻瓜化的自動審計 。

支持php代碼調試 。

函數/變量定位 。

生成審計報告。

自定義審計規則 。

mysql數據庫管理 。

黑盒敏感信息洩露一鍵審計 。

支持正則匹配調試 。

編輯保存文件 。

POST數據包提交 。

安裝方法

安裝環境需要 .NET2.0以上版本環境才能運行,下(xià)載安裝包之後點擊下(xià)一步就安裝好了,非常的簡便。

安裝包下(xià)載地址:http://enkj.jb51.net:81/201408/tools/Seayydmsjxt(jb51.net).rar

操作界面的截圖


二、代碼審計實戰

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

SQL注入

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

SQL 注入漏洞分類

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

常規注入方式,通常沒有任何過濾,直接把參數存放(fàng)到了SQL語句當中,如下(xià)圖。

非常容易發現(xiàn),現(xiàn)在開發者一般都會做一些過濾,比如使用addslashes(),但(dàn)是(shì)過濾有時候也不一定好使。

編碼注入方式

寬字節注入,這個是(shì)怎麽回事呢?

在實際環境中程序員(yuán)一般不會寫上面類似的代碼,一般都會用addslashes()等過濾函數對從web傳遞過來的參數進行過濾。不過有句話(huà)叫做,道高一尺魔高一丈,我們看看白帽子是(shì)怎麽突破的。用PHP連接MySQL的時候,當設置 character_set_client=gbk時候會導緻一個編碼漏洞。我們知(zhī)道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是(shì)一個寬字節%df%5c%27=縗’,這樣就會産生注入。

那如何防禦這個寬字節呢?我希望大家開發網站盡量使用UTF8編碼格式,如果轉換麻煩,最安全的方法就是(shì)使用PDO預處理。挖掘這種漏洞主要是(shì)檢查是(shì)否使用了gbk,搜索guanjianc character_set_client=gbk 和mysql_set_chatset('gbk') 。

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

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

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

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

我們現(xiàn)在知(zhī)道了原有是(shì)因爲urldecode引起的,我們可以通過編輯器的搜索urldecode和rawurldecode找到二次url漏洞。

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

可顯

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

報錯

數據庫查詢返回結果并沒有在頁面中顯示,但(dàn)是(shì)應用程序将數據庫報錯信息打印到了頁面中。

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

盲注

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

SQL 注入漏洞挖掘方法

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

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

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

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

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

SQL 注入漏洞防範方法

雖然SQL注入漏洞非常多,但(dàn)是(shì)防範起來卻挺簡單的,下(xià)面介紹幾個過濾函數和類:

gpc/rutime 魔術引号

過濾函數和類

addslashes

mysql_real_escape_string

intval

PDO 預處理

XSS跨站

前言

XSS 又(yòu)叫 CSS (Cross Site Script) ,跨站腳本攻擊。它指的是(shì)惡意攻擊者往 Web 頁面裏插入惡意 html 代碼,當用戶浏覽該頁之時,嵌入其中 Web 裏面的 html 代碼會被執行,從而達到惡意的特殊目的。

XSS 屬于被動式的攻擊,因爲其被動且不好利用,所以許多人常呼略其危害性。在 WEB2.0 時代,強調的是(shì)互動,使得用戶輸入信息的機會大增,在這個情況下(xià),我們作爲開發者,在開發的時候,要提高警惕。

xss 漏洞分類

反射型,危害小,一般

反射型XSS原理:就是(shì)通過給别人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特定的代碼參數會被HTML解析,執行,如此就可以獲取用戶的COOIKE,進而盜号登陸。比如hack甲構造好修改密碼的URL并把密碼修改成123,但(dàn)是(shì)修改密碼隻有在登陸方乙才能修改,乙在登陸的情況下(xià)點擊甲構造好的URL将直接在不知(zhī)情的情況下(xià)修改密碼。

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

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

存儲型XSS原理,假設你打開了一篇正常的文章頁面,下(xià)面有評論功能。這個時候你去(qù)評論了一下(xià),在文本框中輸入了一些JavaScript代碼,提交之後,你刷新這個頁面後發現(xiàn)剛剛提交的代碼又(yòu)被原封不動的返回來并且執行了。

這個時候你會想,我要寫一段 JavaScript 代碼獲取 cookie 信息,然後通過ajax發送到自己的服務器去(qù)。構造好代碼後你把鏈接發給其他的朋友(yǒu),或者網站的管理員(yuán),他們打開 JavaScript 代碼就執行了,你服務器就接收到了sessionid,你就可以拿到他的用戶權限了。

dom型 XSS 是(shì)因爲 JavaScript 執行了dom 操作,所造成的 XSS 漏洞,具體如下(xià)圖。可以看到雖然經過 html 轉義了,但(dàn)是(shì)這塊代碼在返回到 html 中,又(yòu)被 JavaScript 作爲 dom 元素操作。那當我輸入?name=<img src="1" onerror="alert(1)"/> 的時候依然會存在 XSS 漏洞。


xss 漏洞挖掘方法

根據上面的一些特點,可以總結出幾個分析出幾個挖掘方法:

數據接收位置,檢查 _POST、$_COOKIE是(shì)否經過轉義。

常見(jiàn)的反射型XSS搜索這種類似位置發現(xiàn)次數較多。

而存儲型在文章,評論出現(xiàn)比較多。

XSS 漏洞防範方法

轉義html實體,有兩種方式:在入口和出口,我建議(yì)是(shì)在入口處轉義,防止出口位置取出來的時候忘記轉義,如果已經在入口轉義了,出口位置就不用再次轉義。

在富文本編輯器中,經常會用到一些元素的屬性,比如上圖的onerror,那我們還需對元素的屬性建立黑白名單。

httpOnly 即使存在xss漏洞,可以把危害大大降低。

CSRF漏洞

CSRF 漏洞介紹

CSRF(Cross-site request forgery)跨站請求僞造,通常縮寫爲CSRF或者XSRF,是(shì)一種對網站的惡意利用。聽(tīng)起來像跨站腳本(XSS),但(dàn)它與XSS非常不同,XSS利用站點内的信任用戶。

而 CSRF 則通過僞裝來自受信任用戶的請求來利用受信任的網站。與 XSS 攻擊相(xiàng)比,CSRF 攻擊往往不大流行(因此對其進行防範的資源也相(xiàng)當稀少)和難以防範,所以被認爲比XSS更具危險性。

csrf 主要用來做越權操作,而且 csrf 一直沒有被關注起來,所以很多程序現(xiàn)在也沒有相(xiàng)關的防範措施。

CSRF 案例

我們來看下(xià)面的一段代碼,這個表單當被訪問到的時候,用戶就退出了登錄。假設有一個轉賬的表單,隻需要填寫對方的用戶名,和金額就可以,那如果我提前把 URL 構造好,發給受害者,當點擊後,錢就被轉走了。

或者我把這個 URL 放(fàng)到我的網頁中,通過<img src="我構造的URL" ,當其他人打開我的網址後,就中招了。

CSRF漏洞挖掘方法

通過上面的描述,我們知(zhī)道了漏洞的原有,那我們審計的時候可以檢查處理表單有沒有以下(xià)判斷。

是(shì)否有驗證 token。

是(shì)否有圖片驗證碼。

是(shì)否有 refe 信息。

如果三個判斷都沒有,那麽就存在了 CSRF 漏洞,CSRF 不僅限于 GET 請求, POST 請求同樣存在。

CSRF 漏洞防範方法

圖片驗證碼,這個想必大家都知(zhī)道,但(dàn)是(shì)用戶體驗并不好,我們可以看下(xià)面的一些處理方法。

token驗證。

token驗證方法如下(xià),每次訪問表單頁的時候,生成一個不可預測的token存放(fàng)在服務器session中,另外一份放(fàng)頁面中,提交表單的時候需要把這個token帶過去(qù),接收表單的時候先驗證一下(xià)token是(shì)否合法。

Refeer信息驗證

大多數情況下(xià),浏覽器訪問一個地址,其中header頭裏面會包含Referer信息,裏面存儲了請求是(shì)從哪裏發起的。

如果HTTP頭裏包含有Referer的時候,我們可以區分請求是(shì)同域下(xià)還是(shì)跨站發起的,所以我們也可以通過判斷有問題的請求是(shì)否是(shì)同域下(xià)發起的來防禦 CSRF 攻擊。

Referer 驗證的時候有幾點需要注意,如果判斷Referer是(shì)否包含 *.XXX.com,如果有子域名有漏洞,會存在繞過的可能。

如果判斷的條件的是(shì)Referer中是(shì)否包含字符 ‘xxx.com’  那攻擊者在他目錄中建立一個 xxx.com 文件夾同樣存在繞過的可能。如果可以最合适的判斷是(shì),直接判斷是(shì)否等于當前域名。


三、常規漏洞的防範方法


taint PHP 安全擴展


功能介紹

Taint 可以用來檢測隐藏的 XSS code, SQL 注入, Shell注入等漏洞,并且這些漏洞如果要用靜态分析工具去(qù)排查, 将會非常困難, 我們來看下(xià)面這張圖:

安裝方法

下(xià)載 taint:  http://pecl.php.net/package/taint

配置

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

更加詳細的可以參考:http://www.cnblogs.com/linzhenjie/p/5485474.html

應用場景

開發團隊要求每個人都做到非常的安全比較難,但(dàn)是(shì)把taint安裝在開發環境,特别适合,一看到 warning 信息一般都回去(qù)改。

ngx_lua_waf

功能介紹

防止 sql 注入,本地包含,部分溢出,fuzzing 測試,xss,SSRF 等 web攻擊。

防止 svn /備份之類文件洩漏。

防止 ApacheBench 之類壓力測試工具的攻擊。

屏蔽常見(jiàn)的掃描黑客工具,掃描器。

屏蔽異常的網絡請求。

屏蔽圖片附件類目錄 php 執行權限。

防止 webshell 上傳。

安裝方法

安裝依賴: luajit 、ngx_devel_kit、nginx_lua_module

安裝nginx、ngx_lua_waf

在nginx.conf裏的 http 添加配置

詳細安裝文檔