文件上传知识+wp
ctfshow私教课第六节
文件上传
php的文件上传
在linux系统中,强制上传的文件会被放在/tmp/php??????的地方,使用匹配符的时候,就是/???/?????[@-[]来匹配
ctfshow私教课web42(基础之双写绕过)
经过尝试发现其将php替换为空,这里可以使用双写绕过
传入内容为一句话木马的图片,修改后缀为pphphp,上传后看到路径,使用蚁剑连接就可以拿到flag
也可以直接访问上传文件的路径,使用远程代码执行拿到flag
php的文件上传绕过
可以代替php的符号
php3 php5 phtml phps
1.双写绕过
原理是后缀替换为空时,我们通过提交1.pphphp替换php为空后,得到1.php,就可以成功写入木马
但是当题目是将php替换为txt或者其他字符时,我们就没办法使用双写进行绕过了
2.php文件上传的00截断(古老)
我们输入 hello world的时候,真正存储的是hello空格world\n\00
123.php 明显不让上传
123.php%00.jpg 那么后台判断的时候,取最后一个点后面的字符作为后缀.jpg看起来时合法的文件名称
到%00就会停止
./upload/123.php%00.jpg -> ./upload/123.php
这样的就进行了截断,就可以执行我们的恶意php代码
00字符截断需要的版本
php版本小于5.3.4
java版本小于7u40
3.iconv字符转换异常后造成了字符截断(古老)
php在文件上传场景下的文件名字符集转换时,可能出现截断问题
utf-8字符集 默认的字符编码范围为0x00-0x7f
iconv 转换的字符不在上面这个范围之内,低版本的php会报异常,报了异常以后,后续字符不再处理,就会造成截断问题
123.php%df.jpg -> 123.php
这样的就进行了截断,就可以执行我们的恶意php代码
php版本低于5.4才可以使用
4.文件后缀是白名单的时候的绕过
白名单:只准上传这几个后缀 因为匹配的内容少,所以限制的范围就大
黑名单:不准上传这几个后缀 因为匹配的内容多,所以限制的范围就小
web服务器的解析漏洞
1.apache 解析漏洞
- 多后缀解析漏洞(古老)
当我们上传apache不认识的后缀时,apache会继续往前找后缀,找到认识就解析执行
例如上传123.txt.ctfshow就会解析成123.txt文本文档
例如上传123.php.ctfshow就会解析成123.php交给中间件处理php脚本
- ImageMagic组件白名单绕过
目标主机安装了这个漏洞版本的ImageMagic插件 <=3.3.0
在php.ini中启用了这个插件
通过了php new ImageMagic对象的方式来处理图片时且php版本大于5.4时
满足上面的条件才可以使用,上传特定的svg图片,来实现组件的缺陷导致任意代码执行
2.nginx解析漏洞
基于错误的nginx配置和php-fpm配置,当我们访问
cgi.fix_pathinfo默认开启 123.txt/123.php 当123.php不存在时,会找/前面的文件进行php解析,这时候,就成功解析了123.txt
ctfshow私教课web43(nginx解析漏洞)
看到白名单只允许上传后缀为txt的文件,可以考虑nainx的解析漏洞,上传1.txt(这里用BP改后缀),然后访问1.txt/1.php,它会首先找1.php但是找不到,就会找/前面的1.txt进行php解析,就能够执行我们的一句话木马
拿到flag
3.iis解析漏洞
windows下使用 iis iis6.0版本中,如果解析的目录名字为xxx.asp 那么里面的所有文件,都会按照asp来解析
高级文件绕过
.htaccess和nginx.htaccess
如果存在上面的两个文件,写入就可以覆盖掉php.ini的内容
虚拟主机时代 一个物理服务器,里边存放着几十上百的网站,每个网站一个目录
每个网站需要的php.ini配置不同,不能共用一个,所以每个网站由可以自定义配置的文件,作用域仅限于自己目录,这个自定义的配置文件就是.htaccess和nginx.htaccess
在nginx下,默认使用.user.ini配置文件来进行php的配置
ctfshow私教课web44(.user.ini)
首先我们需要创造两个文件,.user,ini指向123.txt,在123.txt里写一句话木马,将两个文件上传就可以执行里面的一句话木马拿到flag
这里远程代码执行的时候,在原页面输入,不用再访问123.txt或者/user.ini
服务端内容检测
不局限于检测文件名,还会检测文件的后缀,文件的内容
例如检测到<?php,system,eval,$_POST就不让上传等等
ctfshow私教课web45(内容检测)
然后我们需要一个一个检测时哪个内容非法,经过尝试后,二分法确定出被检测的关键字,使用替代语法绕过,发现限制了php,POST,GET,?>
php可以使用短标签进行绕过
POST,GET可以使用REQUEST来代替,这里也可以使用COOKIE,然后在COOKIE里写入内容,就可以执行远程代码
?>这里是一个特性,最后一行,;和?>存在一个或者两个都存在就可以
这是使用COOKIE的做法
配合伪协议进行绕过+配合日志包含绕过
ctfshow私教课web46(php伪协议文件上传+日志包含)
首先将.user.ini文件的内容修改为php://input伪协议,上传.user.ini,访问原页,使用BP抓包,写入php代码拿到flag
这里也可以使用日志包含进行解题,将.user.ini的内容写入/var/log/nginx/access.log上传后写入一句话木马,就可以进行rce拿到flag
getimagesize函数绕过
getimagesize函数来检测是不是图片,而不采取其他措施的情况下,如果一旦绕过getimagesize函数,就可以实现任意文件上传
XBM格式图片
读到#define %s %d这些格式,就认为是XBM图片的高或者宽
%s要写width或者height
%d要写数字
ctfshow私教课web48(绕过getimagesize函数)
标准特征为
我们将.user.ini的内容加上定义的注释,伪装成图片进行绕过,这里用的是日志包含,也可以用php伪协议,感兴趣的可以自行尝试
上传后进行正常的日志包含就可以拿到flag
png二次渲染绕过
正常做法: move_uploaded_file 方式移动我们上传的临时文件到上传目录去
二次渲染做法: 通过imagepng方法来,来动态的二次生成一个png图片,里面的php代码就会被清洗掉
所以,我们需要使用特殊的方式,来构造我们的图片
1 |
|
这是修改png图片路径,写入一句话木马的php代码,在使用前需要先将文件夹中的.user.ini删除,没有的话,照常进行就可以,并且创造一个2.png(或者其他代码中的图片名,修改即可),然后在本地的php环境中访问这段代码,例如127.0.0.1/png_creater.php,就可以自动写入
显示空白是正常的,如果报错就是不正常的,就是没写入
ctfshow私教课web50(png二次渲染绕过)
上传文件测试后,仍然出现这个
使用绕过getimagesize的时候发现只允许上传png图片,考虑使用png二次渲染绕过
我们使用上面方法构造的png图片上传
我们在图片中写入的一句话木马为这里用0的代表system等函数,1就是要执行的命令,0使用GET传参,1使用POST传参
这里首先查看这张图片,然后使用BP进行抓包
抓包后,修改请求方式为POST,将原本图片中的信息复制到POST的后面view.php?image=3e35563210f995ee79a073fa882e1fd6.png&0=system,这后面的&0=system就是使用方法,再在BP中输入1=tac /*发送后,我们就拿到了flag
jpg二次渲染绕过
使用专用图来生成jpg木马,实现经过二次渲染后,我们的恶意代码依然能够保留在图片中,通过文件包含执行里面的php代码,参考png二次渲染