upload-labs靶场记录(1~13)


常用payload

一句话木马:

<?php @eval($_POST['X']);?>

Less-1 绕过js限制

通过查看源代码可知,有一个js脚本来限制文件上传的类型为.jpg.png.gif,验证过程为前端验证。
在这里插入图片描述

绕过js前端验证两种方法:
①通过插件禁用js脚本
②通过前端验证后用burpsuite抓包修改后缀名
上传并抓包修改后缀。
![[Pasted image 20240117155310.png]]

同时我们能够从包中看到上传路径为/upload/payload.php
在这里插入图片描述

打开蚁剑,成功连接。
![[Pasted image 20240117155733.png]]

Less-2 MIME类型绕过

查看源代码
![[Pasted image 20240118100148.png]]

$FILES函数详解:

$_FILES['myFile']['type'] //获取文件的 MIME 类型,例如"image/gif"
$_FILES['myfile']['name'] //获取上传文件的原名称
$_FILES['myfile']['tmp_name'] //获取已上传文件在服务器端保存的临时文件名,包含路径
$_FILES['myfile']['error']; //上传文件出现的错误号,为一个整数  
$_FILES['myfile']['size']; //已上传文件的大小,单位为字节

上传php文件,并修改type类型为白名单中的类型,上传成功。
![[Pasted image 20240118095910.png]]

随后查看文件上传路径,可知路径为/Pass-02/..upload/payload.php/upload/payload.php
![[Pasted image 20240118100857.png]]

如图成功连接。
![[Pasted image 20240118101444.png]]

Less-3 利用中间件解析绕过黑名单限制

源代码如下
![[Pasted image 20240118103132.png]]

函数详解:

trim(AB) //删除A中所有的B中包含的字符,B默认为空格
deldot(A) //删除A末尾的所有.
strrchr(A,'.') //获取A中最后一个.及其后的所有字符
str_ireplace(A,B,C) //将C中的A替换为B

总之,这里进行一大步过滤之后,会获取文件的后缀名,然后判断是否在黑名单中。其中已知大小写、多后缀等都无法绕过。
但是不同版本的phpstudy,能够将一些不同的后缀解析为php文件,我们查看下我们的http配置文件。
![[Pasted image 20240118105154.png]]

如下图可知,phpstudy同时会将php、php3、phtml 这些后缀名的文件以php方式来解析。
![[Pasted image 20240118105541.png]]

我们上传php3后缀的文件,并尝试连接。
![[Pasted image 20240118105929.png]]

如图连接成功。
![[Pasted image 20240118110045.png]]

Less-4 .htaccess绕过黑名单

查看源代码
![[Pasted image 20240118113511.png]]

上一关所用到的方法也不行,这里加了许多黑名单,但并没有限制.htaccess文件

使用条件:
①php不能带NTS
②启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。
.htaccess文件详解]
打开httpd.conf

//查找
<Directory />  
Options FollowSymLinks  
AllowOverride None  
</Directory>
//改为如下
<Directory />  
Options FollowSymLinks  
AllowOverride All  
</Directory>

.htaccess文件内容

<FilesMatch "payload.jpg"> //将payload.jpg文件
SetHandler application/x-httpd-php //用php来解析
</FilesMatch>

具体操作:
上传1.htaccess文件,但这里1.htaccess不会被解析,要上传.htaccess名称
![[Pasted image 20240118115038.png]]

随后上传payload.jpg文件
![[Pasted image 20240118115130.png]]

如图蚁剑成功连接。
![[Pasted image 20240118133236.png]]

Less-5 大小写绕过

查看源代码
![[Pasted image 20240118141128.png]]
如图查看文件位置
![[Pasted image 20240118141409.png]]

成功连接。
![[Pasted image 20240118141502.png]]

Less-6 空格绕过

查看源代码
![[Pasted image 20240118141731.png]]

抓包,在文件名后面加空格
![[Pasted image 20240118142408.png]]

上传成功,之后用蚁剑进行连接。
![[Pasted image 20240118142459.png]]

Less-7 .绕过

![[Pasted image 20240118142845.png]]

在文件名末尾加.即可绕过限制,剩余步骤略。

Less-8 ::$DATA文件流绕过

原理:
php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名。
实操:
如图上传并抓包添加::$DATA
![[Pasted image 20240118145044.png]]

如图上传成功,随后用蚁剑连接。连接的时候文件名后面不需要带::$DATA
![[Pasted image 20240118145126.png]]

Less-9 过滤不全导致绕过

注意:deldot()函数的原理是从字符串末尾向前寻找.并将其删除,遇到其他字符(包括空格字符)会停止。
查看源代码
![[Pasted image 20240118155725.png]]

注意:这里进去判断的时候后缀只剩..字符不在黑名单中所以能绕过判断。最后.会拼接到前部分的payload.php一起构成payload.php.,这里要弄明白进入判断的是.而不是.php.,弄明白strrchr()函数在这里的作用。
通过这种方式就能绕过。

验证进入判断的时候是.
在黑名单中加入.之后,再去重复刚才的步骤。
![[Pasted image 20240118160615.png]]

如下成功报错,说明我们的猜想是正确的。
![[Pasted image 20240118160739.png]]

Less-10 双写绕过

查看源代码,类似xss的双写绕过
![[Pasted image 20240118161627.png]]
如下图抓包修改后缀
![[Pasted image 20240118161922.png]]

可知,成功上传,后续连接即可。
![[Pasted image 20240118161958.png]]

Less-11 %00截断-get传参

源代码如下
通过下面的分析我们可以得知在上传路径后面加入%00截断字符来停止源代码中后续路径的拼接。
![[Pasted image 20240118164628.png]]

最终更改如下
![[Pasted image 20240118164812.png]]
上传成功
![[Pasted image 20240118164840.png]]

最终成功连接,注意后面的部分在源代码中被截断,因此连接的时候文件名只填payload.php即可。
![[Pasted image 20240118164916.png]]

Less-12 %00截断-post传参

查看源代码
![[Pasted image 20240118171727.png]]

通过查询资料可知:
由于在get传参的时候,传上去的%00会被自动解码,但POST传参不会被自动解码。
如下操作:
![[Pasted image 20240118173029.png]]

然后进入Hex页面
![[Pasted image 20240118173120.png]]

如下成功修改后,放回包。
![[Pasted image 20240118173153.png]]

上传成功,剩下步骤同11。

Less-13 绕过文件头限制+文件包含

查看源代码:
![[Pasted image 20240123154730.png]]

如下给出更详细的代码解释:
这段代码是使用 PHP 中的 unpack 函数从二进制数据中解析出两个字节,并将其转换为整数。然后,通过将两个字节的值连接在一起,将其转换为整数,得到一个类型码 typeCode

具体而言,这段代码执行以下操作:

  1. unpack("C2chars", $bin):使用 unpack 函数按照无符号字符格式解析二进制数据 $bin,将其拆分为两个字符,存储在关联数组 $strInfo 中,键名分别为 chars1chars2
  2. intval($strInfo['chars1'].$strInfo['chars2']):将两个字符拼接在一起,然后将结果转换为整数,得到 typeCode
  3. 最后,定义了一个变量 $fileType,但没有给它赋值。

其中,C2chars的含义如下:
C2charsunpack函数的格式字符串,用于指定如何解析二进制数据。在这里,C 表示解析为一个无符号字符,2 表示解析两次。

C 表示一个无符号字符,其范围是 0 到 255。

2 表示解析两次,即从二进制数据中提取两个字节。

因此,C2 表示解析两个无符号字符,每个字符占用一个字节。这样的解析通常用于读取二进制数据中的字节信息,比如文件头中的某些标识符或类型码。在你提供的 PHP 代码中,unpack("C2chars", $bin) 用于将二进制数据 $bin 中的两个字节解析为两个无符号字符。

其中不同类型的文件的前缀字节是不同的
比如:

1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。

开始上传木马:
首先随意上传文件并抓包修改。如图抓包成功
![[Pasted image 20240123172058.png]]

然后修改后缀后,点击Hex,进入其中找到文件头部分的二进制代码,并将其修改为jpg的文件头。
![[Pasted image 20240123172236.png]]

如下图修改成功,并且成功上传文件。
![[Pasted image 20240123172318.png]]

然后找文件路径
![[Pasted image 20240123172408.png]]

最终成功连接。
![[Pasted image 20240123171934.png]]

Less-14

源代码分析:
![[Pasted image 20240123175925.png]]

getimagesize函数详解

$filename = 'path/to/your/image.jpg';
$info = getimagesize($filename);

if ($info !== false) {
    // 输出图像宽度和高度
    echo 'Width: ' . $info[0] . '<br>';
    echo 'Height: ' . $info[1] . '<br>';

    // 输出图像的 MIME 类型
    echo 'MIME Type: ' . $info['mime'] . '<br>';
} else {
    echo 'Failed to get image information.';
}
/*
getimagesize 函数是根据图像文件的文件头信息来判断图像类型的。函数会读取图像文件的前几个字节,然后解析这些字节中包含的信息,以确定图像的类型、宽度、高度等信息。

getimagesize 函数返回一个包含图像信息的数组。其中,$info[2] 表示图像的类型。
1: GIF  2: JPEG 3: PNG   4: SWF
5: PSD  6: BMP  7: TIFF(intel byte order) 8: TIFF(motorola byte order)
9: JPC 10: JP2 11: JPX  12: JB2
13:SWC 14: IFF 15: WBMP 16: XBM
*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值