代码执行与命令执行漏洞

代码执行与命令执行漏洞

代码执行漏洞

代码执行漏洞简介
概念:代码执行漏洞是指应用程序本身过滤不严,攻击者可以通过请求将代码注入到应用中,最终在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)subjectpatternreplacement使/ereplacement是代码时代码会执行。

<?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相同。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值