part 17(二次渲染)
imagecreatfromjpeg
imagecreatefromjpeg()是PHP中处理JPEG格式图片的函数之一,它的作用是将一个JPEG格式的文件转换为一个图像资源。该函数有一个参数:$filename,它指定了要打开的JPEG图像的文件名或URL。
返回的是一个资源对象。
imagecreatefromjpeg、imagecreatefrompng、imagecreatefromgif,这些函数将图片载入内存,方便下一步用函数对图像进行处理。
jpeg格式是一种常见的图像格式,广泛应用于数字图像的存储和传输中。
载入后由于会占很大的内存,记得要释放。
srand
随机函数
strval()
strval()函数是PHP中的内置函数,用于将任何标准值(字符串、整数或双精度)转换为字符串。
参数不能是数组和对象。
返回值是字符串
imagejpeg
imagejpeg函数,用于将图像保存为jpeg格式文件。
用法 imagejpeg ( resource $image [, string $filename [, int $quality ]] )
@unlink
unlink() 函数删除文件。
若成功,则返回 true,失败则返回 false。
使用 @ 可以屏蔽错误信息输出
比如 ulink 如果要删除的文件或路径不存在会有提示信息,加上 @ 后会略过这部分信息的输出
解析:
1. imagecreatefromjpeg()函数,二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。上传之后无法解析
2. 二次渲染就是指后端重写文件内容。
3.上传俩张图片,找一下俩个不同的地方,将我们的PHP代码放进去
part 18(条件竞争)
这个是白名单,验证是不是那三个,如果是提出后缀,如果不是就直接删除,
我们需要做的就是在删除之前访问这个文件
1.上传1个php
1.burp 抓包,发送到intruder,进行修改,
设置成Null payloads(相当于无限发送)
第二个,修改为Contiune indefinitely
再将线程改为20
3.访问1.php,不停的刷新
part 19
在php.ini中开启allow_url_include选项
allow_url_fopen 是 PHP 中的一个配置选项,它决定了 PHP 是否能够通过 URL (而非本地文件路径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen() 和 file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这些函数可以用来 读取 或 写入 远程文件。而当该配置项被设置为 Off(关闭)时,这些函数 只能用于操作本地文件。
在开启 allow_url_include
配置项后,PHP 将能够通过 include
等函数 将远程文件包含至当前文件并将其作为 PHP 代码进行执行
。
和上面一样
part 20
move_uploaded_file()会忽略/.
对文件名进行判断,黑名单
burp 抓包,进行修改,改成php/.
part 21
explode(separator,string[,limit]) 函数,使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
end(array)函数,输出数组中的当前元素和最后一个元素的值。
reset(array)函数,把数组的内部指针指向第一个元素,并返回这个元素的值
count(array)函数,计算数组中的单元数目,或对象中的属性个数
这一关白名单
验证过程:
--> 验证上传路径是否存在
--> 验证['upload_file']的content-type是否合法(可以抓包修改)
--> 判断POST参数是否为空定义$file变量(关键:构造数组绕过下一步的判断)
-->判断file不是数组则使用explode('.', strtolower($file))对file进行切割,将file变为一个数组
--> 判断数组最后一个元素是否合法
--> 数组第一位和$file[count($file) - 1]进行拼接,产生保存文件名file_name
--> 上传文件
将1.php修改为1.jpg
content_type改为image/jpeg
然后修改数组
把第一个元素规定为upload-20.php
第三个规定为jpg,记得和上面一样,其他几种都一样
构造数组,上面会判断最后一个数组元素,jpg直接过
$file[count($file) - 1],这个直接count算出来是3,减1,就是第二个元素,第二个元素咱们是空的
这样连接的时候就直接构造出来了