开头

最近几天,做到了一个关于关于命令注入的题目,奈何太菜,没做出来,于是到网上学习了一下php命令注入,这里只是对于自己学习的一个记录过程,不喜勿喷。

命令注入

命令注入攻击通常是指:用户输入未作严格过滤,导致提交的内容传入某些函数会被当做系统命令执行。

常用函数

eval(),assert(),preg_replace(), create_function(), call_user_func(), call_user_func_array(),array_map(),反引号() 等函数

eval(),assert()

<?php@eval($_GET["cmd"]);?>
<?php @assert($_GET["cmd"]);?>
payload: xxx.php?cmd=phpinfo(); 这里没有任何过滤,可以执行任意命令

preg_replace()

preg_replace($pattern$,$replacement$,$subject$)这个函数就是在subject里面匹配到pattern的部分,用replacement替换
例如:

1
2
3
4
5
6
<?php 
$string = 'just a test';
$pattern = '/test/';
$replacement = 'lalalal';
echo preg_replace($pattern, $replacement, $string);
?>

输出:just a lalalal
这个函数注入点就是,有一个e的命令选项,可以将replacement 参数当作php代码执行 并返回结果。

pattern注入

1
2
3
4
5
<?php
$pattern = $_GET['p'];
$var = 'this is a test';
preg_replace("$pattern", 'phpinfo()', $var);
?>

payload:p=/test/e ,这时就会执行phpinfo();

replacement注入

1
2
3
4
<?php
$var = 'this is a test';
preg_replace("//e", $_GET['r'], "$var");
?>

payload: r=phpinfo()

subject注入

1
2
3
<?php
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['s']);
?>

payload:s=[php]phpinfo()[/php]

create_function()

官方文档解释是:

1
create_function ( string $args , string $code ) : string

Creates an anonymous function from the parameters passed, and returns a unique name for it.
根据传递的参数创建匿名函数,并返回其唯一名称。
例如:

1
$newfunc=create_function('$a,$b','return "a+b=".($a+$b);');

上面代码 就是创建了如下的函数:
function test($a,$b){
return "a+b=".($a+$b);
}

实例:

出现漏洞的代码块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

error_reporting(0);

$sort_by = $_GET['sort_by'];

$sorter = ‘strnatcasecmp’;

$databases=array(’1234′,’4321′);

$sort_function = ‘ return 1 * ‘ . $sorter . ‘($a["' . $sort_by . '"], $b["' . $sort_by . '"]);’;

usort($databases, create_function(‘$a, $b’, $sort_function));

?>

这里的函数原型就是:

1
2
3
function test($a,$b){
return 1 * ‘ . $sorter . ‘($a["' . $sort_by . '"], $b["' . $sort_by . '"]);
}

payload:sort_by=”]);}phpinfo();// 这样 就可以成功逃逸 执行phpinfo()
在这里插入图片描述

call_user_func/call_user_func_array/array_map

call_user_func()

call_user_func: 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。
例子:

1
2
3
4
5
<?php
$func='assert';
$para='phpinfo()';
call_user_func($func,$para);
?>

在这里插入图片描述
这里assert函数就会将phpinfo()成功执行
这里,call_user_func函数,在一个案例中运用到,和反序列化一起使用,详细的可以看:
http://www.freebuf.com/column/161798.html

array_map()

返回数组,是为 array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。
实例:

1
2
3
4
5
<?php
$evil_callback = $_GET['callback'];
$some_array = array(0, 1, 2, 3);
$new_array = array_map($evil_callback, $some_array);
?>

payload: callback=phpinfo在这里插入图片描述

反引号(

反引号的本质就是在操作系统执行该命令。此时可以造成命令注入等各种危害
实例:
在这里插入图片描述

END

先总结这么多,以后在碰到,在补充进来,参考链接:https://www.freebuf.com/column/166385.html
http://www.beesfun.com/2017/04/18/PHP%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5%E5%92%8C%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5/
https://3wapp.github.io/WebSecurity/php_cmdinject.html