Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

文件上传漏洞

文件上传漏洞有两个利用途径:一是直接上传可执行文件(如 PHP)以获取 webshell;二是上传包含 PHP 代码的文件,通过文件包含获取 webshell。

常见绕过方法

客户端校验绕过

文件扩展名检测绕过

  • 大小写绕过pHp
    • 检查时忽略大小写
  • 双写绕过phphpp
    • 替换为空,替换后新的字符串为 preg_replace(,'')
  • 罕见后缀
    • ^.ph(p[3457]?|t|tml|ps)$
  • 解析特性
    • 1.php.666
    • /1.jpg/1.php

文件截断绕过

CVE-2006-7243

PHP before 5.3.4 accepts the \0 character in a pathname, which might allow context-dependent attackers to bypass intended access restrictions by placing a safe file extension after this character, as demonstrated by .php\0.jpg at the end of the argument to the file_exists function.

Content-Type检测绕过(MIME绕过)

Content-Type是一个 HTTP 头部字段,用于指示资源的原始媒体类型。MIME是媒体类型的一种标准。Content-Type字段使用MIME来表示媒体类型,是使用MIME的具体方式。

MIME类型的结构包括类型子类型两部分,中间用斜杠/分割。点击进一步了解

Content-Type检测绕过方法为,直接修改为image/png , text/plain等。

  • getimagesize
    • 在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码

文件内容绕过

  • 文件头检测
    • GIF89a
  • PHP语言标记检测,在PHP 7以前版本,通常使用脚本标记<script language="php"></script>绕过

制作图片马

图片马是指在正常图片中嵌入可执行代码,表面上看起来仍是正常图片。常用制作方法如下:

  • 拼接图片和代码
<#
copy 是 Windows 命令行中的复制命令
/b 表示以二进制模式复制文件
1.jpg+1.php 表示将 1.jpg 和 1.php 文件的内容合并
2.jpg 是合并后生成的新文件名
#>
copy /b 1.jpg+1.php 2.jpg
  • 修改图片的元数据

将指定的 PHP 代码作为注释添加到 img.png 图片。

exiftool -Comment="<?php ... ?>" >> img.png

条件竞争

先保存文件,再检测文件内容。利用时间差,访问文件。

?> TODO 例题

从文件上传到其他漏洞

Zip/Tar文件上传后自动解压缩

php-gd渲染绕过

练习题

  • upload labs
  • SUCTF 2019 Checkin
  • GXYCTF2019BabyUpload
  • HarekazeCTF2019 Avatar Uploader

经典赛题分析