渗透学习之文件上传

文件上传

1、前台脚本检测扩展名

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

 

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

 

我们可以绕过前端,通过Burp代理修改文件类型

Silic.php的扩展名先改为jpg,在上传的时候抓包,将filename="Silic.jpg"改为filename="Silic.php" 点击forword放包

 

文件上传成功,可以访问

 

 

2、服务器验证Content-Type检测文件类型 

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

 

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

 

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

 

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

 

放包,文件上传成功

 

3、服务器端验证文件扩展名

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

 

这里的strrchr函数的原理是从左往右查找,知道找到最后一个点和后面的扩展名,将最后这个扩展名和黑名单匹配,如果黑名单没有,即能上传成功。

问题来了,上传成功依旧不能执行,这里我们就要利用某些系统上的扩展名解析漏洞了。

(这里不能使用00截断,因为strrchr函数遇到00截断的空字符就不会继续往后读了,所以依旧是拿php文件匹配黑名单。具体00截断的原理见下方)

Apache2.0-2.2位置扩展名解析漏洞,它是从右往左开始判断扩展名来解析文件的,如果扩展名不被识别,就再往左判断,知道可以识别为止。

例如下面实验中上传的Silic.php.fff文件,这个文件的.fff后缀是Apache不可识别解析的,它就会往前判断,当识别到php时就会把这个文件当作php文件解析了。

 

 

4、服务器端验证图片文件头

查看后端源代码

 

getimagesize()函数会把文件内容读出来,通过识别文件头来判断真假图片。

把文件用文本编辑器打开,会有文件头,这个文件头就是判断文件的类型,所以即使改变了扩展名,里面的内容是不会变的。

真图片

 

假图片

 

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

构造图片马的命令

 

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

 

 这里我们介绍下怎么利用解析漏洞将其还原

Apache.htaccess配置文件负责某一个目录下的网页配置,通过它可以实现分布式配置,可以实现网页301重定向,自定义404错误页面,改变文件扩展名,允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能,IIS平台上不存在该文件。

配置文件的开启

Linux: vim /etc/httpd/conf/httpd.conf

Windows:C:phpStudyApacheconfhttpd.conf

修改配置文件

建立.htaccess文件,写入

AddType application/x-httpd-php .jpg

就可以实现将.jpg文件按照php解析执行

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

 

500截断

当服务器获取文件名时,如果Silic.phpp.jpg被更改为Silic.php0x00.fff时,认为00是截断符号,从而name=Silic.php,这里使用未作任何防护的一关

上传Silic.phpp.fff文件抓包,使用Hex查看。修改最后十六进制7000

 

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

 

原文地址:https://www.cnblogs.com/heiwa-0924/p/12926579.html