iwebsec_代码执行漏洞
2024-11-29 12:56:40 # iwebsec

01-eval函数示例

在文件上传漏洞的时候想必已经学会了

02-assert函数示例

eval函数是差不多的,那我们对比一下区别

对于01,我们传参1=phpinfo()

image-20240415204533127

无结果

对于02,传参不变

image-20240415204604388

有结果

区别在于,eval对语法要求严格,但是assert对语法没那么严格

03-call_user_func函数示例

下面是一个简单的示例,演示了如何使用 call_user_func() 调用一个函数:

1
2
3
4
5
6
function myFunction($param) {
echo "Hello, $param!";
}

// 使用 call_user_func() 调用函数
call_user_func('myFunction', 'World');

注意事项

  • 在使用 call_user_func() 时,应确保传递正确的回调函数并且参数数量匹配,否则可能会导致错误。
  • 自 PHP 7.0 开始,call_user_func() 的性能已经优化,但仍建议谨慎使用,避免过度使用带来的复杂性。

总的来说,call_user_func() 是一个强大的工具,可以使代码更加灵活和动态,但在使用时需要注意参数和回调函数的正确性,以避免出现意外错误。

简单的用法就是call_user_fun(func_name,param)

04-call_user_func_array函数示例

call_user_func_array() 函数与 call_user_func() 函数类似,不同之处在于它接受一个数组作为参数,该数组包含了要调用的回调函数及其参数。这使得可以动态地传递任意数量的参数给回调函数。

下面是一个示例演示如何使用 call_user_func_array() 函数:

1
2
3
4
5
6
7
8
9
function sum($a, $b) {
return $a + $b;
}

// 使用 call_user_func_array() 调用函数
$parameters = [2, 3];
$result = call_user_func_array('sum', $parameters);

echo "The result is: $result"; // 输出:The result is: 5

在上面的示例中:

  • 我们定义了一个名为 sum 的简单函数,接受两个参数并返回它们的和。
  • 创建了一个包含参数 [2, 3] 的数组 $parameters
  • 使用 call_user_func_array('sum', $parameters) 调用了 sum 函数,并将参数 [2, 3] 动态传递给它。
  • 最后输出了计算结果 5

通过 call_user_func_array() 函数,我们可以以灵活的方式传递参数给回调函数,特别适合当参数数量不确定时或者希望从数组中动态获取参数时使用。

1
2
3
4
5
6
7
8
9
10
11

<?php
if(isset($_POST['fun'])||isset($_POST['arg'])){

call_user_func_array($_POST['fun'], $_POST['arg']);
}else{
exit();
}

?>

$_POST['arg']得到的其实就是一个数组

05-create_function函数示例

create_function() 函数在 PHP 中用于创建一个匿名函数,其语法相对简单。然而,在 PHP 7.2 版本中已被弃用,并且在 PHP 8.0 版本中已移除。

以下是 create_function() 函数的基本语法和示例:

1
string create_function ( string $args , string $code )
  • $args 是一个包含参数列表的字符串,例如 'param1, param2'
  • $code 是要执行的代码块作为字符串,例如 'return $param1 + $param2;'

示例:

1
2
3
4
5
6
// 创建一个匿名函数来计算两个数的和
$sumFunction = create_function('$a, $b', 'return $a + $b;');

// 调用这个匿名函数
$result = $sumFunction(2, 3);
echo "The sum is: $result"; // 输出:The sum is: 5

请注意,尽管 create_function() 在早期版本的 PHP 中很常见,但由于其使用不当可能导致安全漏洞(如代码注入),现在不推荐使用它。取而代之的是,建议使用匿名函数或闭包来完成相同的任务,因为它们更加安全和灵活。

如果您正在使用较新版本的 PHP(PHP 7.2 及以上),建议避免使用 create_function(),而是转向使用匿名函数或闭包。

看到提示其实是有一点懵的,看一下源码

1
2
3
4
5
6
7
8
9
10
11
12

<?php
if(isset($_GET['id'])){

$id = $_GET['id'];
$code = 'echo '.$func.'test'.$id.';';
create_function('$func',$code);
}else{
exit();
}

?>

没看源码真不知道要干啥,题目是想我们绕过,首先1;}会把code的内容完成闭合,这时候phpinfo();就可以被函数执行

06-array_map函数示例

array_map() 函数在 PHP 中用于将指定的函数应用到数组的每个元素上,并返回一个新的数组,其中包含经过指定函数处理后的元素。

以下是 array_map() 函数的基本语法和示例:

1
array array_map ( callable $callback , array $array1 [, array $... ] )
  • $callback 是要应用于每个数组元素的回调函数。
  • $array1 是要处理的输入数组。
  • 可以传入多个数组作为参数,如果传入了多个数组,则回调函数会接受相同位置的元素作为参数。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 定义一个回调函数来计算平方
function square($n) {
return $n * $n;
}

// 输入数组
$numbers = [1, 2, 3, 4, 5];

// 使用 array_map() 将回调函数应用到数组中的每个元素
$squaredNumbers = array_map('square', $numbers);

// 输出处理后的数组
print_r($squaredNumbers);

在这个示例中:

  • 我们定义了一个名为 square 的函数,它接受一个数字并返回其平方值。
  • 创建了一个输入数组 $numbers 包含 [1, 2, 3, 4, 5]
  • 使用 array_map('square', $numbers) 对输入数组中的每个元素应用 square 函数,得到每个元素的平方值。
  • 最后通过 print_r() 函数输出处理后的数组。

array_map() 提供了一种简洁而强大的方式来对数组中的每个元素应用某个函数,使得代码更具可读性和灵活性。

07-preg_replace无漏洞函数示例

上源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14

```
<?php
if(isset($_GET["name"])){
$subject= 'hello hack';
$pattern = '/hack/';
$replacement = $_GET["name"];
echo preg_replace($pattern, $replacement, $subject);
}else{
exit();
}

?>
```

将我们的输入替换掉原来的hack

08-preg_replace漏洞函数示例

1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET["name"])){
$subject= 'hello hack';
$pattern = '/hack/e';
$replacement = $_GET["name"];
echo preg_replace($pattern, $replacement, $subject);
}else{
exit();
}

?>

该函数的漏洞为,当$pattern\ \e时,存在代码执行漏洞,$replacement会被当作php代码执行

?name=system(ls)

image-20240415231250421

09-可变函数漏洞示例01

也是奇奇怪怪的,上源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
if(isset($_REQUEST['func'])){
function func1() {
echo "func1函数";
}
function func2($arg = '') {
echo "func2函数";
}
$func = $_REQUEST['func'];
echo $func();
}else{
exit();
}

?>

把我们传入的参数当作函数名,执行该无参数函数,并且输出该函数的返回值

10-可变函数漏洞示例02

看看源码找不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
if(isset($_REQUEST['func'])){
function func1() {
echo "func1函数";
}
function func2($arg = '') {
echo "func2函数";
}
function func3($arg){
echo "func3函数的参数是".$arg;
}
$func = $_REQUEST['func'];
$arg = $_REQUEST['arg'];
echo $func($arg);
}else{
exit();
}

?>

可传参,并且有输出,直接?func=system&arg=ls