文件上传
上传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:phpStudyApacheconfhttpd.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文件