第四题
可以看到禁止上传文件类型很多
源码黑名单
$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
图来自博文Upload-labs 1-21关 靶场通关笔记(含代码审计)_addhandler sethandler upload 19关-优快云博客
.htaccess文件不在给名单之内,可以写一个文件规则绕过,上传一个.htaccess,这个文件内容的意思是告诉apache当遇到webshell.jpg文件时,按照php去解析:
运行图片木马
第五题 大小写绕过黑名单
这道题,不允许上传ini文件盒htaccess文件
没有禁止phP 、Php 所以将文件名字大小写就绕过了限制
第六题 空格绕过
在PHP中,trim()
函数用于去除字符串两端的空白字符(或者由参数指定的其他字符)。如果需要去除字符串中间的空格,可以使用 str_replace()
函数。
基本语法:
php
string trim ( string $string [, string $character_mask ] )
$string
是需要去除空白字符的原始字符串。$character_mask
是可选参数,用于指定需要去除的字符集合,默认为去除空白字符。
示例:
php
$str = " Hello, world! ";
echo trim($str); // 输出 "Hello, world!"
// 使用自定义的字符集合
$str = "###Hello, world!###";
echo trim($str, "#"); // 输出 "Hello, world!"
trim()
函数默认去除字符串两端的空格、制表符、换行符等空白字符。如果需要去除字符串两端的特定字符,可以通过第二个参数指定这些字符。
此外,PHP还提供了几个类似的函数,如 ltrim()
和 rtrim()
,分别用于去除字符串左端或右端的空白字符。这些函数的使用方式与 trim()
类似。
本题的源码当中没有写trim函数对空格进行控制,但是在Windows系统中会自动去掉空格,因此我们需要抓包来进行操作
第七题 点绕过
在PHP中,deldot()
函数通常是一个自定义函数,它的作用是从字符串的尾部开始,从后向前删除点.
,直到该字符串的末尾字符不是.
为止。这个函数在文件上传利用中比较常见,尤其是在处理文件名时,用来删除文件名末尾的点,以防止某些文件上传漏洞的利用。
以下是deldot()
函数的一个可能的实现方式:
php
function deldot($s){
for($i = strlen($s)-1; $i>0; $i--){
$c = substr($s,$i,1);
if($i == strlen($s)-1 and $c != '.'){
return $s;
}
if($c != '.'){
return substr($s,0,$i+1);
}
}
}
这个函数通过从字符串的末尾开始检查每个字符,如果遇到不是点.
的字符,就返回去掉末尾所有点.
后的结果。如果整个字符串都是点.
,则返回原字符串。
例如,对于以下输入:
php
echo deldot("hello world")."\n";
echo deldot("hello world.")."\n";
echo deldot("hello world....")."\n";
echo deldot("hello.world.")."\n";
输出为:
hello world
hello world
hello world
hello.world
可以看到,只有当点.
前有其他字符时,点才会被删除。如果字符串以点.
结尾,则这些点不会被删除。这个函数在处理上传文件的文件名时非常有用,可以防止一些基于文件名的攻击。