摘要:我們做代碼審計(jì)之前選好工具也是十分必要的。一審計(jì)工具介紹代碼審計(jì)系統(tǒng)功能介紹是一款基于開發(fā)的針對(duì)代碼安全審計(jì)的軟件。自定義審計(jì)規(guī)則。黑盒敏感信息泄露一鍵審計(jì)。挖掘這種漏洞主要是檢查是否使用了,搜索和。
GitChat 作者:湯青松
原文:PHP 開發(fā)者如何做代碼審查?
關(guān)注微信公眾號(hào):「GitChat 技術(shù)雜談」 一本正經(jīng)的講技術(shù)
【不要錯(cuò)過文末彩蛋】
前言工欲善其事,必先利其器。我們做代碼審計(jì)之前選好工具也是十分必要的。下面我給大家介紹兩款代碼審計(jì)中比較好用的工具。
一、審計(jì)工具介紹 PHP 代碼審計(jì)系統(tǒng)— RIPS功能介紹
RIPS是一款基于PHP開發(fā)的針對(duì)PHP代碼安全審計(jì)的軟件。
另外,它也是一款開源軟件,由國外安全研究員Johannes Dahse開發(fā),程序只有450KB,目前能下載到的最新版是0.55。
在寫這段文字之前筆者特意讀過它的源碼,它最大的亮點(diǎn)在于調(diào)用了PHP內(nèi)置解析器接口token_get_all,
并且使用Parser做了語法分析,實(shí)現(xiàn)了跨文件的變量及函數(shù)追蹤,掃描結(jié)果中非常直觀地展示了漏洞形成及變量傳遞過程,誤報(bào)率非常低。
RIPS能夠發(fā)現(xiàn)SQL注入、XSS跨站、文件包含、代碼執(zhí)行、文件讀取等多種漏洞,支持多種樣式的代碼高亮。比較有意思的是,它還支持自動(dòng)生成漏洞利用。
安裝方法
下載地址:https://jaist.dl.sourceforge.....
解壓到任意一個(gè)PHP的運(yùn)行目錄
在瀏覽器輸入對(duì)應(yīng)網(wǎng)址,可以通過下圖看到有一個(gè)path 在里面填寫你要分析的項(xiàng)目文件路徑,點(diǎn)擊 scan.
界面截圖
seay 源代碼審計(jì)系統(tǒng)功能介紹
這些是seay 第一個(gè)版本的部分功能,現(xiàn)在最新版本是2.1。
傻瓜化的自動(dòng)審計(jì) 。
支持php代碼調(diào)試 。
函數(shù)/變量定位 。
生成審計(jì)報(bào)告。
自定義審計(jì)規(guī)則 。
mysql數(shù)據(jù)庫管理 。
黑盒敏感信息泄露一鍵審計(jì) 。
支持正則匹配調(diào)試 。
編輯保存文件 。
POST數(shù)據(jù)包提交 。
安裝方法
安裝環(huán)境需要 .NET2.0以上版本環(huán)境才能運(yùn)行,下載安裝包之后點(diǎn)擊下一步就安裝好了,非常的簡(jiǎn)便。
安裝包下載地址:http://enkj.jb51.net:81/20140...
操作界面的截圖
二、代碼審計(jì)實(shí)戰(zhàn)前言
通過剛才安裝的兩個(gè)審計(jì)工具運(yùn)行后我們可以發(fā)現(xiàn),會(huì)分析出很多隱藏的漏洞,那下面我們看看其中的SQL注入、XSS、CSRF產(chǎn)生的原因,通過原因來分析如何去審計(jì)代碼。
SQL注入前言
SQL注入漏洞一直是web系統(tǒng)漏洞中占比非常大的一種漏洞,下面我們來看看SQL注入的幾種方式。
SQL 注入漏洞分類
從利用方式角度可以分為兩種類型:常規(guī)注入、寬字節(jié)注入。
常規(guī)注入方式,通常沒有任何過濾,直接把參數(shù)存放到了SQL語句當(dāng)中,如下圖。
非常容易發(fā)現(xiàn),現(xiàn)在開發(fā)者一般都會(huì)做一些過濾,比如使用addslashes(),但是過濾有時(shí)候也不一定好使。
編碼注入方式
寬字節(jié)注入,這個(gè)是怎么回事呢?
在實(shí)際環(huán)境中程序員一般不會(huì)寫上面類似的代碼,一般都會(huì)用addslashes()等過濾函數(shù)對(duì)從web傳遞過來的參數(shù)進(jìn)行過濾。不過有句話叫做,道高一尺魔高一丈,我們看看白帽子是怎么突破的。用PHP連接MySQL的時(shí)候,當(dāng)設(shè)置 character_set_client=gbk時(shí)候會(huì)導(dǎo)致一個(gè)編碼漏洞。我們知道addslashes() 會(huì)把參數(shù) 1" 轉(zhuǎn)換成 1",而我們提交參數(shù) 1%df" 時(shí)候會(huì)轉(zhuǎn)成 1縗’,那我們輸入 1%df" or 1=1%23時(shí)候,會(huì)被轉(zhuǎn)換成 1縗’ or 1=1#"。
簡(jiǎn)單來說%df’會(huì)被過濾函數(shù)轉(zhuǎn)義為%df’ ,%df’ = %df%5c%27 在使用gbk編碼的時(shí)候會(huì)認(rèn)為%df%5c是一個(gè)寬字節(jié)%df%5c%27=縗’,這樣就會(huì)產(chǎn)生注入。
那如何防御這個(gè)寬字節(jié)呢?我希望大家開發(fā)網(wǎng)站盡量使用UTF8編碼格式,如果轉(zhuǎn)換麻煩,最安全的方法就是使用PDO預(yù)處理。挖掘這種漏洞主要是檢查是否使用了gbk,搜索guanjianc character_set_client=gbk 和mysql_set_chatset("gbk") 。
二次urldecode注入,這中方式也是因?yàn)槭褂昧藆rldecode不當(dāng)所引起的漏洞。
我們剛才知道了 addslashes()函數(shù)可以防止注入,他會(huì)在(")、(")、()前面加上反斜杠來轉(zhuǎn)義。
那我們假設(shè)我們開啟了GPC,我們提交了一個(gè)參數(shù),/test.php?uid=1%2527,因?yàn)閰?shù)中沒有單引號(hào),所以第一次解碼會(huì)變成uid=1%27,%25解碼出來就是%,
這時(shí)候程序里如果再去使用urldecode來解碼,就會(huì)把%27解碼成單引號(hào)("),最終的結(jié)果就是uid=1".
我們現(xiàn)在知道了原有是因?yàn)閡rldecode引起的,我們可以通過編輯器的搜索urldecode和rawurldecode找到二次url漏洞。
從漏洞類型區(qū)分可以分為三種類型:
可顯
攻擊者可以直接在當(dāng)前界面內(nèi)容中獲取想要獲得的內(nèi)容。
報(bào)錯(cuò)
數(shù)據(jù)庫查詢返回結(jié)果并沒有在頁面中顯示,但是應(yīng)用程序?qū)?shù)據(jù)庫報(bào)錯(cuò)信息打印到了頁面中。 所以攻擊者可以構(gòu)造數(shù)據(jù)庫報(bào)錯(cuò)語句,從報(bào)錯(cuò)信息中獲取想要獲得的內(nèi)容,所以我建議在數(shù)據(jù)庫類中設(shè)置不拋出錯(cuò)誤信息。
盲注
數(shù)據(jù)庫查詢結(jié)果無法從直觀頁面中獲取攻擊者通過使用數(shù)據(jù)庫邏輯或使數(shù)據(jù)庫庫執(zhí)行延時(shí)等方法獲取想要獲得的內(nèi)容。
SQL 注入漏洞挖掘方法
針對(duì)上面提到的利用漏洞方法,總結(jié)了以下的挖掘方法:
參數(shù)接收位置,檢查是否有沒過濾直接使用 $_GET、$_POST、$_COOKIE參數(shù)的。
SQL語句檢查,搜索關(guān)鍵詞 select update insert 等SQL語句關(guān)鍵處,檢查SQL語句的參數(shù)是否可以被控制。
寬字節(jié)注入,如果網(wǎng)站使用的GBK編碼情況下,搜索guanjianc character_set_client=gbk 和mysql_set_chatset("gbk") 就行。
二次urldecode注入,少部分情況,gpc可以通過編輯器的搜索urldecode和rawurldecode找到二次url漏洞。
SQL 注入漏洞防范方法
雖然SQL注入漏洞非常多,但是防范起來卻挺簡(jiǎn)單的,下面介紹幾個(gè)過濾函數(shù)和類:
gpc/rutime 魔術(shù)引號(hào)
過濾函數(shù)和類
addslashes
mysql_real_escape_string
intval
PDO 預(yù)處理
XSS跨站前言
XSS又叫CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當(dāng)用戶瀏覽該頁之時(shí),嵌入其中Web里面的html代碼會(huì)被執(zhí)行,從而達(dá)到惡意的特殊目的。
XSS屬于被動(dòng)式的攻擊,因?yàn)槠浔粍?dòng)且不好利用,所以許多人常呼略其危害性。在WEB2.0時(shí)代,強(qiáng)調(diào)的是互動(dòng),使得用戶輸入信息的機(jī)會(huì)大增,在這個(gè)情況下,我們作為開發(fā)者,在開發(fā)的時(shí)候,要提高警惕。
xss 漏洞分類反射型,危害小,一般
反射型XSS原理:就是通過給別人發(fā)送帶有惡意腳本代碼參數(shù)的URL,當(dāng)URL地址被打開時(shí),特定的代碼參數(shù)會(huì)被HTML解析,執(zhí)行,如此就可以獲取用戶的COOIKE,進(jìn)而盜號(hào)登陸。比如hack甲構(gòu)造好修改密碼的URL并把密碼修改成123,但是修改密碼只有在登陸方乙才能修改,乙在登陸的情況下點(diǎn)擊甲構(gòu)造好的URL將直接在不知情的情況下修改密碼。
特點(diǎn)是:非持久化,必須用戶點(diǎn)擊帶有特定參數(shù)的鏈接才能引起。
存儲(chǔ)型,危害大,影響時(shí)間長
存儲(chǔ)型XSS原理,假設(shè)你打開了一篇正常的文章頁面,下面有評(píng)論功能。這個(gè)時(shí)候你去評(píng)論了一下,在文本框中輸入了一些JavaScript代碼,提交之后,你刷新這個(gè)頁面后發(fā)現(xiàn)剛剛提交的代碼又被原封不動(dòng)的返回來并且執(zhí)行了。
這個(gè)時(shí)候你會(huì)想,我要寫一段JavaScript代碼獲取cookie信息,然后通過ajax發(fā)送到自己的服務(wù)器去。構(gòu)造好代碼后你把鏈接發(fā)給其他的朋友,或者網(wǎng)站的管理員,他們打開JavaScript代碼就執(zhí)行了,你服務(wù)器就接收到了sessionid,你就可以拿到他的用戶權(quán)限了。
3.dom型,特殊的一種
dom型xss是因?yàn)镴avaScript執(zhí)行了dom操作,所造成的xss漏洞,具體如下圖。可以看到雖然經(jīng)過html轉(zhuǎn)義了,但是這塊代碼在返回到html中,又被JavaScript作為dom元素操作。那當(dāng)我輸入?name= 的時(shí)候依然會(huì)存在XSS漏洞。
xss 漏洞挖掘方法
根據(jù)上面的一些特點(diǎn),可以總結(jié)出幾個(gè)分析出幾個(gè)挖掘方法:
數(shù)據(jù)接收位置,檢查 $_GET、$_POST、$_COOKIE是否經(jīng)過轉(zhuǎn)義。
常見的反射型XSS搜索這種類似位置發(fā)現(xiàn)次數(shù)較多。
而存儲(chǔ)型在文章,評(píng)論出現(xiàn)比較多。
XSS 漏洞防范方法
轉(zhuǎn)義html實(shí)體,有兩種方式:在入口和出口,我建議是在入口處轉(zhuǎn)義,防止出口位置取出來的時(shí)候忘記轉(zhuǎn)義,如果已經(jīng)在入口轉(zhuǎn)義了,出口位置就不用再次轉(zhuǎn)義。
在富文本編輯器中,經(jīng)常會(huì)用到一些元素的屬性,比如上圖的onerror,那我們還需對(duì)元素的屬性建立黑白名單。
httpOnly 即使存在xss漏洞,可以把危害大大降低。
CSRF漏洞CSRF 漏洞介紹
CSRF(Cross-site request forgery)跨站請(qǐng)求偽造,通常縮寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點(diǎn)內(nèi)的信任用戶。
而CSRF則通過偽裝來自受信任用戶的請(qǐng)求來利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少)和難以防范,所以被認(rèn)為比XSS更具危險(xiǎn)性。
csrf主要用來做越權(quán)操作,而且csrf一直沒有被關(guān)注起來,所以很多程序現(xiàn)在也沒有相關(guān)的防范措施。
CSRF 案例
我們來看下面的一段代碼,這個(gè)表單當(dāng)被訪問到的時(shí)候,用戶就退出了登錄。假設(shè)有一個(gè)轉(zhuǎn)賬的表單,只需要填寫對(duì)方的用戶名,和金額就可以,那如果我提前把URL構(gòu)造好,發(fā)給受害者,當(dāng)點(diǎn)擊后,錢就被轉(zhuǎn)走了?;蛘呶野堰@個(gè)URL放到我的網(wǎng)頁中,通過 ,當(dāng)其他人打開我的網(wǎng)址后,就中招了。
CSRF漏洞挖掘方法
通過上面的描述,我們知道了漏洞的原有,那我們審計(jì)的時(shí)候可以檢查處理表單有沒有以下判斷。
是否有驗(yàn)證token。
是否有圖片驗(yàn)證碼。
是否有refe信息。
如果三個(gè)判斷都沒有,那么就存在了CSRF漏洞,CSRF不僅限于GET請(qǐng)求,POST請(qǐng)求同樣存在。
CSRF 漏洞防范方法
圖片驗(yàn)證碼,這個(gè)想必大家都知道,但是用戶體驗(yàn)并不好,我們可以看下面的一些處理方法。
token驗(yàn)證。
token驗(yàn)證方法如下,每次訪問表單頁的時(shí)候,生成一個(gè)不可預(yù)測(cè)的token存放在服務(wù)器session中,另外一份放頁面中,提交表單的時(shí)候需要把這個(gè)token帶過去,接收表單的時(shí)候先驗(yàn)證一下token是否合法。
Referer信息驗(yàn)證
大多數(shù)情況下,瀏覽器訪問一個(gè)地址,其中header頭里面會(huì)包含Referer信息,里面存儲(chǔ)了請(qǐng)求是從哪里發(fā)起的。
如果HTTP頭里包含有Referer的時(shí)候,我們可以區(qū)分請(qǐng)求是同域下還是跨站發(fā)起的,所以我們也可以通過判斷有問題的請(qǐng)求是否是同域下發(fā)起的來防御CSRF攻擊。
Referer驗(yàn)證的時(shí)候有幾點(diǎn)需要注意,如果判斷Referer是否包含*.XXX.com,如果有子域名有漏洞,會(huì)存在繞過的可能。
如果判斷的條件的是Referer中是否包含字符‘xxx.com’ 那攻擊者在他目錄中建立一個(gè)xxx.com文件夾同樣存在繞過的可能。如果可以最合適的判斷是,直接判斷是否等于當(dāng)前域名。
三、常規(guī)漏洞的防范方法 taint PHP 安全擴(kuò)展功能介紹
Taint 可以用來檢測(cè)隱藏的XSS code, SQL注入, Shell注入等漏洞,并且這些漏洞如果要用靜態(tài)分析工具去排查, 將會(huì)非常困難, 我們來看下面這張圖:
安裝方法
下載taint: http://pecl.php.net/package/t...
配置
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
更加詳細(xì)的可以參考 http://www.cnblogs.com/linzhe...
應(yīng)用場(chǎng)景
開發(fā)團(tuán)隊(duì)要求每個(gè)人都做到非常的安全比較難,但是把taint安裝在開發(fā)環(huán)境,特別適合,一看到warning信息一般都回去改。
ngx_lua_waf功能介紹
防止sql注入,本地包含,部分溢出,fuzzing測(cè)試,xss,SSRF等web攻擊。
防止svn/備份之類文件泄漏。
防止ApacheBench之類壓力測(cè)試工具的攻擊。
屏蔽常見的掃描黑客工具,掃描器。
屏蔽異常的網(wǎng)絡(luò)請(qǐng)求。
屏蔽圖片附件類目錄php執(zhí)行權(quán)限。
防止webshell上傳。
安裝方法
安裝依賴: luajit 、ngx_devel_kit、nginx_lua_module
安裝nginx、ngx_lua_waf
在nginx.conf里的http添加配置
詳細(xì)安裝文檔
效果圖
總結(jié)這次分享的內(nèi)容代碼審計(jì)處理常規(guī)漏洞部分挑選了三種類型,還有其他的一些一次也講不完。代碼身材除了像剛才的的參數(shù)檢查之外,還有邏輯性漏洞審查,下次如果有時(shí)間會(huì)再做一次邏輯漏洞審計(jì)分享。
實(shí)錄:《湯青松:PHP 代碼審查常規(guī)漏洞實(shí)戰(zhàn)解析》
重磅 Chat 分享:
《高效學(xué)習(xí),快速變現(xiàn):不走彎路的五大學(xué)習(xí)策略》
分享人:
一名會(huì)在 B 站直播寫代碼,會(huì)玩雜耍球、彈 Ukulele、極限健身、跑步、寫段子、畫畫、翻譯、寫作、演講、培訓(xùn)的程序員。喜歡用編程實(shí)現(xiàn)自己的想法,在 Android 市場(chǎng)上賺過錢,有多次創(chuàng)業(yè)經(jīng)歷。擅長學(xué)習(xí),習(xí)慣養(yǎng)成,時(shí)間管理。身體力行地影響他人做出積極的改變!目前就職于 ThoughtWorks,致力于傳播快樂高效的編程理念。業(yè)余創(chuàng)立軟件匠藝社區(qū) CodingStyle.cn,組織超過30場(chǎng)技術(shù)活動(dòng)。Chat簡(jiǎn)介:
說到學(xué)習(xí)呀,真是頭大喲:碎片化,沒有較長的連續(xù)時(shí)間來學(xué)習(xí)難專注,捧起書,手機(jī)卻在召喚:來呀,快活呀~ 反正有,大把時(shí)光~做不到,看了很多書,生活中卻做不到然并卵,學(xué)了方法和工具,找不到使用場(chǎng)景效率低,學(xué)習(xí)速度跟不上知識(shí)產(chǎn)生的速度記不牢,學(xué)習(xí)速度趕不上遺忘速度在這個(gè)知識(shí)泛濫、跨界競(jìng)爭(zhēng)的年代,學(xué)習(xí)能力才是核心競(jìng)爭(zhēng)力。你想想,過去一周,有沒有哪一件工作是不需要學(xué)習(xí)就能完成的?盡管如此重要,大部分人卻沒研究過學(xué)習(xí)這件事,以為上下班路上打開「得到」聽本書,就是碎片時(shí)間終身學(xué)習(xí)者了。我是程序員,咨詢師,培訓(xùn)師,這幾個(gè)角色都要求我必須學(xué)得又快又好。本場(chǎng) Chat 將分析學(xué)習(xí)的「趨勢(shì),原則,策略」,幫你站在更高的視角看待學(xué)習(xí),從「內(nèi)容,動(dòng)機(jī),交互,收益,資源」五方面制定策略,解決學(xué)習(xí)痛點(diǎn),助你成為高效學(xué)習(xí)者!
想要免費(fèi)參與本場(chǎng) Chat ?很簡(jiǎn)單,「GitChat技術(shù)雜談」公眾號(hào)后臺(tái)回復(fù)「高效學(xué)習(xí)」
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25887.html
摘要:建模語言建模語言是可用于表達(dá)信息或知識(shí)或系統(tǒng)的任何人造語言,該結(jié)構(gòu)由一組一致的規(guī)則定義,目標(biāo)是可視化,推理,驗(yàn)證和傳達(dá)系統(tǒng)設(shè)計(jì)。將這些文件安排到不同的地方稱為源代碼樹。源代碼樹的結(jié)構(gòu)通常反映了軟件的體系結(jié)構(gòu)。 大綱 軟件構(gòu)建的一般過程: 編程/重構(gòu) 審查和靜態(tài)代碼分析 調(diào)試(傾倒和記錄)和測(cè)試 動(dòng)態(tài)代碼分析/分析 軟件構(gòu)建的狹義過程(Build): 構(gòu)建系統(tǒng):組件和過程 構(gòu)建變體...
摘要:類型瞬時(shí)的代碼審查第一種類型是瞬時(shí)代碼審查,它發(fā)生在結(jié)對(duì)編程的情景中。相同的專業(yè)水平考慮進(jìn)行結(jié)對(duì)編程的另一個(gè)重要方面,是一起工作時(shí),兩個(gè)開發(fā)者的專業(yè)水平。讓一個(gè)初級(jí)開發(fā)者和一個(gè)高級(jí)開發(fā)者進(jìn)行結(jié)對(duì)編程,效果并不好。 本文翻譯自:https://dzone.com/articles/4-... 轉(zhuǎn)載請(qǐng)注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 沒...
摘要:標(biāo)準(zhǔn)規(guī)范簡(jiǎn)介是的簡(jiǎn)寫,由組織制定的規(guī)范,是開發(fā)的實(shí)踐標(biāo)準(zhǔn)。具體標(biāo)準(zhǔn)有有了統(tǒng)一編碼風(fēng)格規(guī)范,更有利于查看和學(xué)習(xí)各個(gè)框架或類庫,不不需要每次都適應(yīng)新的編碼風(fēng)格。同時(shí)在開發(fā)團(tuán)隊(duì)內(nèi)部使用統(tǒng)一的編碼規(guī)范更有利于代碼審查版本控制團(tuán)隊(duì)內(nèi)部交流。 PHP 標(biāo)準(zhǔn)規(guī)范 PSR PSR 簡(jiǎn)介 PSR 是 PHP Standard Recommendations 的簡(jiǎn)寫,由 PHP FIG 組織制定的 PHP...
摘要:以太坊將成為新互聯(lián)網(wǎng)的支柱,我為什么這么說正在以太坊上構(gòu)建我們的第層,而不是其他區(qū)塊鏈平臺(tái)這就是原因。以太坊不會(huì)犧牲去中心化的原則而下沉權(quán)力在區(qū)塊鏈方面,有一項(xiàng)稱為可擴(kuò)展性三難的基本法則。 以太坊將成為新互聯(lián)網(wǎng)的支柱,我為什么這么說?Loom Network正在以太坊上構(gòu)建我們的第2層,而不是其他區(qū)塊鏈平臺(tái)——這就是原因。 每個(gè)月都有其他的公司發(fā)布白皮書,聲稱已經(jīng)解決了以太坊所面臨的可...
閱讀 1192·2021-11-23 10:10
閱讀 1525·2021-09-30 09:47
閱讀 909·2021-09-27 14:02
閱讀 2987·2019-08-30 15:45
閱讀 3031·2019-08-30 14:11
閱讀 3625·2019-08-29 14:05
閱讀 1832·2019-08-29 13:51
閱讀 2215·2019-08-29 11:33