文件上传pass6后题解

写到最后烂一个尾吧

写的ex了 开始学文件包含去了  等那天文件上传考到我不会的了 我再来做

upload2

书接上回

pass-06

先尝试不去看源码 在以后做这种题我们大概率是不会知道源码的 这种黑名单的绕过我们就一个一个尝试 有没有这种字典能帮我直接去尝试

上传成功 这道题还是很简单的无非就是一个大小写绕过

小tips:你在桌面上正常创建一个文本文件,你的后缀如果是大小写写的 ,系统默认给你变成小写的 but php在去传输的时候的是可以识别到这个Php(无论你怎么大小写 让我们看看响应包)

但是是这样的 不晓得为什么 有懂的师傅谢谢解释一下

pass-07

超级简单的双写绕过

1

2

4.双写绕过

双写绕过的方式仅仅只适合服务端检测到黑名单后缀的时候,将文件名中对应后缀删除的情况

3

例如:我们上传一个a.php 服务端检测到黑名单后缀,把.php的后缀给删除了,这个文件名是a. 这个文件倒是能成功上传 到那时不会被解析成php文件了

pass-08

跟以前比deldot()函数没有了 没有删除点了 其实黑名单我们拿不到源码 我的理解是做黑名单的题只能一个一个去试 运气好有源码不晓得为什么啊 这个wp写着后面加一个.就能绕过 但是我加了绕不过 pass-09

前置知识:

在windows操作系统中,当你看到文件名后跟着"::$DATA"时候,它表示文件的一个附加数据流。数据流是一种用于在文件内部存储额外数据的机制

在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问,但是windows.NT文件系统支持在文件内部创建额外的数据流,以存储其他信息,这些额外的数据流可以通过在文件名后面添加"::$DATA"来访问

例如:"1.txt"是一个文件,"1.txt::$DATA"是这个文件的一个附加数据流,这样的数据流可以存储文件的元数据,备份信息,标签等大多数常规的文件操作工具不会意识到这些额外的数据流,而只会处理默认的数据流。要访问或操作这些附加数据流,通常需要使用特定的命令行工具或者编程接口有种寄生的感觉写入方法:

方法一:echo 内容>>文件名:数据流名

在cmd中打开输入 echo "你好">>1.txt:nihao

(notepad 1.txt 意思就是用记事本的方式去打开1.txt)

notepad 1.txt:nihao

方法二:type 2.txt>>1.txt:learn notepad 1.txt:learn

在php当中,文件的附加数据流是不会去验证后缀的,因为它仅仅表示是一个数据流,他会自动上传上去,它不验证文件的后缀绕过的原理是啥子?

111.php::$DATA 这个不检查,到window会自动把:: $DATA删掉就执行一句话木马了

http://upload-labs/upload/202407181411099399.php::$data 你去访问你会发现是这样的 你要是看到这在问为什么?你还是没有搞懂原理 搞懂原理你会把:: $data删掉

再次提醒你要记住访问你要上传的东西话 把::$删了 pass-10

去看上一篇的pass5的"方法万" pass-11

look look源码

获取文件名(trim) $file_name = str_ireplace( $deny_ext,"", $file_name);从这 $file_name寻找字符串数组 $deny_ext有没有一样的 替换成”“ 从左到右进行替换 str_ireplace函数的妈妈就是双写绕过,一双拖鞋框框的

拿下

pass-12

NULL

%00 (一个是在url编码 )

0x00 (你好 0x00php 输出出来就是你好)

%20也是空字符

1 $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upl oad_file']['name'],".")+1);

substr() 用于返回字符串的一部分。(第一部分指的是要处理的) strrpos()用于查找字符串中某个子字符串 后一次出现的位置

$file_ext被赋值成php

why 上传失败

因为这种漏洞已经没有啦 而且仅仅存在php5.2版本当中在一些 Web 应用中,当服务器收到一个 URL 请求时,它会按照 URL 路径解析请求并提取出文件名。

然而,由于 %00 被认为是字符串的结束符,因此当解析到文件名中的 %00 时,它会将其之前的字符串作为文件名进行解析,而忽略掉 %00 之后的内容。这就意味着,攻击者可以通过在文件名中插入 %00 字符,截断服务器解析路径,从而达到修改上传路径的目的。

例如,如果上传的文件名为 file.php%00.jpg,那么一些 Web 应用会将其解析为 file.php,而后缀 .jpg

则被忽略。如果上传路径为 uploads/,那么 终上传的位置就会变成 uploads/file.php,从而导致上传可执行文件成功

(原文链接:https://blog.csdn.net/RealIiikun/article/details/127905700)这一段说的好像看懂了又好像没看懂

pass-13

把%00改成000000

做法就是这么个做法 因为这个只有低版本才有呀 pass-14

pass2 到 pass13是是针对服务端进行检查后缀 从黑名单和白名单入手

前置知识:不同字符的格式

JPEG/JFIF (常见的图片格式):头两个字节为0xFF 0xD8

PNG (无损压缩格式):头两个字节为0x89 0x50

GIF (支持动画的图像格式):头两个字节为0x47 0x49 BMP (Windows位图格式):头两个字节为0x42 0x4D

TIFF (标签图像文件格式):头两个字节可以是不同的数值字节是计算机中存储和传输数据的基本单位 通常表示为一个8bit的二进制数字序列 00000000 在utf-8中 一个英文字符占一个字节 中文占三个字节

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

function getReailFileType($filename){

    $file = fopen($filename, "rb"); // 以二进制只读模式打开文件

    $bin = fread($file, 2); // 只读取文件的前两个字节     fclose($file); // 关闭文件

    $strInfo = @unpack("C2chars", $bin); // 将二进制数据转换为字符数组

    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); // 将字符数组转换为整数类型代码

    

    $fileType = ''; // 初始化文件类型变量     switch($typeCode){      

        case 255216: // JPEG 文件的二进制代码

            $fileType = 'jpg';             break;         case 13780: // PNG 文件的二进制代码

            $fileType = 'png';             break;                 case 7173:  // GIF 文件的二进制代码

            $fileType = 'gif';             break;

        default:    // 其他文件类型

            $fileType = 'unknown';     }     return $fileType; // 返回文件类型

}

 

$is_upload = false; // 初始化上传状态为未上传

$msg = null; // 初始化消息为空

 

// 检查是否有上传文件的操作

if(isset($_POST['submit'])){

    $temp_file = $_FILES['upload_file']['tmp_name']; // 获取上传文件的临时文件路径

    $file_type = getReailFileType($temp_file); // 获取文件的真实类型

 

    // 检查文件类型是否为未知

    if($file_type == 'unknown'){

        $msg = "文件未知,上传失败!"; // 设置错误消息

    }else{

        // 构造文件存储路径

        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$fi le_type;

39

40

41

42

43

44

45

46

        // 尝试移动上传的文件到指定路径

        if(move_uploaded_file($temp_file, $img_path)){

            $is_upload = true; // 设置上传状态为已上传

        } else {

            $msg = "上传出错!"; // 设置错误消息

        }

    }

}

意思就是我检查你传入文件的前两个字节来看有没有被禁止的

重点:单纯的图片马并不能直接和蚁剑连接,因为文件依然是用image格式进行解析的,只有用文件包含漏洞才能成功利用这个木马

所以别傻傻用蚁剑去连了 题目中给了你文件包含页面 打开用这个传参 ?file=你传进去的文件

嘛是文件包含漏洞?文件包含漏洞:是指代码中引入了其他文件作为php文件执行时候,没有对文件进行严格的过滤,导致用户指定任意文件,都作为 php文件解析执行

1Warning: include(): http:// wrapper is disabled in the server configura tion by allow_url_include=0 in 

2

3Warning: include(http://upload-labs/upload/5620240719140314.png):  fail ed to open stream: no suitable wrapper could be found in 

4

5Warning: include(): Failed opening 'http://upload-labs/upload/562024071

9140314.png'  for inclusion (include_path='.;C:\php\pear') in 

修改方法:确保 allow_url_include 配置项在 php.ini 文件中被设置为 1(On)

在这

如果你遇到这种报错 但是给我崩溃了 靶场很多漏洞都修复了 要不然就是版本太低了 很多题做不出来只知道题意

狠狠拿下他了 pass-15

这道题就是通过getimagesize()和image_type_to_extension这两个函数去获取你的图像的类型

可是为什么图片码能绕过? pass-16

exif_imagetype函数是用于判断一个图像的类型,它读取一个图像的第一个字节并且检查其后缀名老样子上传一个图片码就绕过了

我都懒得写了这wp了 pass16的答案就是pass15 pass15的答案就是pass14 pass-17

终于来了一点好玩的 二次渲染 让我看看是什么是二次渲染

放了一个可爱的小猪让我在他的后面加一点一句话木马让它变得更加可爱

 

 

思路就是它经过了渲染以后,再拿渲染过后的图片在去上传 不会再渲染的,由此诞生了两个思路:1.我拿原图和渲染过后的图去比较 将我的一句话木马插入到原图中未被渲染的地方 2。渲染过后的图再次被渲染 不会改变里面的 以上是针对GIF

png jpg 一个比一个麻烦

说实话php版本不一样 环境不一样 很多情况下报错 不显示 耽误很多时间

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值