文件上传

上传Silic.php文件,发现不允许上传

查看源代码,发现在前端定义了允许上传的文件类型,而php不在其中

我们可以绕过前端,通过Burp代理修改文件类型
将Silic.php的扩展名先改为jpg,在上传的时候抓包,将filename="Silic.jpg"改为filename="Silic.php" 点击forword放包

文件上传成功,可以访问


和上面一样上传Silic.php,不允许上传,但是报错形式和上面不一样

查看网页源代码,可以看到前端并没有检测

查看后端代码,发现设置了可以上传的文件类型

所以,我们可以通过Burp代理抓包,修改content-type的类型为image/jpeg

放包,文件上传成功

有了上面两次的经验,首先上传Silic.php上传失败,抓包修改为Silic.jpg可以上传成功,但是无法执行。查看后端源代码

这里的strrchr函数的原理是从左往右查找,知道找到最后一个点和后面的扩展名,将最后这个扩展名和黑名单匹配,如果黑名单没有,即能上传成功。
问题来了,上传成功依旧不能执行,这里我们就要利用某些系统上的扩展名解析漏洞了。
(这里不能使用00截断,因为strrchr函数遇到00截断的空字符就不会继续往后读了,所以依旧是拿php文件匹配黑名单。具体00截断的原理见下方)
Apache2.0-2.2位置扩展名解析漏洞,它是从右往左开始判断扩展名来解析文件的,如果扩展名不被识别,就再往左判断,知道可以识别为止。
例如下面实验中上传的Silic.php.fff文件,这个文件的.fff后缀是Apache不可识别解析的,它就会往前判断,当识别到php时就会把这个文件当作php文件解析了。


查看后端源代码

getimagesize()函数会把文件内容读出来,通过识别文件头来判断真假图片。
把文件用文本编辑器打开,会有文件头,这个文件头就是判断文件的类型,所以即使改变了扩展名,里面的内容是不会变的。
真图片

假图片

遇到这种情况我们将一句话嵌入到图片中,构造图片马,上传图片,通过解析漏洞或其他方式将其还原。
构造图片马的命令

合成的图片马可以在代码的最后看到一句话木马

这里我们介绍下怎么利用解析漏洞将其还原
Apache.htaccess配置文件负责某一个目录下的网页配置,通过它可以实现分布式配置,可以实现网页301重定向,自定义404错误页面,改变文件扩展名,允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能,IIS平台上不存在该文件。
配置文件的开启
Linux: vim /etc/httpd/conf/httpd.conf
Windows:C:\phpStudy\Apache\conf\httpd.conf
修改配置文件

建立.htaccess文件,写入
AddType application/x-httpd-php .jpg
就可以实现将.jpg文件按照php解析执行

上传.htaccess文件到服务器目录,接着上传图片马,我将Silic.php和一张图片合成(两个文件在同一目录)


5、00截断
当服务器获取文件名时,如果Silic.phpp.jpg被更改为Silic.php0x00.fff时,认为00是截断符号,从而name=Silic.php,这里使用未作任何防护的一关
上传Silic.phpp.fff文件抓包,使用Hex查看。修改最后十六进制70为00

返回Raw中看,已经变为空符号,放包,发现上传成功,上传成功的是Silic.php文件

posted on
浙公网安备 33010602011771号