中国婚博会PHP高级工程师、安全顾问汤青松:浅析Web安全编程
11月18號(hào),2017看雪安全開發(fā)者峰會(huì)在北京悠唐皇冠假日酒店舉行。來自全國各地的開發(fā)人員、網(wǎng)絡(luò)安全愛好者及相應(yīng)領(lǐng)域頂尖專家,在2017看雪安全開發(fā)者峰會(huì)匯聚一堂,只為這場“安全與開發(fā)”的技術(shù)盛宴。
曾問過一位搞 Web 安全的人為什么 PHP 是世界上最好的語言,他的回答是 PHP 網(wǎng)站漏洞多,有飯吃。結(jié)合目前黑灰產(chǎn)業(yè)中借助 Web 漏洞進(jìn)行各種薅羊毛的現(xiàn)狀,不禁觸發(fā)了我們的深切反思。問題究竟出在什么地方,為什么網(wǎng)站會(huì)存在 SQL 注入、XSS 跨站、CSRF 這些漏洞,我們應(yīng)該如何避免在代碼中產(chǎn)生這些錯(cuò)誤?中國婚博會(huì)PHP 高級(jí)工程師、安全顧問湯青松為我們帶來了《淺析 Web 安全編程》主題演講。作為開發(fā)人員你會(huì)發(fā)現(xiàn)其中有許多點(diǎn)值得我們學(xué)習(xí)借鑒,安全問題必須引起每一位開發(fā)者的重視。
中國婚博會(huì)PHP高級(jí)工程師 湯青松
湯青松,中國婚博會(huì)PHP高級(jí)工程師、安全顧問。擅長安全測試工具的研發(fā),Web滲透測試,在處理Web漏洞中積累有大量經(jīng)驗(yàn),2014年任職于烏云,負(fù)責(zé)眾測開發(fā)工作;2015年在網(wǎng)利寶擔(dān)任研發(fā)以及安全建設(shè)。目前正專注于PHP的編碼安全,PHP安全編碼方面的書籍正在撰寫中。常常活躍在SegmentFault講堂以及GitChat,多次分享了Web安全方面的議題。曾在2017 PHP開發(fā)者大會(huì)上發(fā)表演講《PHP安全開發(fā):從白帽角度做安全》。
以下為演講速記:
湯青松:非常高興跟大家交流這個(gè)看雪編碼的問題,我是湯青松。說到安全開發(fā)的話題,其實(shí)我一直是開發(fā)者,開發(fā)我是專業(yè),安全我是業(yè)余,但是安全開發(fā)我還是專業(yè)的。在場的各位,對于關(guān)鍵詞都有清晰的了解,我列舉了一些安全的關(guān)鍵詞,我們先來看一下。常見代碼注入、CSRF、O元支付、短信轟炸這些都是非常常見的漏洞,今天由于時(shí)間關(guān)系我講不了那么多,我列舉其中幾個(gè)點(diǎn)跟大家分享一下,希望大家聽了以后可以舉一反三,在大腦中形成自己的安全意識(shí),從而提高這個(gè)安全編碼的能力。
常見漏洞有哪些?
今天要分享的是五個(gè)點(diǎn):SQL注入、XSS跨占,請求偽造,越權(quán)漏洞以及支付漏洞。
SQL注入
我們看一下SQL注入,首先是漏洞成因,攻擊方式以及防御方案。漏洞成因我們可以這兩句話,使用用戶參數(shù)拼接這個(gè)SQL語句,這個(gè)參數(shù)改變了原有的SQL結(jié)構(gòu),改變了這個(gè)SQL的注入。我們看下面一張PPT,左邊這是一個(gè)數(shù)據(jù)庫,白色部分的字體是我們在代碼中寫到的SQL結(jié)構(gòu),黑色部分就是攻擊者可能會(huì)傳入的參數(shù)。當(dāng)我們把這個(gè)SQL結(jié)構(gòu)拼接出來之后形成了一個(gè)新的結(jié)構(gòu),這個(gè)結(jié)構(gòu)被執(zhí)行之后把整張表所有的數(shù)據(jù)傳輸出來,數(shù)據(jù)庫比較大的訪問更多請求,整個(gè)可能就掛了,還造成一些數(shù)據(jù)泄漏的情況,這些就是SQL的注入成因,參數(shù)改變了原有的SQL結(jié)構(gòu)。
攻擊者通常有哪幾種攻擊方式?我把它分為了三種類型:一種是回顯注入,一種是報(bào)錯(cuò)注入,一種是盲注。
這里面有兩張圖,第一張圖是傳入ID是正常的正型數(shù)字,返回的結(jié)果是用戶的一個(gè)信息傳入ID等于1,上面把這個(gè)參數(shù)修改了一下,等于1,然后加了 or 1=‘1,當(dāng)它拼接到之后,跟前面一樣把整個(gè)表的數(shù)據(jù)傳輸出來,這邊看到整個(gè)用戶表的數(shù)據(jù)都被列舉出來了。利用漏洞可以改變這個(gè)頁面的數(shù)據(jù)我們叫做回顯注入,這個(gè)黑客可以直接把這個(gè)數(shù)據(jù)下載下來。
報(bào)錯(cuò)注入,這張圖非常清楚可以看到URL上面這個(gè)部分是正常URL加上攻擊者利用的供給代碼,其實(shí)這上面的供給代碼也是執(zhí)行不了,放到數(shù)據(jù)庫當(dāng)中,最后會(huì)造成數(shù)據(jù)庫變?yōu)楫惓4a,然后把異常碼拋出來了,把這個(gè)用戶名展示出來了,這是非常敏感的信息,我們寫代碼的時(shí)候需要把這個(gè)數(shù)據(jù)庫拋出來的錯(cuò)誤屏蔽掉,不要可以讓前臺(tái)顯示出來,通過報(bào)錯(cuò)顯示了一些敏感信息,我們稱之為報(bào)錯(cuò)注入。
盲注,連接起來稍微可能復(fù)雜一點(diǎn),它和回顯注入以及報(bào)錯(cuò)注入不一樣,我們沒有辦法通過這個(gè)頁面數(shù)據(jù)看到它的區(qū)別,可以通過兩種方式,比如說步爾盲注和時(shí)間盲注,下面的部分是正常URL,紅色部分是布爾注入的表示式,前面加一個(gè)and截取一個(gè)字符,判斷一下這個(gè)第一個(gè)字符是不是大于這個(gè)字母A,如果當(dāng)它成立整個(gè)條件都是成立,這個(gè)時(shí)候頁面是有反饋數(shù)據(jù)的。如果不成立這個(gè)頁面返回不了數(shù)據(jù),這就是布爾數(shù)據(jù),我們可以看到有數(shù)據(jù)和沒有數(shù)據(jù)的情況,當(dāng)字母A不斷變換的時(shí)候,也可以把這個(gè)數(shù)據(jù)庫里面的數(shù)據(jù)猜測出來。時(shí)間盲注,下面藍(lán)色區(qū)域部分,我們知道數(shù)據(jù)庫里面可以用一些IF函數(shù),也是截取第一個(gè)字符,如果這個(gè)不成立就到五秒鐘返回,通過這個(gè)頁面返回的時(shí)間可以判斷這個(gè)地方是不是有注入的,也可以把這個(gè)數(shù)據(jù)都給下載下來。
剛剛說到攻擊者碰到三種攻擊方式,下面看一下怎么樣檢測頁面當(dāng)中有沒有什么注入?現(xiàn)在有非常多的工具,如果對注入了解不是太深,也是有快速檢測的方法。我們可以看到這是一個(gè)CMD窗口,上面是我寫到的檢測表達(dá)式,Splmap.py以及我們需要檢測的UI,需要有這個(gè)注冊點(diǎn)它會(huì)告訴你有哪些注入,比如說這個(gè)頁面是我在本地測試的結(jié)果,它就告訴了有回顯注入、錯(cuò)誤注入以及一些盲注。
開發(fā)者最關(guān)心的就是怎么樣防范服務(wù)器的安全?編碼的過程中有三點(diǎn)建議,值得借鑒。1,參數(shù)會(huì)改變SQL的結(jié)構(gòu),我們會(huì)讓這個(gè)參數(shù)當(dāng)中不但有這個(gè)SQL的結(jié)構(gòu),當(dāng)我知道這個(gè)參數(shù)是整型的時(shí)候,我們就把這個(gè)參數(shù)轉(zhuǎn)型為整型,整型肯定不包括這個(gè)SQL的結(jié)構(gòu),無法改變結(jié)構(gòu)的目的,哪就不存在著SQL注入。有的時(shí)候我們無法預(yù)測它傳什么參數(shù),比如說我們?nèi)フ搲貜?fù)一個(gè)帖子,我們肯定沒有辦法控制的,這個(gè)時(shí)候我們可以用PDO預(yù)處理,這也是最常見的方法,也是一個(gè)最好的方法。但是有的時(shí)候我們會(huì)寫一些復(fù)雜社會(huì)語句,我們會(huì)會(huì)用第一種方法,我們適前定義好這個(gè)SQL的語句結(jié)構(gòu),再把我們的參數(shù)放進(jìn)去,這個(gè)時(shí)候是無法達(dá)到更改SQL語句處理的目的。當(dāng)這個(gè)業(yè)務(wù)比較大的時(shí)候,這個(gè)日志是非常多的,可以找一些SQL的取模軟件,可以把這個(gè)取模一下,取模之后并不太多的,如果直接看的話是海量的日志,是沒法看的。
XSS跨站
看一下漏洞成因、攻擊場景以及防御方法。畫了一張圖,上面有一個(gè)URL,下面是一個(gè)頁面返回的HTML代碼,我們可以看到白色部分HTML是我們事先定義好,黑色部分參數(shù)是想用戶想搜索的關(guān)鍵詞,當(dāng)我們搜索了test+Div最后等于123,對后反饋頁面一般搜索會(huì)告訴你用戶搜索了什么關(guān)鍵詞,結(jié)果如何等等。這個(gè)地方如果沒有做好轉(zhuǎn)移,可能會(huì)造成XSS跨3(音),我們可以看到藍(lán)色部分是我們事先定義好的結(jié)構(gòu),被攻擊者利用之后它先把這個(gè)DIV結(jié)束了,最后加上一個(gè)script標(biāo)簽,它也有可能不跟體談標(biāo)簽,直接發(fā)送到它的服務(wù)器上。參數(shù)未經(jīng)過安全過濾,然后惡意角本被放到網(wǎng)頁當(dāng)中被執(zhí)行了,用戶瀏覽的時(shí)候執(zhí)行了這個(gè)腳本。
XSS也分好幾種類型,比如說這里有三種類型,反射型、存儲(chǔ)型以及DOM型。
反射型:這個(gè)截圖當(dāng)中是專門訓(xùn)練一些WEB漏洞的練習(xí)頁面,我們可以輸入自己的名字,輸入之后會(huì)把我們的名字在這里顯示了出來,我們輸入了一個(gè)張三,這個(gè)時(shí)候彈出來了一個(gè)123,在那邊顯示了一個(gè)張三,但是script標(biāo)簽沒有出來,因?yàn)檫@個(gè)標(biāo)簽被執(zhí)行了。
接著來說說存儲(chǔ)型的漏洞,存儲(chǔ)型的XSS,我們可以看一下這個(gè)URL上面并沒有代碼,但是依然彈出了一個(gè)“1”其實(shí)也是中了XSS代碼,這是怎么樣做到的?我看了漏洞的帖子。它是發(fā)現(xiàn)個(gè)人資料頁的時(shí)候有一個(gè)XSS漏洞,它就在個(gè)性簽名的位置填入了一個(gè)XSS標(biāo)簽,彈出了一個(gè)1,把這個(gè)地址發(fā)給了別人,別人看到這個(gè)地址并沒有什么代碼以為這個(gè)頁面是安全,結(jié)果一打開就插入了這個(gè)XSS代碼。存儲(chǔ)型的XSS的攻擊危害比較大,因?yàn)樗捻撁娈?dāng)中是看不到這個(gè)Script的代碼,別人防不勝防。只要管理員沒有發(fā)現(xiàn),下一個(gè)用戶或者下一個(gè)用戶一直接發(fā)它的,反射型需要用戶主動(dòng)點(diǎn)擊的。
還有一種是Dom型的XSS,一般是一些有安全意識(shí)的開發(fā)者弄出來。比如說接受參數(shù)會(huì)做一些過濾,把一些字符轉(zhuǎn)義一下,但是轉(zhuǎn)義之后依然會(huì)存在著XSS的情況,比如說這個(gè)圖上我們上面輸入的可以看到這行代碼奪了規(guī)律,把這個(gè)大括號(hào)以及小括號(hào)以及雙頁號(hào)進(jìn)行轉(zhuǎn)移,按理說轉(zhuǎn)移之后它應(yīng)該不會(huì)再作為它的標(biāo)簽存在,不會(huì)存在XSS的代碼。我們可以看到下面在Script通過ID獲得的這個(gè)值,復(fù)制到了這個(gè)DIV上,經(jīng)過DOM操作之后,之前轉(zhuǎn)義的字符就變?yōu)榈乃臉?biāo)簽,所以經(jīng)過DOM的操作XSS我們稱之為DOMXSS,有可能通過URL傳播,也有可能通過服務(wù)器的傳播。
通過XSS有一些建議:有一些時(shí)候根本就不需要考慮到它是不是HTML有標(biāo)簽,我們有的時(shí)候根本用不到HTML標(biāo)簽,只保留文字部分這是一勞永逸的,但是有一些我們還是需要展示這個(gè)標(biāo)簽,比如說程序論壇當(dāng)中我要貼一個(gè)代碼不能把這個(gè)代碼部分干掉,這個(gè)時(shí)候我們需要用一些轉(zhuǎn)移,它會(huì)把這個(gè)大括號(hào)、小括號(hào)以及雙引號(hào)都可以做一個(gè)轉(zhuǎn)意,做為一個(gè)字符,就無法執(zhí)行這個(gè)標(biāo)簽型,后面加一個(gè)參數(shù),有時(shí)候單引號(hào)也會(huì)造成一席XSS。一個(gè)信號(hào)當(dāng)中有那么多的地方存在著這個(gè)輸入以及檢測的地方,可能就有一些地方漏掉了,只要有一個(gè)地方漏掉了,用戶的cookie信息就被盜取了。服務(wù)器發(fā)生用戶信息的時(shí)候我們需要加上一個(gè)httponly之后,這個(gè)代碼無法讀取到cookie的信息,那么攻擊者也是得不到這個(gè)信息的,對于用戶來說也是非常好的保護(hù)。比如說張三在我們網(wǎng)站上登陸了一下用戶明,李四他特意發(fā)生了一個(gè)攻擊請求,他拿不到這個(gè)用戶ID,就冒充不了這個(gè)張三。
越權(quán)漏洞
我們再來看看越權(quán)漏洞,在一些系統(tǒng)當(dāng)中如果存在著多種用戶角色,每一種角色有不同的權(quán)限。操作業(yè)務(wù)適合如果權(quán)限不嚴(yán)格可能會(huì)發(fā)生越權(quán)漏洞。越權(quán)分為垂直越權(quán)和平衡越權(quán)。
我們先來看一下平行越權(quán)。經(jīng)常在WEB系統(tǒng)當(dāng)中有商城,這個(gè)商城當(dāng)中必不可少就有訂單,訂單肯定是有一個(gè)店鋪ID,我們通常把它設(shè)置為一個(gè)自增長的ID,這個(gè)ID是一個(gè)數(shù)字型的,在URL上面如果我有一個(gè)訂單ID就是100,我是一個(gè)攻擊者我會(huì)嘗試一下,100+1,當(dāng)它ID等于101或者99的時(shí)候能否訪問到,如果能否訪問到就看一下這個(gè)訂單信息不是我的,這個(gè)地方就存在著一個(gè)漏洞。張三可以看到李四的訂單信息,這個(gè)時(shí)候就存在著越權(quán)。張三和李四是平級(jí)的用戶,我是普通用戶,他也是普通用戶,他們兩個(gè)權(quán)限是一樣,互相可以看平臺(tái)信息這叫做平級(jí)越權(quán)。這個(gè)有什么危害?比如說這個(gè)網(wǎng)站有的漏洞,如果是競爭對手他就可以知道用戶在我的平臺(tái)上下過訂單的行為,然后去營銷一下,還有一下我們把這個(gè)訂單ID直接暴露出來,還有一種可能就是競爭對手會(huì)根據(jù)我們的訂單IP的增長量,判斷我們的增長量,就知道我們一天到底有多少訂單。
平行越權(quán)防御方法,我們查詢的時(shí)候必須加上當(dāng)前用戶的ID,就是orderID加上UID,這樣不會(huì)出現(xiàn)張三可以看到李四的訂單了。
接下來我們再看一下垂直越權(quán),這是一個(gè)普通用戶進(jìn)入到后臺(tái)管理系統(tǒng)當(dāng)中,他的權(quán)限就擴(kuò)大化了,這個(gè)時(shí)候可以一些其他的操作,他有更多的權(quán)限了,通常發(fā)現(xiàn)這種情況原因,通常后臺(tái)會(huì)集成到更多的控制器來統(tǒng)一管理。依然有一些郵件就漏掉了,沒有集成到,就會(huì)出發(fā)這種情況。黑客不會(huì)一個(gè)一個(gè)找,會(huì)通過一些掃描器發(fā)現(xiàn)了,他就可以進(jìn)去了。不要把自增長ID暴露出來,可以做對稱加密或者非對稱加密都可以,先轉(zhuǎn)換為一個(gè)字母型的,讓別人看不到你的數(shù)字型的ID是多少。別人就沒有辦法去通過這個(gè)加一減一的方式越權(quán),也看不到你的一天業(yè)務(wù)增長量。
我看到一些代碼在前臺(tái)和后臺(tái)會(huì)供應(yīng)到長接口,前臺(tái)和后臺(tái)是有一些區(qū)別,前臺(tái)有一個(gè)訂單列表不會(huì)+UID,造成代碼一直寫寫,前臺(tái)也不會(huì)加入這個(gè)UID,我建議盡量把這個(gè)前臺(tái)的方法和后臺(tái)的方法區(qū)分開來。越權(quán),其實(shí)不僅僅限于展示,我們剛剛看到了這個(gè)訂單,張三可以看到李四的訂單信息是查看,但是有的時(shí)候我們修改訂單的時(shí)候也會(huì)主線這個(gè)問題。所以在讀寫的時(shí)候我們都需要注意一下這個(gè)越權(quán)的問題。
CSRF跨站請求偽造
CSRF,這個(gè)通常會(huì)配合XSS使用。服務(wù)端錯(cuò)把瀏覽器發(fā)起的應(yīng)請求當(dāng)用戶發(fā)起的請求,會(huì)造成XSS的問題。比如說我打開了張三的網(wǎng)站,登陸了一個(gè)用戶信息,李四網(wǎng)站上有一個(gè)攻擊代碼,向張三這個(gè)網(wǎng)站發(fā)起請求,張三的網(wǎng)站會(huì)以為你本人發(fā)起的請求,他實(shí)際上是瀏覽器發(fā)出的請求。
比如PPT中有一張圖片,圖片有一個(gè)表單,左邊是它的源碼,我們可以看到表單每一項(xiàng)都在,但是從安全的角度上考慮它是少了一樣?xùn)|西,沒有一些驗(yàn)證碼或者TOKEN等等一些相關(guān)信息。服務(wù)端如果沒有驗(yàn)證這個(gè)問題,就會(huì)造成這個(gè)CSRF的攻擊。如何檢測我們的系統(tǒng)當(dāng)中是否存在這個(gè)CSRF?
可以去掉token信息看一下能否提交,把Referer能否提交成功,以及替代POST請求,如果都存在它就存在著CSRF。我們有一些建議,一定要驗(yàn)證Reeferer信息,Token的驗(yàn)證,圖片驗(yàn)證碼等等。根據(jù)我們的業(yè)務(wù)安全等級(jí)越高,最基礎(chǔ)的我們可以用這個(gè)refefe需要驗(yàn)證,再高一級(jí)就是token,再高一級(jí)就是圖片驗(yàn)證。
支付漏洞
接著我們來看看支付漏洞,在這張圖中,我搜索了”漏洞 低價(jià) 線報(bào)”,搜索到一批QQ群; 我嘗試加入過這些QQ群中觀察,在群中看到有人在賣低價(jià)支付購買商品的漏洞,在跟其中的一個(gè)群友哪里了解到有很多做黑產(chǎn)的會(huì)把一些漏洞的信息賣到群里面去,其他的人就會(huì)去把這個(gè)漏洞給利用起來。
之前看到一個(gè)新聞,有一個(gè)浙江的老板,他想做線上找人做了一個(gè)網(wǎng)站,這個(gè)網(wǎng)站存在著一些支付漏洞,一周之后他發(fā)現(xiàn)這個(gè)訂單量極速上升,賣了70多萬,結(jié)果看了一下帳戶余額只有幾千塊錢,報(bào)警之后才查到原因,但是貨物已經(jīng)發(fā)出去了。造成這些漏洞原因有很多,比如說支付金額是由前端提交的數(shù)據(jù),不是后端計(jì)算的,而且沒有對這個(gè)金額做校驗(yàn),直接信任的前端提交的金額,導(dǎo)致這個(gè)攻擊者可以隨即修改這個(gè)金額,比如說修改為一分錢,這是非常典型的可以隨意更改這個(gè)金額。
上面的金額是94元,這個(gè)表單里面改為一分錢,最后提交的時(shí)候是一分錢,這是非常好的漏洞,也是非常典型的。
還有一個(gè)問題是數(shù)量的限制,一個(gè)價(jià)格是26元,一個(gè)是27元,把這個(gè)數(shù)量變?yōu)樨?fù)一之后,一提交變?yōu)橐粔K錢了。這是之前數(shù)據(jù)包的漏洞,他充值了一塊錢,他發(fā)現(xiàn)有一個(gè)數(shù)據(jù)包向網(wǎng)站發(fā)送,他就把這個(gè)數(shù)據(jù)包反復(fù)重放,就加了好幾次,實(shí)際上只充值了一塊錢。
如何防范?我們限制這個(gè)低價(jià)購買產(chǎn)品,比如說負(fù)數(shù)的時(shí)候肯定不行,等于零的商品的根據(jù)業(yè)務(wù)情況也是需要多注意的。限制免費(fèi)商品獲得金錢和積分的情況。有一些商品免費(fèi)了,但是它可以獲得一些積分,那就存在著刷積分的情況。
最后這個(gè)腦圖這是我畫的這次講解的內(nèi)容,大家可以下載看一下。我的演講到此結(jié)束。
注:本文根據(jù)大會(huì)主辦方提供的速記整理而成,不代表CSDN觀點(diǎn)。
2017看雪安全開發(fā)者峰會(huì)更多精彩內(nèi)容:
- 2017看雪安全開發(fā)者峰會(huì)在京召開 共商網(wǎng)絡(luò)安全保障之策
- 中國信息安全測評(píng)中心總工程師王軍:用技術(shù)實(shí)現(xiàn)國家的網(wǎng)絡(luò)強(qiáng)國夢
- 興華永恒公司CSO仙果:Flash之殤—漏洞之王Flash Player的末路
- 威脅獵人產(chǎn)品總監(jiān)彭巍:業(yè)務(wù)安全發(fā)展趨勢及對安全研發(fā)的挑戰(zhàn)
- 啟明星辰ADLab西南團(tuán)隊(duì)負(fù)責(zé)人王東:智能化的安全——設(shè)備&應(yīng)用&ICS
- 自由Android安全研究員陳愉鑫:移動(dòng)App灰色產(chǎn)業(yè)案例分析與防范
- 騰訊反病毒實(shí)驗(yàn)室安全研究員楊經(jīng)宇:開啟IoT設(shè)備的上帝模式
- 綠盟科技應(yīng)急響應(yīng)中心安全研究員鄧永凱:那些年,你怎么寫總會(huì)出現(xiàn)的漏洞
- 騰訊游戲安全高級(jí)工程師胡和君:定制化對抗——游戲反外掛的安全實(shí)踐
- 綠盟科技網(wǎng)絡(luò)安全攻防實(shí)驗(yàn)室安全研究員廖新喜:Java JSON 反序列化之殤
- 阿里安全I(xiàn)oT安全研究團(tuán)隊(duì)Leader謝君:如何黑掉無人機(jī)
總結(jié)
以上是生活随笔為你收集整理的中国婚博会PHP高级工程师、安全顾问汤青松:浅析Web安全编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是如何学习的,分享本人的学习方法
- 下一篇: Win7系统下文件或程序无法选择默认打开