开头
最近几天,做到了一个关于关于命令注入的题目,奈何太菜,没做出来,于是到网上学习了一下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(
p
a
t
t
e
r
n
pattern
pattern,
r
e
p
l
a
c
e
m
e
n
t
replacement
replacement,
s
u
b
j
e
c
t
subject
subject)这个函数就是在subject里面匹配到pattern的部分,用replacement替换
例如:
<?php
$string = 'just a test';
$pattern = '/test/';
$replacement = 'lalalal';
echo preg_replace($pattern, $replacement, $string);
?>
输出:just a lalalal
这个函数注入点就是,有一个e的命令选项,可以将replacement 参数当作php代码执行 并返回结果。
pattern注入
<?php
$pattern = $_GET['p'];
$var = 'this is a test';
preg_replace("$pattern", 'phpinfo()', $var);
?>
payload:p=/test/e ,这时就会执行phpinfo();
replacement注入
<?php
$var = 'this is a test';
preg_replace("//e", $_GET['r'], "$var");
?>
payload: r=phpinfo()
subject注入
<?php
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['s']);
?>
payload:s=[php]phpinfo()[/php]
create_function()
官方文档解释是:
create_function ( string $args , string $code ) : string
Creates an anonymous function from the parameters passed, and returns a unique name for it.
根据传递的参数创建匿名函数,并返回其唯一名称。
例如:
$newfunc=create_function('$a,$b','return "a+b=".($a+$b);');
上面代码 就是创建了如下的函数:
function test($a,$b){
return "a+b=".($a+$b);
}
实例:
出现漏洞的代码块
<?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));
?>
这里的函数原型就是:
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 是被调用的回调函数,其余参数是回调函数的参数。
例子:
<?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() 数组数量,两者必须一样。
实例:
<?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代码注入和命令注入/
https://3wapp.github.io/WebSecurity/php_cmdinject.html