天下彩蓝月亮免费资枓大全:Web 安全 PHP 代碼審查之常規漏洞

2018-02-28 17:08:46 ortotra 5

陕陕西福彩快乐十分开奖结果 www.zocum.com 前言

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

一、審計工具介紹

PHP 代碼審計系統— RIPS

功能介紹

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

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

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

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

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


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

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

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

界面截圖


seay 源代碼審計系統

功能介紹

這些是seay 第一個版本的部分功能,現在最新版本是2.1。

傻瓜化的自動審計 。

支持php代碼調試 。

函數/變量定位 。

生成審計報告。

自定義審計規則 。

mysql數據庫管理 。

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

支持正則匹配調試 。

編輯保存文件 。

POST數據包提交 。

安裝方法

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

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

操作界面的截圖


二、代碼審計實戰

通過剛才安裝的兩個審計工具運行后我們可以發現,會分析出很多隱藏的漏洞,那下面我們看看其中的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注入漏洞非常多,但是防范起來卻挺簡單的,下面介紹幾個過濾函數和類:

gpc/rutime 魔術引號

過濾函數和類

addslashes

mysql_real_escape_string

intval

PDO 預處理

XSS跨站

前言

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,你就可以拿到他的用戶權限了。

dom型 XSS 是因為 JavaScript 執行了dom 操作,所造成的 XSS 漏洞,具體如下圖??梢鑰吹剿淙瘓?html 轉義了,但是這塊代碼在返回到 html 中,又被 JavaScript 作為 dom 元素操作。那當我輸入?name=<img src="1" onerror="alert(1)"/> 的時候依然會存在 XSS 漏洞。


xss 漏洞挖掘方法

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

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

常見的反射型XSS搜索這種類似位置發現次數較多。

而存儲型在文章,評論出現比較多。

XSS 漏洞防范方法

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

在富文本編輯器中,經?;嵊玫揭恍┰氐氖糶?,比如上圖的onerror,那我們還需對元素的屬性建立黑白名單。

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

CSRF漏洞

CSRF 漏洞介紹

CSRF(Cross-site request forgery)跨站請求偽造,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶。

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

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

CSRF 案例

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

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

CSRF漏洞挖掘方法

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

是否有驗證 token。

是否有圖片驗證碼。

是否有 refe 信息。

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

CSRF 漏洞防范方法

圖片驗證碼,這個想必大家都知道,但是用戶體驗并不好,我們可以看下面的一些處理方法。

token驗證。

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

Refeer信息驗證

大多數情況下,瀏覽器訪問一個地址,其中header頭里面會包含Referer信息,里面存儲了請求是從哪里發起的。

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

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

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


三、常規漏洞的防范方法


taint PHP 安全擴展


功能介紹

Taint 可以用來檢測隱藏的 XSS code, SQL 注入, Shell注入等漏洞,并且這些漏洞如果要用靜態分析工具去排查, 將會非常困難, 我們來看下面這張圖:

安裝方法

下載 taint:  //pecl.php.net/package/taint

配置

/usr/local/php/bin/phpize

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

make && make install

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

應用場景

開發團隊要求每個人都做到非常的安全比較難,但是把taint安裝在開發環境,特別適合,一看到 warning 信息一般都回去改。

ngx_lua_waf

功能介紹

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

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

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

屏蔽常見的掃描黑客工具,掃描器。

屏蔽異常的網絡請求。

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

防止 webshell 上傳。

安裝方法

安裝依賴: luajit 、ngx_devel_kit、nginx_lua_module

安裝nginx、ngx_lua_waf

在nginx.conf里的 http 添加配置

詳細安裝文檔