CTFer——文件操作与upload-labs解析

一、什么是webshell

webshell就是以aspx、php、jsp等网页文件形式存在的一种命令环境

也可以将其称为一种网页后门

 

黑客在入侵网站后,通常会将jsp、aspx或php后门文件与网站服务器web目录下正常的网页文件混在一起

然后就可以使用浏览器来访问后门文件,得到一个命令执行环境,以达到控制网站服务器的目的

 

二、分类

按照文件大小可以分为三类:大马 小马 一句话木马

 

三、一句话木马

<?php eval($_GET['cmd']);?>
<?php eval($_POST['cmd']);?>

get&post 表示客户端向服务端传递参数的两种方式,eval函数用来执行命令

 

四、文件上传漏洞:
上传文件时,如果服务器后端未对上传的文件进行严格的验证和过滤,就可能造成上传恶意文件的行为 

 

 

 

(1)客户端检测:就是在网页上写一段JavaScript脚本,校验文件上传的后缀名,有白名单形式也有黑名单形式

判断方式:在点击上传时便弹出对话框,指明可以传的文件格式,此时并没有发送数据包

 

Upload-labs 01:

点击上传后出现文件格式提醒

Solve1:直接在浏览器f12中的设置中禁用JavaScript 即可实现上传

不过在实战中直接禁用js插件会导致一些页面无法正常显示,还是存在着一些缺陷。

Solve2(常用)抓包截获 修改 发送:使用burpsuite工具抓包,直接修改后缀名为.php然后点击Forward即可完成上传

就是上传一个shell 用合法的后缀命名,抓包截获后在修改为正确格式,发送后即可实现上传

 

(2)服务端验证:MIME验证

通过检测http包中的Content-type字段中的值来判断上传文件是否合法,一般采用白名单的方式来进行检测

常见的CT值有

文本:text/plain、text/html、text/css、text/javascript、text/xml
图片:image/gif、image/png、image/jpeg
视频:video/webm、video/ogg
音频:audio/midi、audio/mpeg、audio/webm、audio/ogg、audio/wav
二进制:application/octet-stream、application/pdf、application/json
在表单中进行文件上传:multipart/form-data

Upload-labs 02:

上传一个1.php的shell文件,抓包后修改上传的文件类型

即修改Content-Type为image/gif 发送即可

 

(3)黑名单验证:

代码会有一个数组或者列表,该数组中包含一些非法的字符串,当数据包中包含时,

则认定该数据包是非法的。

如何确认:黑名单是有限的,可以随意构造一个文件后缀,如果可以上传,则证明是黑名单检测

 

绕过方式:

(1):图片+配置文件绕过:.htaccess文件,是apache服务器的一个配置文件,比如新建一个.htaccess文件

   <FilesMatch "webshell.png">
   setHandler application/x-httpd-php
   </FilesMatch>

通过该文件调用php的解析器去解析一个文件名中只要包含webshell.png这个字符串的任意文件

都会被解析为php的方式。测试时首先上传.htaccess文件 再上传webshell.png文件

upload-labs 03/04:

.htaccess 文件

   <FilesMatch " ">
   setHandler application/x-httpd-php
   </FilesMatch>

表示任意上传的文件都可以当作php文件来解析

先上传一个htaccess 再上传一个1.jpg 文件

1.jpg即被当成php文件解析

 

(2)大小写绕过:

上传后缀为大写字母的文件,利用windows对大小写不敏感

 

upload-labs 05:

 

strtolower($file_ext); //转换为小写 (未使用该函数)
因此可以将后缀改为1.Php 上传即可

(3)空格绕过:
如果服务器没有进行去空格处理,可以在后缀之后加空格绕过
upload-labs 06:
trim($file_ext); //首尾去空 (去空函数)
思路就是在文件后面加上空格,但由于windows特性,文件名后空格会被直接删除
不能直接上传.php后加空格,所以我们要用burp抓包然后再添加空格。
在1.php 之后加入空格即可
(4)点绕过
$file_name = deldot($file_name);//删除文件名末尾的点
没有该函数,可以在后缀之后加点 ,利用windows的特点,会自动去掉
后缀名最后的点,进行绕过
upload-labs 07:
和第六关一样,windows文件后缀名不能加’.',一样使用burp抓包然后后缀加一个点。

(5)::$DATA绕过:如果服务器没有对后缀名进行去::$DATA绕过,可以忽略,直接访问前面的文件名
upload-labs 08:
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
补充知识:php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,
不会检测后缀名,且保持"::$DATA"之前的文件名 他的目的就是不检查后缀名。

(6)后缀双写绕过:
将黑名单中的字符替换为空,比如php 可以用phphpp 这样就可以实现替换
upload-labs 10:
直接上传1.phphpp 上传成功

upload-labs 09:
本题没有循环验证 即对大小写去除空格的什么都只验证一次
filen​ame=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单
补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来
上传zoe.php 然后用bp改后缀加点空格点(即文件名为zoe.php. .)

 

posted @ 2024-02-03 22:10  Heck1ng  阅读(147)  评论(0)    收藏  举报