?web應(yīng)用中,有時(shí)候程序員為了考慮靈活性,簡(jiǎn)潔性,會(huì)在代碼中調(diào)用代碼或執(zhí)行命令執(zhí)行函數(shù)去處理。
比如當(dāng)應(yīng)用在調(diào)用一些能將字符串轉(zhuǎn)化成代碼的函數(shù)時(shí),沒有考慮用戶是否能夠控制這些字符串,將代碼執(zhí)行漏洞,同樣調(diào)用系統(tǒng)命令處理,將造成命令執(zhí)行漏洞。
?危害是執(zhí)行腳本代碼,
?危害是執(zhí)行系統(tǒng)命令,系統(tǒng)命令就是命令提示符可以執(zhí)行出來的語句,比如ip config就能查詢到電腦的IP,系統(tǒng)命令可以做很多事情,影響到電腦。
執(zhí)行腳本代碼和執(zhí)行系統(tǒng)命令,
代碼執(zhí)行是圍繞著腳本語言來講的,如果是php的腳本,就能執(zhí)行出php的一些腳本命令,java網(wǎng)站的就執(zhí)行java的腳本命令。而命令執(zhí)行是圍繞著操作系統(tǒng)來的,Linux的就就是linux語句,Windows就Windows語句。
用php代碼的案列演示一下
寫一串簡(jiǎn)單的代碼
?eval的意思時(shí)會(huì)把括號(hào)里面的字符串當(dāng)作代碼去執(zhí)行,然后我現(xiàn)在去訪問一下,給x傳遞一個(gè)值phpinfo去訪問一下試試
在測(cè)試一下,傳遞x值為echo 123?
?結(jié)果就輸出個(gè)123。
把代碼里面eval換成system,然后執(zhí)行輸出出來
system就是會(huì)把字符串當(dāng)作系統(tǒng)命令去執(zhí)行
?然后輸入一個(gè)系統(tǒng)命令,查看ip地址的
?這個(gè)就屬于命令執(zhí)行。
漏洞的產(chǎn)生分兩種情況,第一種情況是根據(jù)現(xiàn)實(shí)的應(yīng)用情況,第二種情況是網(wǎng)站代碼里面的情況,
先說代碼層面,
漏洞形成條件:可控變量(通過傳遞參數(shù)可以改變變量值),漏洞函數(shù)(使用的那個(gè)函數(shù)對(duì)這個(gè)變量進(jìn)行操縱,剛剛演示了一個(gè)eval的函數(shù)字符串當(dāng)作代碼去執(zhí)行,system是調(diào)用php去執(zhí)行系統(tǒng)命令,他們最后做出的漏洞,一個(gè)是代碼執(zhí)行一個(gè)是系統(tǒng)命令,如果將函數(shù)換成文件上傳類函數(shù),文件提交或者輸出函數(shù)就會(huì)造成不同的漏洞,)
所以漏洞的類型由來的函數(shù)決定,漏洞是否存在將由可控變量來決定。缺一不可
網(wǎng)站源碼是有類型分類的,有的就是購物,有的就是文件上傳,或者社區(qū)論壇,因?yàn)轭愋筒灰粯?,網(wǎng)站程序員寫代碼的時(shí)候也會(huì)喲區(qū)別。比如說是文件管理的網(wǎng)站,它的代碼就是以文件管理為主,而他的可能產(chǎn)生的漏洞也是文件下載或者上傳的漏洞比較多一些。所以網(wǎng)站的應(yīng)用決定漏洞的走向。
rce的漏洞比其他網(wǎng)站的幾率要小,根據(jù)網(wǎng)站的漏洞去判斷可能出現(xiàn)上面漏洞,比如一個(gè)單純的新聞網(wǎng)站就不可能出現(xiàn)代碼執(zhí)行。
關(guān)于漏洞檢測(cè)分為兩個(gè)方向,白盒和黑盒
白盒就是你知道對(duì)方網(wǎng)站的源碼,相關(guān)信息,黑盒就是啥都沒有,
白盒有源碼我們就可以在源碼中分析有沒有這個(gè)漏洞,叫做代碼審計(jì)。黑盒方向沒有對(duì)方源碼我們就可以用一下漏掃工具,之外還可以去找利用一些網(wǎng)上的公開漏洞,剛好公開的漏洞和他是對(duì)應(yīng)的,他所說的程序和版本漏洞,我們就可以用網(wǎng)上公開漏洞去檢查測(cè)它,第三種方法就是手工,根據(jù)對(duì)方的參數(shù)值和功能點(diǎn)去判定,拿老師的博客網(wǎng)站做演示
?這就是一個(gè)簡(jiǎn)單的博客網(wǎng)站,不可能會(huì)產(chǎn)生上面文件上傳的那種漏洞,然后參數(shù)值也是正常的123,如果參數(shù)值是echo 123,和php代碼一些東西有關(guān),就可能存在問題,就可以用phpinfo()去測(cè)試一下。
實(shí)戰(zhàn)中還可能參數(shù)值加密,然后解密之后還可以繼續(xù)測(cè)試。
#案列演示
打開墨者靶場(chǎng),黑盒#命令注入執(zhí)行分析
?這個(gè)功能點(diǎn)有這么個(gè)功能,進(jìn)行類似的像我們電腦上ping命令,這相當(dāng)于就滿足了命令,明顯可能出現(xiàn)命令執(zhí)行漏洞,可控變量和漏洞函數(shù)都存在。第一要去分析是什么操作系統(tǒng),
通過查看數(shù)據(jù)包分析出來了是linux操作系統(tǒng),然后如果輸入字符串的話網(wǎng)站會(huì)提示格式正確,所以網(wǎng)站還有一個(gè)檢測(cè)輸入的是不是ip地址,
?這時(shí)候我們可以使用Linux執(zhí)行多條的命令的符號(hào)? |? ?用這個(gè)符號(hào)連接起來ip再去操作
?這次的提示有一個(gè)組織測(cè)頁面更多對(duì)話框,這就是個(gè)前端驗(yàn)證,就可以右鍵源代碼去分析,
解決方法:1.瀏覽器設(shè)置禁用本地js 2.將網(wǎng)站源代碼復(fù)制,將驗(yàn)證的js代碼刪除3.抓包工具修改數(shù)據(jù)包(在數(shù)據(jù)包內(nèi)修改執(zhí)行語句,就不會(huì)被前端檢測(cè))
?這是個(gè)js代碼,這個(gè)檢測(cè)不是服務(wù)端的檢測(cè),onsubmit鼠標(biāo)事件之后,就會(huì)返回f-check-i開始檢測(cè)ip,我們把它禁用掉就會(huì)了,這個(gè)可以抓包,我們打開burp,然后輸入一個(gè)正常ip127.0.0.1,抓住數(shù)據(jù)包之后ip后面加上|ls,這個(gè)命令是查看所在文件夾目錄
就出現(xiàn)了,然后我們直接讀取文件里面的內(nèi)容,就能知道要提交什么,?
?|cat<文件名字,語句是這樣的,有時(shí)候空格不行可以換成%20試試,可能網(wǎng)站有檢測(cè)就換換別的,剛剛老師用ls 文件名和ls%20文件名,就沒有顯示出來。
#墨者靶場(chǎng),白盒代碼及命令執(zhí)行,
打開靶場(chǎng)
?
?在網(wǎng)上隨便找一個(gè)php在線運(yùn)行,然后運(yùn)行一下這個(gè)代碼,運(yùn)行一下看看,把eval去掉,去掉相應(yīng)的括號(hào)。然后echo輸出一下,把它運(yùn)行看一下,
變量request,是接受獲取POST或GET方式提交的數(shù)據(jù)、COOKIE信息,同時(shí)可以在代碼里看出來傳參數(shù)值是a。然后直接
?然后在進(jìn)行一個(gè)key的讀取就能獲取到完成靶場(chǎng)的東西了。
?這里就有一個(gè)問題,為什么用的ls,tac這種Linux的系統(tǒng)命令,是因?yàn)閑cho在Linux的里面的用法,echo `字符串`? 字符串是系統(tǒng)命令的的話就會(huì)執(zhí)行,實(shí)列如下圖。?
#墨者靶場(chǎng),黑盒rce漏洞檢測(cè)——公開漏洞
打開測(cè)試靶場(chǎng)
?那個(gè)webmin是啥啊,網(wǎng)上搜一下,網(wǎng)上說是linux的系統(tǒng)管理工具,那直接網(wǎng)上搜一下漏洞,看看有沒有西瓜吃,
有, 漏洞復(fù)現(xiàn)里面就用post數(shù)據(jù)發(fā)送給數(shù)據(jù)包就行
?然后在回到靶場(chǎng)解密,隨便輸入個(gè)賬戶密碼登陸抓住數(shù)據(jù)包之后,
根據(jù)網(wǎng)站的提示的數(shù)據(jù)包,更改一下地址然后修改下面的數(shù)據(jù)之后,直接發(fā)送,就會(huì)顯示出來所在文件夾目錄
?然后選擇只需要找到答案就行,根據(jù)靶場(chǎng)的目標(biāo)上寫著在網(wǎng)站的根目錄,所以就是把ls換成ls/就可以
?然后利用cat讀取,因?yàn)槭歉夸洠哉Z句是cat /key.txt,然后就可以看到了
?再利用這個(gè)公開的漏洞,要自己找到測(cè)試出來可以應(yīng)該修改的地方嗎,比如這個(gè)公開的漏洞,下面那串語句里面有一個(gè)id,然后獲取到的就是root,就是這種名字,所以判斷出來id是應(yīng)該修改且有效的地方。
#產(chǎn)生,就是這個(gè)網(wǎng)站會(huì)產(chǎn)生在哪些地方
第一種是網(wǎng)站程序源碼類
腳本代碼執(zhí)行的
thinkphp,eyoucms,wordpreess都產(chǎn)生過,會(huì)產(chǎn)生在web程序源碼中
中間件平臺(tái)也會(huì)產(chǎn)生,tomcat,apache struts2,redis,都產(chǎn)生過
其他環(huán)境也有,php-cci,jenkins-ci,java rmi,也有
系統(tǒng)命令執(zhí)行的
web源碼,nexus,webmin,elasticsearch,都產(chǎn)生過
中間件平臺(tái),weblogic,apache? 都產(chǎn)生過
其他環(huán)境,postgresql,samba,supervisord? 都有過
#javaweb-struts2框架類rcs漏洞-漏洞層面
演示一下中間件搭建平臺(tái),struts2
還是打開墨者靶場(chǎng)
?靶場(chǎng)說得很去,struts2,他是一個(gè)基于mvc設(shè)計(jì)的web應(yīng)用框架,隨便網(wǎng)上一找就有
?poc是驗(yàn)證代碼,exp是利用代碼,直接復(fù)制exp的代碼,后面命令寫個(gè)ls試試,
?然后讀取key.txt就可以了,
?這關(guān)其實(shí)是告訴你這個(gè)漏洞產(chǎn)生在多個(gè)層面。不僅網(wǎng)站源碼其他地方也會(huì)產(chǎn)生。
#rce漏洞防御
第一個(gè)就是waf產(chǎn)品,網(wǎng)上的一些防護(hù)軟件,第二種方法就是敏感函數(shù)禁用,第三種方法變量過濾或者固定,
第二種,對(duì)變量進(jìn)行過濾,但是命令是多樣性我們?cè)撊绾芜^濾它呢,他不想sql注入select有這種關(guān)鍵字,比如代碼執(zhí)行,它的代碼是多樣的,比如想要文件讀取有readfile或者fread各種各樣的函數(shù),執(zhí)行那么一個(gè)東西,各種各樣的命令去執(zhí)行一樣?xùn)|西,所以去防護(hù)關(guān)鍵值不現(xiàn)實(shí),所以我們對(duì)變量進(jìn)行控制,只讓她執(zhí)行某一個(gè)東西就行了,但是這種要根據(jù)實(shí)際情況。
還有一種就是敏感函數(shù)禁用。防止漏洞產(chǎn)生的根本條件,漏洞產(chǎn)生兩個(gè)條件,可控變量,敏感函數(shù),先說代碼執(zhí)行,我們以php為例,eval,assert,
?
?直接在網(wǎng)上代碼執(zhí)行漏洞函數(shù),防御就是把這些函數(shù)給禁用掉,使用到某個(gè)敏感函數(shù)就對(duì)變量進(jìn)行過濾,使用不到就直接禁用,同樣在代碼里面挖掘這個(gè)漏洞就找他有沒有對(duì)應(yīng)的敏感函數(shù),只有有才可能會(huì)產(chǎn)生。
#擴(kuò)展知識(shí)菜刀
菜刀一句話代碼執(zhí)行,
一句話執(zhí)行出那么多功能可能嗎?不可能。eval會(huì)把post(x)傳遞過濾的參數(shù)進(jìn)行執(zhí)行,抓包看一下
這個(gè)在執(zhí)行的時(shí)候,點(diǎn)開一個(gè)目錄的時(shí)候,其實(shí)就是他把這個(gè)功能性函數(shù)寫到這個(gè)程序里面去了,點(diǎn)開一個(gè)目錄的時(shí)候就相對(duì)應(yīng),就會(huì)向代碼發(fā)送一個(gè)功能性代碼過去,比如說我們要去讀取目錄,他就用php代碼去實(shí)現(xiàn)讀取那個(gè)目錄的php代碼發(fā)送到,變量里面,然后eval去執(zhí)行,文章來源:http://www.zghlxwxcb.cn/news/detail-465994.html
菜刀的原理就是把一些寫好的功能數(shù)據(jù)包,寫到工具里面去,然后用代碼去實(shí)現(xiàn)正常的收發(fā),然后去控制。文章來源地址http://www.zghlxwxcb.cn/news/detail-465994.html
到了這里,關(guān)于RCE代碼及命令執(zhí)行漏洞全解(30)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!