代码执行与命令执行漏洞
代码执行漏洞
代码执行漏洞简介
概念:代码执行漏洞是指应用程序本身过滤不严,攻击者可以通过请求将代码注入到应用中,最终在web服务器上去执行。类似我们常见的SQL注入,是将SQL语句带入数据库查询,而我们的代码注入,则是将代码注入到脚本中让应用对代码进行解析,其危害直接相当于一个WEB后门的存在!远程代码执行实际上就是调用服务器网站代码进行执行。
**原因:**由于服务端存在执行的函数,在使用的过程中没有做好一个严格的控制,造成了实际的参数在客户端中可控
1.eval()(静态调用)
把字符串 code 作为PHP代码执行。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
demo:
<?php
eval('echo "hello";');
?>
执行后就会输出一个hello
2.assert() (小于php7 动态调用)
判断是否为字符串,是则当成代码执行,实际它是php中的断言(就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。程序员断言在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作。)
低版本demo:
<?php assert($_POST['a']);?>
php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用.7.0之后的demo:
<?php
$a = 'assert';
$a(phpinfo());
?>
3.call_user_func()(第一个参数是被调用的回调函数,其余参数是回调函数的参数):
<?php
function barber($type)
{
echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
以上会输出:
You wanted a mushroom haircut, no problem
You wanted a shave haircut, no problem
4.call_user_func_array ()(把第一个参数作为回调函数调用,把参数数组作为回调函数的的参数传入):
<?php
$func = function($arg1, $arg2) {
return $arg1 * $arg2;
};
var_dump(call_user_func_array($func, array(2, 4))); /* As of PHP 5.3.0 */
?>
输出:int(8)
5.preg_replace()(执行一个正则表达式的搜索和替换):
preg_replace( $pattern, $replacement,
s
u
b
j
e
c
t
)
,
搜
索
s
u
b
j
e
c
t
中
匹
配
p
a
t
t
e
r
n
的
部
分
,
以
r
e
p
l
a
c
e
m
e
n
t
进
行
替
换
。
当
使
用
为
/
e
修
饰
时
,
subject ) ,搜索subject中匹配pattern的部分,以replacement进行替换。 当使用为/e修饰时,
subject),搜索subject中匹配pattern的部分,以replacement进行替换。当使用为/e修饰时,replacement是代码时代码会执行。
<?php
$a = 'phpinfo()';
$b = preg_replace("/abc/e", $a, 'abc');
?>
输出:phpinfo信息
6.array_map ()(为数组的每个元素应用回调函数 ):
<?php
$func = function($value) {
return $value * 2;
};
print_r(array_map($func, range(1, 5)));
?>
输出:
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)
7.array_filter() (依次将 array 数组中的每个值传递到函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变):
<?php
$entry = array(
0 => 'foo',
1 => false,
2 => -1,
3 => null,
4 => ''
);
print_r(array_filter($entry));
?>
输出:
Array
(
[0] => foo
[2] => -1
)
8.create_function():创建匿名函数(string create_function(string $args,string $code) args是要创建的函数的参数,code是函数内的代码
<?php
highlight_file(__FILE__);
$a = create_function('$code', 'echo $code');
$b = 'hello';
$a($b);
?>
9.usort() (使用自定义函数对数组进行排序):
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
输出:
0: 1
1: 2
2: 3
3: 5
4: 6
10.${} (中间的php代码将会被解析):
<?php
${phpinfo()};
?>
命令执行漏洞
概念:通过易受攻击的应用在主机上执行任意命令。
原因:用户可控点可以使用管道符进行命令拼接,参数点的过滤不严格,或者可以被绕过
1.system:可以执行系统命令并将其输出
<?php
$arg = $_GET['c'];
if($arg){
system("$arg");
}
?>
放入www/index.php下,访问http://127.0.0.1/index.php/?c=ipconfig 即可访问网卡信息
2.exec:执行命令,但无输出,可以使用output进行输出
<?php
$arg = $_GET['c'];
echo exec("$arg");
?>
放入www/index.php下,访问http://127.0.0.1/index.php/?c=ipconfig 即可访问网卡信息
3.passthru:执行unix系统命令并且现显示原始输出
使用情形:当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。
4.shell_exec、反引号()功能与exec相同。