一、背景
湯青松 怠噪,北京趣加科技有限公司 安全工程師,實(shí)體書《PHP WEB安全開發(fā)實(shí)戰(zhàn)》作者杜跷,擅長(zhǎng)企業(yè)安全建設(shè)傍念,SDL安全建設(shè)矫夷。
PHPCon 2020 第八屆 PHP 開發(fā)者大會(huì)分享《PHP安全編碼規(guī)范與審查》,NSC 2019第七屆中國(guó)網(wǎng)絡(luò)安全大會(huì)分享《PHP反序列化漏洞分析實(shí)踐》看雪2018 安全開發(fā)者峰會(huì)擔(dān)任Web安全訓(xùn)練營(yíng) 講師
大家好捂寿,非常高興給大家分享《代碼安全體系建設(shè)》議題,我是湯青松孵运,目前在 SDL 方面做的比較多的秦陋。今天講的這個(gè)話題其實(shí)和 SDL 有很大關(guān)系的。我這次分享這個(gè)話題的其實(shí)就是 SDL 當(dāng)中的一部分治笨。很多同學(xué)如果在甲方也會(huì)去做 SDL 當(dāng)中的一些工作驳概,所以我希望我這次分享的內(nèi)容對(duì)大家有所幫助。
這次分享的話題是 SDL 當(dāng)中的一部分旷赖,但是它不完全是 SDL 因?yàn)槲抑饕€是聚焦于在安全向左移的這樣一個(gè)概念當(dāng)中顺又。所以今天分享的話題主要是聚焦于這個(gè)代碼風(fēng)險(xiǎn)管理。那在這個(gè)代碼安全當(dāng)中可能有哪些風(fēng)險(xiǎn)點(diǎn)了等孵?那它可能會(huì)包含技術(shù)方面的工作和非技術(shù)方面的工作稚照,比如說管理工作以及這個(gè)學(xué)習(xí)方面的一些事情都會(huì)有講解到。
1.1內(nèi)容概要
我今天講的這個(gè)話題俯萌,主要還是在于意識(shí)果录、技術(shù)、監(jiān)督和學(xué)習(xí)四個(gè)方面怎么去開展我們的安全工作咐熙?這里我做了一張腦圖弱恒,那在腦圖當(dāng)中,我覺得從這個(gè)淡淡安全體系當(dāng)中棋恼,我們有四個(gè)層面了可以去做的返弹,比如說這個(gè)安全培訓(xùn)。
在安全培訓(xùn)當(dāng)中爪飘,我們第一點(diǎn)要告訴他有哪些風(fēng)險(xiǎn)點(diǎn)义起,第二個(gè)就是我們得教他怎么去避坑,那么教他避坑了师崎,我們就可以直接拿到他這個(gè)倉庫的代碼并扇,然后我們自己先去分析一遍,分析完之后抡诞,然后在培訓(xùn)的時(shí)候我們就可以告訴他你這個(gè)代碼了哪里會(huì)存在一些風(fēng)險(xiǎn)點(diǎn)穷蛹,把這個(gè)問題告訴他。
第三個(gè)就是我們告訴你了昼汗,你不能怎么去寫肴熏,你應(yīng)該怎么去寫。那么我們制定完這一套規(guī)則了顷窒,我們不可能說其實(shí)人工去盯著您得有一套監(jiān)督機(jī)制蛙吏。這里我也會(huì)給大家去講一下源哩,怎么去結(jié)合semgrep 和GitLab做一個(gè)鉤子事件,實(shí)時(shí)檢測(cè)這個(gè)代碼當(dāng)中的一些風(fēng)險(xiǎn)點(diǎn)鸦做。
那么第四個(gè)就是我們?cè)谏暇€前肯定會(huì)有安全測(cè)試励烦。在安全測(cè)試當(dāng)中可能會(huì)有哪些疑難點(diǎn)?那今天我大致會(huì)提到這樣幾個(gè)問題點(diǎn)泼诱。那首先我們來說一下安全培訓(xùn)我們?cè)趺慈プ鎏陈印D前踩嘤?xùn)我相信很多做技術(shù)的同學(xué),他可能就是自己的技術(shù)了是比較好的治筒,但是讓他去給別人講怎么去踩坑以及一些案例屉栓,她不一定是他擅長(zhǎng)的。
我們先來說一下我是如何理解保障整個(gè)應(yīng)用安全的耸袜,我認(rèn)為它不是由某一個(gè)維度是否做得足夠好來衡量友多,它是一個(gè)綜合的方面。也是多個(gè)團(tuán)隊(duì)配合起來的一個(gè)工作堤框,我們作為安全人員在這里要負(fù)主要責(zé)任域滥。
我們要想盡一切辦法去和開發(fā)和測(cè)試一起保障保證應(yīng)用安全。我們首先給這些開發(fā)人員建立這樣一個(gè)安全意識(shí)蜈抓,那告訴他了互聯(lián)網(wǎng)當(dāng)中會(huì)有很多的一些漏洞骗绕,那這些漏洞了有哪些危害?那首先在他開發(fā)的時(shí)候资昧,他就會(huì)想到不能讓這個(gè)應(yīng)用有漏洞酬土。
第二個(gè)讓他有意識(shí)之后,要教他怎么去避開這些坑格带,不要讓他知道有這些安全風(fēng)險(xiǎn)起來撤缴,他不知道怎么去處理,然后還是踩坑了叽唱。那么這個(gè)時(shí)候我們安全人員自己在這個(gè)技術(shù)方面了屈呕,要有一定的這個(gè)能力。
第三個(gè)在監(jiān)督層面棺亭。如果說你告訴開發(fā)人員互聯(lián)網(wǎng)當(dāng)中有很多漏洞虎眨,也教他去避坑了。但是沒有監(jiān)督很多人了他可能并不一定按照你的要求去做镶摘,所以這個(gè)時(shí)候您得有一定的監(jiān)督機(jī)制嗽桩。
第四點(diǎn)是是通過事件驅(qū)動(dòng),我相信作為甲方凄敢,你肯定還會(huì)遇到一些安全事件去驅(qū)動(dòng)碌冶。比如說我們公司是做游戲的,還時(shí)不時(shí)會(huì)有一些拖機(jī)掛或者等等一些外掛這些方面的問題涝缝。那么我們會(huì)把這些事情給整理起來扑庞,整理成案例譬重,再給這些開發(fā)人員去學(xué)習(xí)。
二罐氨、 安全培訓(xùn)
所以這里我講幾個(gè)非技術(shù)性的一個(gè)話題臀规,就是我們?cè)趺慈ソo這些開發(fā)做培訓(xùn)。那首先我覺得做培訓(xùn)有這幾個(gè)方面栅隐,我可以給大家一些參考意見塔嬉。比如說首次的這個(gè)培訓(xùn)我們講什么話題?怎么避免一次性把這個(gè)話講了约啊,那么我下個(gè)季度還講不講邑遏?是不是我一次性了就把話講完了我覺得都是有一些技巧的佣赖,就是你第一次該講什么東西恰矩。
第二個(gè)說我們培訓(xùn)了是,一次培訓(xùn)了憎蛤,我們就把所有的這個(gè)開發(fā)組成員了都叫上外傅。那么比如說幾十號(hào)人,上百人都叫上俩檬,然后我們自己在一個(gè)舞臺(tái)上去講還是這個(gè)小組去講了萎胰。那這里頭我是推薦大家小組講,那一會(huì)我會(huì)講到為什么去小組講棚辽。
第三個(gè)就是案例就地取材案例了技竟,我們一定要在每次培訓(xùn)之前把他那個(gè)代碼打開去看一下,拿著他的代碼給她們做一完培訓(xùn)屈藐。然后接著了我們就開展我們這次要培訓(xùn)的一個(gè)話題榔组,那這樣的一個(gè)形式。
2.1 首次基礎(chǔ)培訓(xùn)
首次基礎(chǔ)培訓(xùn)了我們可以給他講哪些東西了联逻?我覺得你首先可以給他講一下你在這個(gè)甲方安全當(dāng)中了搓扯,你是怎么去給他們做代碼審計(jì)的,你是怎么去做安全的包归?這個(gè)其實(shí)是她比較關(guān)心的锨推,讓他了解你的工作。那你平時(shí)會(huì)關(guān)注哪些點(diǎn)公壤,你給他充分交流一下换可。那么建立一個(gè)互信機(jī)制。
第二個(gè)你可以給他講一下這個(gè)漏洞分類厦幅,比如說了通用的一個(gè)編碼型漏洞锦担,比如說SQL注入, XSS csrf 文件上傳慨削,然后命令執(zhí)行代碼注入等等這些問題洞渔。那把這些問題了給講完之后了套媚,我們還可以給他介紹一下這個(gè)邏輯性漏洞,比如說這個(gè)支付漏洞磁椒、越全漏洞堤瘤、驗(yàn)證碼漏洞、短信漏洞等等這些漏洞了浆熔,我們可以給他科普一下本辐。
那么講這些漏洞的時(shí)候,你可以去結(jié)合他們這個(gè)小組了医增,他們是做哪方面業(yè)務(wù)的慎皱?比如說做中臺(tái)的了,他可能會(huì)脫離業(yè)務(wù)叶骨。他可能沒有這樣一個(gè)支付的問題茫多,或者說沒有用戶的一些問或等等和他這個(gè)主無關(guān)的一些問題,可以給大概提一下忽刽,但不要講細(xì)了天揖。
第三個(gè)你可以給他講一下代碼自查的一些方法,你可以教他一些簡(jiǎn)單的方法跪帝,比如說他寫完代碼之后了今膊,怎么去審計(jì)自己的安全問題?但這個(gè)參數(shù)有沒有做過濾類型伞剑,是否強(qiáng)制的斑唬,比如說我要介紹一個(gè) ID 那在 PHP 語言當(dāng)中了,那可能他沒有使用這個(gè)整型轉(zhuǎn)換黎泣,那么接受了有可能這個(gè)字符恕刘,那么拼接到這個(gè)SQL注入當(dāng)中了對(duì)吧?那這個(gè)時(shí)候你就要跟他講聘裁,你說你在這個(gè)接收的時(shí)候你得做一次過濾雪营,你如果沒有做過濾了,在拼接社會(huì)語句的時(shí)候你得做 pdo 衡便,然后查 SQL 大致教他一下怎么去查献起。
那這個(gè)SQL漏洞怎么查了?我相信做甲方的技術(shù)同學(xué)都有一定的見解镣陕,在這里我就不展開了谴餐,你可以給這些開發(fā)的大概提一下。一般來說就是做開發(fā)的同學(xué)了呆抑。自己對(duì)這一塊也是比較了解的岂嗓,你給他點(diǎn)個(gè)開頭,他自己很多事情他能想明白的鹊碍。
2.2 小組培訓(xùn)
第二個(gè)就要在做培訓(xùn)的時(shí)候了厌殉,我的建議是小組培訓(xùn)食绿,比如說你們一個(gè)公司可能會(huì)分為很多個(gè)小組。那么我目前來說我主要是給后端的同學(xué)做培訓(xùn)公罕。所以我一般做培訓(xùn)的時(shí)候我會(huì)講后端的一些東西器紧。那么后端他每一個(gè)組了他其實(shí)涉及的東西都不一樣,比如說有些組了他不會(huì)用到 HTTP 協(xié)議楼眷,他就會(huì)用這個(gè) socket TCP 這種協(xié)議铲汪。那么你給他去講一些 web 業(yè)務(wù)的一些漏洞了,他可能不愛聽罐柳。
所以做小組培訓(xùn)的目的了掌腰,我覺得主要就是因材施教。那每個(gè)組他有自己不同的一些特點(diǎn)张吉,你得給他講他自己不同的齿梁。那么你盡量在每次培訓(xùn)的時(shí)候,你盡量控制在 10 個(gè)人以內(nèi)芦拿。而且我覺得時(shí)間你要控制一下士飒,就要控制在這個(gè) 45 分鐘以內(nèi)查邢。們平時(shí)上課了對(duì)吧蔗崎,也是 45 分鐘以內(nèi)。
說了你要有這個(gè)時(shí)間的一個(gè)意識(shí)扰藕,你不要一直講缓苛,講完之后翻其他人壓根就沒來聽,你要有以這樣一個(gè)互動(dòng)機(jī)制邓深。那這里有三點(diǎn)了未桥,我需要給大家去說的。就第一個(gè)了就是開始講到了芥备,你一定要貼近這個(gè)團(tuán)隊(duì)的一個(gè)真實(shí)代碼冬耿。你每次給他做培訓(xùn)的時(shí)候了,你得先把她代碼審計(jì)一遍萌壳,審計(jì)完了多多少少可能會(huì)有一些安全問題亦镶,或者說有些不規(guī)范的問題。你拿著這個(gè)代碼去跟他說袱瓮,你不要直接上來缤骨,對(duì)案例那樣不是不好的,很多人可能就不樂意聽尺借。那么第二個(gè)就是要貼近他的業(yè)務(wù)場(chǎng)景绊起,剛才也講到了,那做 TCP 的你給他講 HTTP 他不樂意聽他燎斩,我壓根就沒有這個(gè)業(yè)務(wù)虱歪,你給我講啥呢蜂绎?第三個(gè)就是多分享故事的一個(gè)形式去形成一個(gè)互動(dòng)的氣氛。比如說你在給他做培訓(xùn)的時(shí)候笋鄙,你給他講越全的時(shí)候荡碾,那你就講以前了,可能你挖過某個(gè)網(wǎng)站的一個(gè)預(yù)存漏洞局装,你是怎么發(fā)現(xiàn)的坛吁,以及你可能在網(wǎng)上了看到過別人的一些案例,那這些分析步驟了你可以給他講一下铐尚。
你比如說我發(fā)現(xiàn)了這樣一個(gè) URL 的 ID 等于100拨脉,那么我覺得想試一下,我把這個(gè) 100 了改成 101 在 URL 地址欄當(dāng)中回車一下宣增。發(fā)現(xiàn)看到了別人的一個(gè)信息玫膀,也發(fā)現(xiàn)了別人訂單信息,發(fā)現(xiàn)了別人的一個(gè)個(gè)人用戶信息以及其他的一些權(quán)限信息爹脾,多以這種故事的形式給他去交流帖旨,我覺得是效果非常不錯(cuò)的。
2.3 案例就地取材
第三個(gè)就是案例就地取材灵妨。那很多時(shí)候我們給 A 組的同學(xué)去做這個(gè)分享的時(shí)候了解阅,那他不一定了有他們這個(gè)組的一個(gè)漏洞案例。這個(gè)時(shí)候我覺得你一定是就近的泌霍,你可以講他們部門的對(duì)吧货抄,可以給他講這個(gè)整個(gè)公司的。然后這個(gè)案例就是盡量靠近他們這個(gè)團(tuán)隊(duì)朱转。那么你怎么取這些案例呢蟹地?我們知道在 2016 年以前,這些互聯(lián)網(wǎng)當(dāng)中有很多這種漏洞案例藤为,包括各個(gè)大公司的一些漏洞案例都是有的怪与。但在 2016 年 6 月 1 號(hào)之后,我們基本上看不到了缅疟,為什么網(wǎng)絡(luò)安全法出來了分别,所以很多這種比較直觀的漏洞案例了,我們現(xiàn)在沒有辦法窿吩,說很輕松的拿到了茎杂。這個(gè)時(shí)候了,你可以從三個(gè)渠道取了纫雁。
第一個(gè)說你在平時(shí)做代碼審計(jì)的時(shí)候煌往,你把這些案例了給存起來,截好圖。然后把敏感信息的打個(gè)碼刽脖。但是把意思大概說明白羞海,把這些案例給整理起來。第二個(gè)就是從安全測(cè)試當(dāng)中曲管,我們每一次業(yè)務(wù)要上線了却邓,肯定會(huì)有一輪安全測(cè)試,把業(yè)務(wù)測(cè)試當(dāng)中發(fā)現(xiàn)了一些問題點(diǎn)院水,也可以整理起來腊徙,我們是有一個(gè)案漏案例庫的。第三個(gè)就是漏洞事件了檬某。那比如說一些通用型的一些漏洞事件撬腾,像那個(gè) 2021 年年末的時(shí)候,是不是有個(gè) logic4 的這樣一個(gè)組件恢恼,我記得在快過年的前幾天了民傻,那個(gè)時(shí)候出了一個(gè)命令執(zhí)行的漏洞,那影響范圍還蠻大的场斑,那可以把這些事件了給它整理一下漓踢。你可以告訴他說你依賴了一些組件了,要及時(shí)升級(jí)漏隐。如果了你要引用一個(gè)組件了喧半,你要最好查一下它的版本有沒有漏洞,有漏洞的話你就不要使用了锁保。
一般來說我們 php會(huì)用 composer , Java會(huì)用另一個(gè)包管理器以及 Python 都會(huì)用包管理器薯酝,那么我們要及時(shí)去更新一下半沽,不要說我們打包一次爽柒,幾年我們都不更新,那樣很容易就會(huì)產(chǎn)生一個(gè)安全漏洞者填。
三浩村、 風(fēng)險(xiǎn)提醒
那接下來我們要講的就是風(fēng)險(xiǎn)實(shí)時(shí)提醒。那么我們給他做完培訓(xùn)之后占哟,我們有這個(gè)首次培訓(xùn)心墅,也有這個(gè)每個(gè)季度一次培訓(xùn),也有這些案例的一些講解對(duì)吧榨乎,我們還得有這個(gè)監(jiān)督的一個(gè)作用怎燥,就是他們寫完代碼之后,我們得及時(shí)去提醒他蜜暑,以及了我們每一個(gè)季度了我們有一次全面掃描等等這些信息铐姚。
3.1 風(fēng)險(xiǎn)提醒的作用
那首先我講一下這個(gè)風(fēng)險(xiǎn)提醒的一個(gè)作用,主要就是強(qiáng)化大家的一個(gè)提醒的意識(shí)肛捍。你不要講了之后就不提醒了隐绵,過不了一周兩周之众,他之前的代碼習(xí)慣了,該怎么寫還是怎么寫依许?你會(huì)發(fā)現(xiàn)你之前的培訓(xùn)白講了棺禾,你給他講了之后了沒有太大的改變。所以你要有提醒峭跳。
那實(shí)時(shí)提醒了我們可以在 git 的倉庫當(dāng)中做一個(gè)勾子事件膘婶,每一次它 push 代碼的時(shí)候,我們可以把他的代碼了給拿出來蛀醉,拿出來之后提取他改動(dòng)的行竣付,提取改動(dòng)出來的行了。然后我們來判斷一下他有沒有危險(xiǎn)函數(shù)等一些問題滞欠。那如果有這些問題了古胆,我們就給他反饋一下,就告訴他你哪個(gè)地方了可能會(huì)存在危險(xiǎn)筛璧。
提醒這件事了有三點(diǎn)意義逸绎。第一個(gè)就是加強(qiáng)他的安全意識(shí),讓他知道這個(gè)安全事情有人在管夭谤。第二個(gè)就是從源頭當(dāng)中去阻擋安全棺牧。但這個(gè)鉤子你不要說遇到這個(gè)危險(xiǎn)函數(shù)了,就直接給打回去朗儒。你可以在這個(gè) git 當(dāng)中給它返回一下颊乘,返回一個(gè)提示信息,告訴它這個(gè)地方可能存在風(fēng)險(xiǎn)醉锄,讓他去注意一下乏悄。比如說在命令執(zhí)行這個(gè)地方你放了一個(gè)變量,那么你需要確保你的變量是可控的恳不,是過濾了的給他這樣一個(gè)提示作用檩小。
第三個(gè)就是提升一下安全的反饋速度。那如果說你沒有這樣一個(gè)實(shí)時(shí)的提醒了烟勋,你每個(gè)兩周去給他這個(gè)倉庫全面掃描一次规求,那可能他代碼都上線了對(duì)吧?
3.2 風(fēng)險(xiǎn)函數(shù)提醒
風(fēng)險(xiǎn)函數(shù)我簡(jiǎn)單列了幾個(gè)函數(shù)卵惦,比如說這里了有這個(gè)代碼注入的阻肿,有這個(gè)執(zhí)行系統(tǒng)的命令的,有使用這個(gè)明文 FTP 下傳文件的沮尿,
還有一些加密庫以及一些正則庫丛塌,那這邊還有一些信息泄露的提醒。
你都可以放到你的這個(gè)安全風(fēng)險(xiǎn)提醒里面去。我覺得優(yōu)先級(jí)了姨伤,你可以把這些高危的了給大家放進(jìn)去哨坪。比如像 FTP 的,你可以看情況乍楚,你放不放都行当编。那像 pprof 了,我覺得你肯定得注意徒溪。那 PP info 里面還是有蠻重要的信息的以及 Golang 里面的忿偷,它直接使用了裸寫了這個(gè)語句以及讀取文件內(nèi)容以及執(zhí)行系統(tǒng)命令的這些危險(xiǎn)函數(shù)了,你都給它去提醒一下臊泌。
3.3 鉤子使用
那剛才說的這個(gè)勾子事件了怎么去使用了鲤桥?那其實(shí)這個(gè)勾子的原理主要就是在這個(gè) git 服務(wù)器當(dāng)中了,存放一個(gè)勾子的這這個(gè)腳本渠概,每次他 push 的時(shí)候了茶凳,服務(wù)器他會(huì)觸發(fā)這樣一個(gè)腳本。
觸發(fā)腳本的時(shí)候播揪,你就可以通過一些命令行了贮喧,你去獲取到他有哪幾個(gè)文件有改動(dòng),那改動(dòng)了一些行號(hào)了猪狈,你都能拿到箱沦。完了這些數(shù)據(jù)之后了,你把這個(gè)檢測(cè)的規(guī)則就剛才我提供的一些危險(xiǎn)函數(shù)雇庙,以及你自己去拓展一些谓形,把這個(gè)規(guī)則文件給它寫好凸舵。
第二個(gè)弄企,這個(gè)semgrep現(xiàn)在已經(jīng)比較流行了,已經(jīng)有很多這個(gè)團(tuán)隊(duì)在使用了惶凝,所以我覺得也是一個(gè)比較成熟的東西峡继,你可以通過 sum group 加上這個(gè)規(guī)則去檢測(cè)這個(gè)代碼冯袍,然后把這些風(fēng)險(xiǎn)給返回回來。那么具體的實(shí)現(xiàn)地址了碾牌,我之前寫了一篇文章,還是比較詳細(xì)的儡循,那大家可以去打開舶吗,然后按照操作了去實(shí)現(xiàn)就行了。
那這里我給大家展示一下這個(gè)鉤子了择膝,它會(huì)是一樣一個(gè)什么樣效果誓琼?比如說我在命令行當(dāng)中,我輸入了一個(gè) git commit 然后提交這個(gè)代碼,然后在推送的時(shí)候它就會(huì)觸發(fā)腹侣。那么在推送的時(shí)候叔收,我們可以看到他這邊告訴我哪個(gè)文件。那么它的行號(hào)傲隶,當(dāng)中有個(gè) EXEC 執(zhí)行了這個(gè) git 當(dāng)中的 A 這個(gè)變量饺律,那么它有可能會(huì)導(dǎo)致一個(gè)命令注入,那一定要確保內(nèi)容不是用戶隨意控制的跺株。那么這樣一個(gè)提示性的話語复濒,那具體了你可以去把這個(gè)界面了給它優(yōu)化一下也可以。
三乒省、 代碼審計(jì)
在代碼審計(jì)當(dāng)中我們也有四點(diǎn)可以給大家去分享一下的巧颈。
那首先我們代碼審計(jì)的方向,我們要怎么去審計(jì)呢袖扛?那這里就有一些偏技術(shù)型的話題了砸泛。那么有一句話叫文無第一,武無第二蛆封,相信做技術(shù)了也一樣晾嘶。
3.1 代碼審計(jì)方向
那么第一個(gè)就是通用編碼型這這個(gè)審計(jì)。那比如說我們可以審計(jì)這些這個(gè)sql注入娶吞、 XSS垒迂、 命令執(zhí)行、文件上傳等等這些妒蛇,那么我們可以通過通用型編碼升級(jí)出來机断。那么第二個(gè)我們得結(jié)合她的業(yè)務(wù)去審計(jì)。那比如說你只有有用戶的系統(tǒng)绣夺,你才有這樣一個(gè)用戶密碼找回以及一些權(quán)限方面的一些漏洞吏奸。
第三個(gè)就是組件型的一個(gè),那你要根據(jù)這個(gè)倉庫所使用的語言陶耍,比如說 php 的奋蔚,那用compose ,那 Java 的了烈钞,那用另外一種形式泊碑。那么把這些組件了,確定一下它使用的這個(gè)組件版本毯欣,然后來確定他是不是有幾個(gè)組件漏洞馒过。那具體了通用型編碼審計(jì)方法了。前面其實(shí)我也簡(jiǎn)單提了一下酗钞,其實(shí)主要從這三個(gè)方面去看吧腹忽。
第一個(gè)就是接收參數(shù)来累,如果說我這個(gè)地方接收了一個(gè) ID 我明確知道它是一個(gè)整形的。當(dāng)我接收的時(shí)候了窘奏,我沒有用整形去強(qiáng)制接收嘹锁。那在這種弱類型語言比如說 php 里面比較常見,那么你就可以去追蹤一下這個(gè)變量着裹,有沒有放到sql語句里面去執(zhí)行领猾,有沒有去返回到這個(gè)前臺(tái),有沒有可能放到這個(gè)命令執(zhí)行里面放在這個(gè)代碼執(zhí)行里面等等求冷。這些方式就是追蹤接收的參數(shù)瘤运,它沒有過濾,我們就一直追到底匠题,一直到這個(gè)程序結(jié)束拯坟。那么這是一種方式。
那么第二種方式就是關(guān)聯(lián)詞反常韭山。關(guān)聯(lián)詞反常了主要說我們可以去這些函數(shù)的地方看一下它里面放的是不是變量郁季,如果放的是變量,我們就追蹤這個(gè)變量的來源钱磅。那如果說這個(gè)變量是接收用戶的梦裂,并且沒有做過濾,然后放到這個(gè)危險(xiǎn)函數(shù)里面來盖淡,那么一定是有安全問題的對(duì)吧年柠?第三個(gè)就是我們?nèi)ソ馕鏊囊蕾囄募D敲茨壳皝碚f就是 PhP 了褪迟, Java Python 以及 go 它都有依賴包管理冗恨。所以我們現(xiàn)在去檢測(cè)它的依賴其實(shí)是比較好實(shí)現(xiàn)的,我們這里都可以去做一個(gè)味赃。當(dāng)然有一些它可能還是比較傳統(tǒng)的方式掀抹。比如說 PhP 在老版本了,在 PhP 7.0 以下了很多這個(gè)系統(tǒng)了心俗,他并不會(huì)使用 composer 他直接把這個(gè)源碼了直接下載到他的這個(gè)目錄下傲武。那這個(gè)時(shí)候你解析可能會(huì)比較麻煩。
3.2 工具選型
那么這個(gè)時(shí)候呢您得借助一些第三方的一些工具去分析出來城榛。說到這個(gè)代碼審計(jì)的一些工具選型了揪利,目前前這些我大部分都用過,比如說 fortify 吠谢,用的是比較熟練的土童。那么 check max 了這一款工具了,我還沒用工坊,因?yàn)檫€沒有買他們的第三款這個(gè)代碼衛(wèi)士的話是那個(gè)奇安信的献汗。那這一款我倒是用過一段時(shí)間。
第四個(gè)了王污,我目前用的是比較多的罢吃,主要是用在這個(gè)鉤子檢測(cè)當(dāng)中。審計(jì)系統(tǒng)當(dāng)中也用到了它的一些功能昭齐,但目前來說就是全量代碼審計(jì)了尿招,我還是比較喜歡用這個(gè)fortify。那么在這個(gè)鉤子事件的時(shí)候嘍阱驾,因?yàn)閒ortify帶它是那個(gè) AST 的這種語法分析就谜,它會(huì)比較吃內(nèi)存,而且反應(yīng)速度比較慢里覆,所以目前主要還是依賴與這個(gè) Sem group 那么第五款這個(gè) CodeQl 的 CodeQl 了這款工具了我前段時(shí)間還在了解丧荐,還沒有用到這個(gè)生產(chǎn)環(huán)境當(dāng)中,所以我也不太好說喧枷。
第六款工具了目前來說我用過虹统。的感受就是它是一個(gè)完全開源的,包括他的這個(gè)規(guī)則隧甚,包括他的這個(gè)引擎系統(tǒng)大家都開源了车荔,但他只能目前來說能檢測(cè) PhP 其他的后端語他不能檢測(cè)。所以目前我用的這個(gè) fortify 和 Sem group 比較多一些戚扳。 fortify 就是要商業(yè)的和check max 忧便,其實(shí)代碼衛(wèi)生也是商業(yè)的。 fortify 我目前來說還比較好用帽借,checkmax沒用過珠增,沒有太多發(fā)言權(quán)。
這個(gè) fortify 泛了我用過一段時(shí)間宜雀,去年十二月的時(shí)候切平。用過一個(gè)月。主要的感受就是它和福利范檢測(cè)出來漏洞數(shù)量是比較相似的辐董,但它的界面設(shè)計(jì)了點(diǎn)擊起來我感覺很不順暢悴品。據(jù)說這個(gè)今年 3 月份會(huì)有一個(gè)新版本,到時(shí)候大家也可以去試用一下他們的 SemGroup ,他的規(guī)則是 開源的简烘。然后它的這個(gè)引擎了它是加密的苔严。
第五個(gè)了 CodeQL 了。那 github 當(dāng)中就已經(jīng)大規(guī)模使用孤澎,當(dāng)然也可以去體驗(yàn)一下届氢。但是你只能用于學(xué)習(xí),不能用于商用覆旭。那現(xiàn)在我再來說一下就是批量代碼審計(jì)的一個(gè)實(shí)現(xiàn)方式退子。那目前就是幾款產(chǎn)品岖妄,其實(shí)它對(duì)單個(gè)單款庫的支持都還比較好。我在做甲方的時(shí)候會(huì)遇到這樣一個(gè)問題寂祥,那因?yàn)槲沂且獙?duì)整個(gè)公司的代碼庫的安全性了負(fù)責(zé)的荐虐,所以我不能說就檢測(cè)幾個(gè)倉庫的一些安全問題點(diǎn)。那時(shí)候我得批量去審計(jì)丸凭。那像我們公司可能有 600 多個(gè)倉庫福扬,一個(gè)一個(gè)打開,我得瘋掉惜犀,像 fortify 打開一個(gè)倉庫大的項(xiàng)目铛碑,它可能得一兩天。光審計(jì)起來可能得花個(gè)一年時(shí)間就讓他分析完虽界。所以如果用這種默認(rèn)方案其實(shí)不是太現(xiàn)實(shí)的汽烦。
3.3 批量代碼審計(jì)工具
所以我寫了一個(gè)批量代碼審計(jì)的一個(gè)工具,就是QingScan浓恳。那么它主要的作用它其實(shí)是包含了四部分刹缝,一部分就是信息收集,第二部就黑盒檢測(cè)颈将,第三部分就是代碼審計(jì)梢夯。那還有一個(gè)專項(xiàng)利用。那這里我主要提一下它這個(gè)白盒審計(jì)晴圾。那白貨審計(jì)它其實(shí)主要的目的就是把你的這個(gè)項(xiàng)目了給拉下來颂砸,然后調(diào)用這個(gè) fortify 以及這個(gè)sem group還有其他的一些代碼審計(jì)的一些工具了,對(duì)它進(jìn)行逐個(gè)掃描死姚。那么掃描完這個(gè)人乓,然后接著就掃描下一個(gè)。那么也可以分布式部署都毒。那目前來說我已經(jīng)在我們公司使用起來了色罚,也推薦給大家去試用一下,那么這個(gè)地址在這里
https://github.com/78778443/QingScan
四账劲、 安全測(cè)試
再就給大家分享一個(gè)安全測(cè)試當(dāng)中戳护,安全測(cè)試主要有這幾個(gè), web 站點(diǎn)測(cè)試瀑焦、API接口測(cè)試腌且、私有協(xié)議測(cè)試和案例輸出。
4.1 web站點(diǎn)測(cè)試
那這個(gè)web站點(diǎn)測(cè)試了其實(shí)我覺得還是比較常規(guī)的榛瓮,目前也沒有什么太大的一個(gè)技術(shù)難點(diǎn)
比如說測(cè)試個(gè)sql注入铺董、 XSS 但一般目前來說是個(gè)sql注入和 XSS 這些問題點(diǎn)已經(jīng)比較少了, XSS 可能是反射型 XSS 多一些禀晓,但是影響我覺得也不是太別大精续,因?yàn)楝F(xiàn)在都是那個(gè)cookie 加密的就是HTTP Only 另外這種形式坝锰,所以沒有太多可說的。
4.2 API接口測(cè)試
API 接口怎么測(cè)試了驻右? API 接口它和這個(gè) web 站點(diǎn)它有一些區(qū)別什黑。像 web 站點(diǎn)我們可能可以通過爬蟲的方式把那地址都爬蟲出來崎淳,然后再對(duì)這個(gè)地址進(jìn)行掃描堪夭。那掃描有結(jié)果了,我們就把這個(gè)驗(yàn)證一下拣凹,驗(yàn)證完之后然后提出來森爽。
那么 API 接口有個(gè)問題點(diǎn),就是我們沒辦法去爬蟲嚣镜。所以這個(gè)時(shí)候了我們通常打開一個(gè)xray的一個(gè)端口爬迟,用這個(gè)服務(wù)模式。然后手機(jī)了我們把這個(gè)端口指向xray的這個(gè)代理地址菊匿,然后我們?nèi)ゴ蜷_一些請(qǐng)求付呕,把這些地址收集起來,然后去掃描跌捆。同時(shí)我們還會(huì)有一個(gè) URL 地址的清單徽职,就是這個(gè)地址其實(shí)是開發(fā)那邊給我們提供的。然后這個(gè)功能測(cè)試那邊同學(xué)也有一份我們?cè)趯?duì)這個(gè)地址了去進(jìn)行這個(gè)邏輯進(jìn)行的一個(gè)測(cè)試佩厚,比如說越權(quán)以及這個(gè)支付漏洞等等這些方面的問題的檢測(cè)姆钉。
4.3 私有協(xié)議測(cè)試難點(diǎn)
第三個(gè)就是私有協(xié)議測(cè)試,那私有協(xié)議了其實(shí)測(cè)試起來是比較麻煩的抄瓦,比如說這個(gè)socket的協(xié)議潮瓶,那么 TCP 協(xié)議,那么我們其實(shí)是沒有辦法直接把這個(gè)數(shù)據(jù)包了給解析出來的钙姊,除非了我們得有一個(gè)模擬他們的客戶端毯辅。那目前來說只有幾個(gè)就是重點(diǎn)項(xiàng)目了,我們會(huì)和他們對(duì)一下這個(gè)端和服務(wù)端的數(shù)據(jù)的一個(gè)格式煞额,然后進(jìn)行模擬測(cè)試思恐。那這個(gè)工作量還是蠻大的。所以這個(gè)私有協(xié)議了立镶,看各位的這個(gè)人手夠不夠了壁袄,沒有太多好方法,只能去模擬這樣一個(gè)這個(gè)私有協(xié)議的客戶端媚媒。
那傳統(tǒng)的外部站點(diǎn)測(cè)出來是最簡(jiǎn)單的嗜逻,無非就是先收集地址,然后測(cè)試一下常規(guī)有沒有問題點(diǎn)缭召,然后對(duì)這個(gè)業(yè)務(wù)功能進(jìn)行測(cè)試一下栈顷。那業(yè)務(wù)功能也就是說我越權(quán)支付逆日,然后用戶密碼找回驗(yàn)證碼等等。好 API 接口了萄凤。那主要就是我們要把地址先拿到室抽,拿到地址之后其實(shí)其他的測(cè)試方法都差不多。那么拿了這個(gè)地址了靡努,我們有兩種方式坪圾。第一種說從開發(fā)團(tuán)隊(duì)那邊直接拿到一份 API 該的一個(gè)列表,然后并且搞得清楚他們每一個(gè)參數(shù)是做什么用的惑朦。然后對(duì)這些接口了去進(jìn)行一些掃描測(cè)試以及一些邏輯性測(cè)試兽泄,和傳統(tǒng)概念區(qū)別不大了。
第二個(gè)就是有可能我們從開發(fā)團(tuán)隊(duì)那邊拿了不全對(duì)吧漾月。所以我們可以用 reay 去打開一個(gè)端口病梢,會(huì)使用這個(gè) burp suite 打開一個(gè)端口。然后手機(jī)設(shè)置一下代理梁肿,把我們的數(shù)據(jù)包了從那邊經(jīng)過一下蜓陌,然后把這個(gè)地址也收集一批。第三個(gè)就是比較麻煩了吩蔑,剛才也講到了钮热,沒辦法輕易了解這個(gè)數(shù)據(jù)包的格式,然后比較麻煩哥纫。而且不好輕易去各做數(shù)據(jù)包霉旗,你必須通過程序的方式,你人工的是很沒有辦法去改數(shù)據(jù)的蛀骇。但有些數(shù)據(jù)它就是這個(gè)十六進(jìn)制的厌秒。那他不是說就是你看到的銘文說了你得模擬一個(gè)客戶端,用于封裝數(shù)據(jù)包擅憔⊥疑粒看你的這個(gè)人手夠不夠,人手不夠的話暑诸,測(cè)了也沒有太大意義蚌讼。
4.4 案例輸出
每次我們檢測(cè)出漏洞,或者遇到應(yīng)急響應(yīng)事件可以將它錄入到我們的安全系統(tǒng)中个榕,方便我們積累經(jīng)驗(yàn)
那這里有個(gè)圖篡石,就我們這個(gè)團(tuán)隊(duì)了,對(duì)公司的一些漏洞了一些整體情況西采。那有季度的一個(gè)報(bào)表凰萨,有這個(gè)部門的一個(gè)報(bào)表以及統(tǒng)計(jì)信息,就是它的漏洞類別的一些統(tǒng)計(jì)信息。
五胖眷、總結(jié)
那今天主要就分享這四點(diǎn)內(nèi)容武通,從這個(gè)培訓(xùn)到這樣一個(gè)鉤子的制作以及這個(gè)代碼審計(jì),那最后以及安全測(cè)試珊搀。那么這一次的話題就講到這里了冶忱,那希望對(duì)大家有所幫助。再見境析。
作者:湯青松
微信:songboy8888
日期: 2022年3月15日