这篇文章虽然分析的是很多人看不上的 webshell,但是中间也夹杂着闪光点,闪光点主要在于 assert 函数的具体限制、call_user_func 函数为什么不能调用 eval 的分析、call_user_func 版本限制分析等。
webshell 就是以网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。
顾名思义,web
的含义是显然需要服务器开放 web 服务,shell
的含义是取得对服务器某种程度上操作权限。webshell 常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于 webshell 其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。
一句话木马、小马、大马都可以叫 webshell。
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。
小马体积小,容易隐藏,隐蔽性强,最重要在于与图片结合一起上传之后可以利用nginx或者IIS6的解析漏洞来运行,不过功能少,一般只有上传等功能。在一些存在上传文件体积限制的情况下,比如当前功能做了上传文件限制,只允许上传10k以内的文件,小马一般只有6k,这样就可以绕过此上传点的限制,利用小马再上传大马(小马本身不限制上传文件的大小)。
大马功能丰富,体积大。
以 PHP 为例。
一句话木马的原理是利用了 PHP 中的 eval()。
注: eval 是因为是一个语言构造器而不是一个函数,后面会具体解释。
PHP eval() 把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾
。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
如图,eval() 执行 system("DATE")。一个PHP文件中,eval执行完就会离开,所以不会执行到第二句eval函数。
注意:必须加上 system(),sys
要运行此 Python 版本的 Webshell,需要应用服务器以 CGI 方式支持 python 文件。
先配置 Apache 的配置文件 httpd.conf 使其支持 CGI,因为我使用的是 phpstudy,所以如下设置:
DocumentRoot "D:\phpStudy\PHPTutorial\WWW"
<Directory />
Options +Indexes +FollowSymLinks +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
让 Apache 识别 .py 文件为 CGI 程序:
AddHandler cgi-script .cgi .pl .py
只允许在特别目录下执行cgi程序:
ScriptAlias /cgi-bin/ "D:/phpStudy/PHPTutorial/Apache/cgi-bin/"
以上就完成了 Apache 对于 CGI 的支持的配置。测试一下:
使用 Python 创建第一个 CGI 程序,文件名为 test.py
,文件位于 D:\phpStudy\PHPTutorial\Apache\cgi-bin
目录中,内容如下:
#!C:\Python27\python2.exe
# -*- coding: UTF-8 -*-
print "Content-type:text/html"
print # 空行,告诉服务器结束头部
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello World - CGI 测试!</title>'
print '</head>'
print '<body>'
print '<h2>Hello World! 输出这句话说明测试成功</h2>'
print '</b