源码分析
首先第一行是以只读状态下以二进制方式打开文件
第二行是只读文件中的前两个字节
以第三行代码为例,如果文件的前两个字节经过十进制编码后是255216的话,那么文件类型就是jpg。下面同理,13780是png格式,7173是gif格式。
最后通过文件类型来决定是否能成功上传。
那么我们的思路就是修改文件的前两个字节进行绕过。
(此图为转载)
前期背景准备
注:这次实验我使用到了010 editor,可去官网进行下载。
首先将一句话木马转换为jpg格式,用记事本打开。在最前面输入两个占位,可以是空格或aa等,方便后面修改。
将木马文件用010 editor打开。右键→打开方式→editor
可以看到十六进制下的数据。如果不显示十六进制的话,点击view→edit as→hex。
可对文件开头的两个数据进行修改
尝试:如果此时将php类型的木马文件前两个字节改为白名单上的文件类型的话,upload靶场可成功上传文件,但网站按照修改字节后的文件类型进行解析,蚁剑不能成功连接。所以此时我们就要用到网页上的文件包含漏洞。
文件包含漏洞
$file = $_GET['file']通过get请求获得file请求中的内容
下面一行的if判断语句,如果文件内有数据就包含它,else没有数据就展示这个文件包含漏洞的源码。
它并没有对文件的内容进行过滤,且这个漏洞会将文件以php类型执行,所以可以利用该漏洞上传一句话木马。
实验过程
将木马文件用010 editor打开,我以jpg格式为例,修改前两个字节,ctrl+c保存后上传到upload靶场。
可成功上传。右键→新标签页打开图像。
复制后半部分url
打开文件包含漏洞,对木马文件进行包含。(可以使用phpstudy查看网站根目录,上一步上传的文件在upload文件夹之下,文件包含漏洞源码包含的是upload文件的上级目录,所以这里要用到./代表该级目录的下一级)
最后使用蚁剑连接,可成功链接。png和gif格式的同理可完成实验。