00x01
Php代码执行有很多种函数与利用方式,但是目前常见的还是以下几种函数。
eval(),assert(),preg_replace(),call_user_func(),array_map()等等函数1.eval(),assert函数
这两个函数原本的作用就是用来执行动态执行代码,所以他们的参数直接就是php代码
测试代码:
[PHP] 纯文本查看 复制代码<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>
请求/Php.php?arg=phpinfo();结果如下
1.png (77.15 KB, 下载次数: 138)
2016-10-13 19:00 上传当然assert也是一样的
测试代码如下
[PHP] 纯文本查看 复制代码<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
assert("\$var = $arg;");
echo "\$var =".$var;
}
?>
无非就是把eval替换为assert罢了.
访问/Php.php?arg=phpinfo();效果如下,图就不上了,效果一样的
2.preg_replace函数
preg_replace函数主要的作用是对字符串进行正则处理,代码之下的时候需要存在/e参数,这个参数原本是用来处理字符串的,因此漏洞出现最多的是在对字符串的处理,比如URL,HTML标签等。
它的参数于返回如下
[PHP] 纯文本查看 复制代码mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
pattern即第一个参数的代码注射。
当magic_quotes_gpc=Off时,导致代码执行。
[PHP] 纯文本查看 复制代码<?php
echo $regexp = $_GET['reg'];
$var = 'phpinfo()';
preg_replace("/(.*?)$regexp", '\\1', $var);
?>
请求/Php.php?reg=/e结果如下
2.png (55.97 KB, 下载次数: 141)
2016-10-13 19:03 上传
第二段测试代码
[PHP] 纯文本查看 复制代码
preg_replace("/menzhi007/e",$_GET['h'],"jutst test");
?>
访问/Php.php?h=phpinfo()效果如下
3.png (85.8 KB, 下载次数: 156)
2016-10-13 19:04 上传3.动态函数执行
Php动态函数写法为“变量(参数)”
测试代码如下:
[PHP] 纯文本查看 复制代码<?php
$_GET['a']($_GET['b']);
?>
访问/Php.php?a=assert&b=phpinfo()效果如下
4.png (81.92 KB, 下载次数: 150)
2016-10-13 19:05 上传
第二段测试代码
[PHP] 纯文本查看 复制代码<?php
$dyn_func = $_GET['a'];
$argument = $_GET['b'];
$dyn_func($argument);
?>
访问/Php.php?a=system&b=ipconfig查看ip效果如下
5.png (34.71 KB, 下载次数: 159)
2016-10-13 19:06 上传
4.array_map()函数的代码执行
其实array_map()函数原理跟eval(),assert1()函数原理差不多
[PHP] 纯文本查看 复制代码<?php
$evil_callback = $_GET['a'];
$some_array = array(0, 1, 2, 3);
$new_array = array_map($evil_callback, $some_array);
?>
访问/php.php?a=phpinfo即可执行phpinfo
6.png (80.27 KB, 下载次数: 160)
2016-10-13 19:09 上传
同类型函数还有很多我举例一些
array_map()
usort(), uasort(), uksort()
array_filter()
array_reduce()
array_diff_uassoc(), array_diff_ukey()
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc(), array_intersect_uassoc()
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()
array_walk(), array_walk_recursive()
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()防范方法
1、尽量不要执行外部命令
2、使用自定义函数或函数库来替代外部命令的功能
3、使用escapeshellarg函数来处理命令参数
4、使用safe_mode_exec_dir指定可执行文件的路径
esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“'”,替换成“\'”,双引号“"”,替换成“\"”,分号“;”替换成“\;”
用safe_mode_exec_dir指定可执行文件的路径,可以把会使用的命令提前放入此路径内
[AppleScript] 纯文本查看 复制代码safe_mode = On
safe_mode_exec_di r= /usr/local/php/bin/