GitChat 做者:湯青松
原文:PHP 開發者如何作代碼審查?
關注微信公衆號:「GitChat 技術雜談」 一本正經的講技術php
【不要錯過文末彩蛋】html
工欲善其事,必先利其器。咱們作代碼審計以前選好工具也是十分必要的。下面我給你們介紹兩款代碼審計中比較好用的工具。mysql
功能介紹nginx
RIPS是一款基於PHP開發的針對PHP代碼安全審計的軟件。git
另外,它也是一款開源軟件,由國外安全研究員Johannes Dahse開發,程序只有450KB,目前能下載到的最新版是0.55。程序員
在寫這段文字以前筆者特地讀過它的源碼,它最大的亮點在於調用了PHP內置解析器接口token_get_all
,web
而且使用Parser作了語法分析,實現了跨文件的變量及函數追蹤,掃描結果中很是直觀地展現了漏洞造成及變量傳遞過程,誤報率很是低。ajax
RIPS可以發現SQL注入、XSS跨站、文件包含、代碼執行、文件讀取等多種漏洞,支持多種樣式的代碼高亮。比較有意思的是,它還支持自動生成漏洞利用。 sql
安裝方法shell
下載地址:https://jaist.dl.sourceforge.....
解壓到任意一個PHP的運行目錄
在瀏覽器輸入對應網址,能夠經過下圖看到有一個path 在裏面填寫你要分析的項目文件路徑,點擊 scan.
界面截圖
功能介紹
這些是seay 第一個版本的部分功能,如今最新版本是2.1。
POST數據包提交 。
安裝方法
安裝環境須要 .NET2.0以上版本環境才能運行,下載安裝包以後點擊下一步就安裝好了,很是的簡便。
安裝包下載地址:http://enkj.jb51.net:81/20140...
操做界面的截圖
前言
經過剛纔安裝的兩個審計工具運行後咱們能夠發現,會分析出不少隱藏的漏洞,那下面咱們看看其中的SQL注入、XSS、CSRF產生的緣由,經過緣由來分析如何去審計代碼。
前言
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 注入漏洞挖掘方法
針對上面提到的利用漏洞方法,總結了如下的挖掘方法:
select update insert
等SQL語句關鍵處,檢查SQL語句的參數是否能夠被控制。guanjianc character_set_client=gbk
和mysql_set_chatset('gbk')
就行。SQL 注入漏洞防範方法
雖然SQL注入漏洞很是多,可是防範起來卻挺簡單的,下面介紹幾個過濾函數和類:
過濾函數和類
前言
XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意的特殊目的。
XSS屬於被動式的攻擊,由於其被動且很差利用,因此許多人常呼略其危害性。在WEB2.0時代,強調的是互動,使得用戶輸入信息的機會大增,在這個狀況下,咱們做爲開發者,在開發的時候,要提升警戒。
反射型XSS原理:就是經過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特定的代碼參數會被HTML解析,執行,如此就能夠獲取用戶的COOIKE,進而盜號登錄。好比hack甲構造好修改密碼的URL並把密碼修改爲123,可是修改密碼只有在登錄方乙才能修改,乙在登錄的狀況下點擊甲構造好的URL將直接在不知情的狀況下修改密碼。
特色是:非持久化,必須用戶點擊帶有特定參數的連接才能引發。
存儲型XSS原理,假設你打開了一篇正常的文章頁面,下面有評論功能。這個時候你去評論了一下,在文本框中輸入了一些JavaScript代碼,提交以後,你刷新這個頁面後發現剛剛提交的代碼又被原封不動的返回來而且執行了。
這個時候你會想,我要寫一段JavaScript代碼獲取cookie信息,而後經過ajax發送到本身的服務器去。構造好代碼後你把連接發給其餘的朋友,或者網站的管理員,他們打開JavaScript代碼就執行了,你服務器就接收到了sessionid,你就能夠拿到他的用戶權限了。
3.dom型,特殊的一種
dom型xss是由於JavaScript執行了dom操做,所形成的xss漏洞,具體以下圖。能夠看到雖然通過html轉義了,可是這塊代碼在返回到html中,又被JavaScript做爲dom元素操做。那當我輸入?name=<img src=1 onerror=alert(1)>
的時候依然會存在XSS漏洞。
xss 漏洞挖掘方法
根據上面的一些特色,能夠總結出幾個分析出幾個挖掘方法:
而存儲型在文章,評論出現比較多。
XSS 漏洞防範方法
CSRF 漏洞介紹
CSRF(Cross-site request forgery)跨站請求僞造,一般縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。聽起來像跨站腳本(XSS),但它與XSS很是不一樣,XSS利用站點內的信任用戶。
而CSRF則經過假裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊每每不大流行(所以對其進行防範的資源也至關稀少)和難以防範,因此被認爲比XSS更具危險性。
csrf主要用來作越權操做,並且csrf一直沒有被關注起來,因此不少程序如今也沒有相關的防範措施。
CSRF 案例
咱們來看下面的一段代碼,這個表單當被訪問到的時候,用戶就退出了登陸。假設有一個轉帳的表單,只須要填寫對方的用戶名,和金額就能夠,那若是我提早把URL構造好,發給受害者,當點擊後,錢就被轉走了。或者我把這個URL放到個人網頁中,經過<img src="我構造的URL"
,當其餘人打開個人網址後,就中招了。
CSRF漏洞挖掘方法
經過上面的描述,咱們知道了漏洞的原有,那咱們審計的時候能夠檢查處理表單有沒有如下判斷。
若是三個判斷都沒有,那麼就存在了CSRF漏洞,CSRF不只限於GET請求,POST請求一樣存在。
CSRF 漏洞防範方法
圖片驗證碼,這個想必你們都知道,可是用戶體驗並很差,咱們能夠看下面的一些處理方法。
token驗證方法以下,每次訪問表單頁的時候,生成一個不可預測的token存放在服務器session中,另一份放頁面中,提交表單的時候須要把這個token帶過去,接收表單的時候先驗證一下token是否合法。
大多數狀況下,瀏覽器訪問一個地址,其中header頭裏面會包含Referer信息,裏面存儲了請求是從哪裏發起的。
若是HTTP頭裏包含有Referer的時候,咱們能夠區分請求是同域下仍是跨站發起的,因此咱們也能夠經過判斷有問題的請求是不是同域下發起的來防護CSRF攻擊。
Referer驗證的時候有幾點須要注意,若是判斷Referer是否包含*.XXX.com,若是有子域名有漏洞,會存在繞過的可能。
若是判斷的條件的是Referer中是否包含字符‘xxx.com’ 那攻擊者在他目錄中創建一個xxx.com文件夾一樣存在繞過的可能。若是能夠最合適的判斷是,直接判斷是否等於當前域名。
功能介紹
Taint 能夠用來檢測隱藏的XSS code, SQL注入, Shell注入等漏洞,而且這些漏洞若是要用靜態分析工具去排查, 將會很是困難, 咱們來看下面這張圖:
安裝方法
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
應用場景
開發團隊要求每一個人都作到很是的安全比較難,可是把taint安裝在開發環境,特別適合,一看到warning信息通常都回去改。
功能介紹
安裝方法
安裝依賴: luajit
、ngx_devel_kit
、nginx_lua_module
安裝nginx
、ngx_lua_waf
在nginx.conf
裏的http添加配置
詳細安裝文檔
效果圖
此次分享的內容代碼審計處理常規漏洞部分挑選了三種類型,還有其餘的一些一次也講不完。代碼身材除了像剛纔的的參數檢查以外,還有邏輯性漏洞審查,下次若是有時間會再作一次邏輯漏洞審計分享。
重磅 Chat 分享:
《高效學習,快速變現:不走彎路的五大學習策略》
分享人:
一名會在 B 站直播寫代碼,會玩雜耍球、彈 Ukulele、極限健身、跑步、寫段子、畫畫、翻譯、寫做、演講、培訓的程序員。喜歡用編程實現本身的想法,在 Android 市場上賺過錢,有屢次創業經歷。擅長學習,習慣養成,時間管理。身體力行地影響他人作出積極的改變!目前就任於 ThoughtWorks,致力於傳播快樂高效的編程理念。業餘創立軟件匠藝社區 CodingStyle.cn,組織超過30場技術活動。Chat簡介:
說到學習呀,真是頭大喲:碎片化,沒有較長的連續時間來學習難專一,捧起書,手機卻在召喚:來呀,快活呀~ 反正有,大把時光~作不到,看了不少書,生活中卻作不到然並卵,學了方法和工具,找不到使用場景效率低,學習速度跟不上知識產生的速度記不牢,學習速度趕不上遺忘速度在這個知識氾濫、跨界競爭的年代,學習能力纔是核心競爭力。你想一想,過去一週,有沒有哪一件工做是不須要學習就能完成的?儘管如此重要,大部分人卻沒研究過學習這件事,覺得上下班路上打開「獲得」聽本書,就是碎片時間終身學習者了。我是程序員,諮詢師,培訓師,這幾個角色都要求我必須學得又快又好。本場 Chat 將分析學習的「趨勢,原則,策略」,幫你站在更高的視角看待學習,從「內容,動機,交互,收益,資源」五方面制定策略,解決學習痛點,助你成爲高效學習者!
想要免費參與本場 Chat ?很簡單,「GitChat技術雜談」公衆號後臺回覆「高效學習」