php代码执行漏洞审计,[SaFeBug][代码审计]常见WEB漏洞代码层原理分析及利用方式之Php代码执行篇...

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();结果如下

8f3ff2fbfdd7c7c8339951a6542705fa.gif

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结果如下

8f3ff2fbfdd7c7c8339951a6542705fa.gif

2.png (55.97 KB, 下载次数: 141)

2016-10-13 19:03 上传

第二段测试代码

[PHP] 纯文本查看 复制代码

preg_replace("/menzhi007/e",$_GET['h'],"jutst test");

?>

访问/Php.php?h=phpinfo()效果如下

8f3ff2fbfdd7c7c8339951a6542705fa.gif

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()效果如下

8f3ff2fbfdd7c7c8339951a6542705fa.gif

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效果如下

8f3ff2fbfdd7c7c8339951a6542705fa.gif

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

8f3ff2fbfdd7c7c8339951a6542705fa.gif

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/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值