[NPUCTF2020]ReadlezPHP1怎么回事?

简介: NPUCTF2020的ReadlezPHP1题目展示了文件包含漏洞的利用和防御。通过对PHP代码的审计,可以发现并利用文件包含漏洞来读取敏感文件或执行恶意代码。然而,通过严格限制用户输入、使用绝对路径、禁用URL包含和避免动态包含,可以有效地防御文件包含漏洞,从而提高Web应用的安全性。在实际开发中,应时刻保持安全意识,定期进行代码审计和安全测试,以防范潜在的安全风险。

NPUCTF2020 ReadlezPHP1 题目分析

在CTF(Capture The Flag)比赛中,ReadlezPHP1是一个非常典型的Web安全题目。本文将详细分析这道题目,包括其漏洞点、利用方式和防御措施。具体内容如下:

一、题目背景

ReadlezPHP1是NPUCTF2020比赛中的一道Web题目,主要考察选手对PHP代码审计和文件包含漏洞(File Inclusion Vulnerability)的理解和利用能力。

二、代码审计

通过对题目提供的PHP代码进行审计,可以发现其中存在文件包含漏洞。以下是典型的漏洞代码片段:

<?php
    $file = $_GET['file'];
    include($file);
?>
​

解释:
上述代码直接通过用户输入的 file参数包含文件,没有进行任何过滤或验证,导致可以包含任意文件,从而引发文件包含漏洞。

三、漏洞分析

文件包含漏洞分为两类:本地文件包含(LFI)和远程文件包含(RFI)。在本题中,由于服务器配置限制,通常只允许本地文件包含(LFI)。

利用方式:

  1. 读取敏感文件:攻击者可以通过包含系统文件来读取敏感信息,例如 /etc/passwd文件。

    http://example.com/index.php?file=/etc/passwd
    ​
    
  2. 代码注入:攻击者可以通过包含特定文件进行代码注入。如果可以控制被包含的文件内容,则可以执行任意代码。

    http://example.com/index.php?file=php://input
    ​
    

    然后通过POST请求发送恶意代码。

    POST /index.php?file=php://input HTTP/1.1
    Host: example.com
    Content-Type: application/x-www-form-urlencoded
    
    <?php system('id'); ?>
    ​
    
  3. 日志文件包含:如果服务器将用户请求记录到日志文件中,攻击者可以在User-Agent等头信息中插入恶意代码,然后包含日志文件。

    User-Agent: <?php system('id'); ?>
    http://example.com/index.php?file=/var/log/apache2/access.log
    ​
    

四、防御措施

为了防止文件包含漏洞,开发者应采取以下防御措施:

  1. 严格限制用户输入:对用户输入的文件名进行严格验证和过滤,确保只包含合法文件。

    $whitelist = ['safe1.php', 'safe2.php'];
    if (in_array($file, $whitelist)) {
        include($file);
    } else {
        echo "Invalid file.";
    }
    ​
    
  2. 使用绝对路径:避免直接使用用户输入的路径,使用预定义的绝对路径。

    $file = basename($_GET['file']);
    include("/var/www/html/" . $file);
    ​
    
  3. 禁用URL包含:在 php.ini中禁用 allow_url_include设置。

    allow_url_include = Off
    ​
    
  4. 避免动态包含:尽量避免使用动态包含的方式,使用静态包含文件。

    include('safe1.php');
    include('safe2.php');
    ​
    

思维导图

graph TD;
    A[开始] --> B[代码审计];
    B --> C[漏洞分析];
    C --> D[读取敏感文件];
    C --> E[代码注入];
    C --> F[日志文件包含];
    A --> G[防御措施];
    G --> H[严格限制用户输入];
    G --> I[使用绝对路径];
    G --> J[禁用URL包含];
    G --> K[避免动态包含];
​

分析说明表

步骤 描述 命令/代码
代码审计 检查代码中存在的漏洞 <?php include($_GET['file']); ?>
读取敏感文件 通过文件包含读取系统敏感文件 http://example.com/index.php?file=/etc/passwd
代码注入 通过包含恶意代码文件实现代码执行 http://example.com/index.php?file=php://input
日志文件包含 通过包含日志文件实现代码执行 http://example.com/index.php?file=/var/log/apache2/access.log
严格限制用户输入 验证用户输入的文件名是否在白名单中 if (in_array($file, $whitelist)) { include($file); }
使用绝对路径 使用预定义的绝对路径来包含文件 include("/var/www/html/" . basename($_GET['file']));
禁用URL包含 在php.ini中禁用URL包含 allow_url_include = Off
避免动态包含 使用静态包含文件 include('safe1.php');

总结

NPUCTF2020的ReadlezPHP1题目展示了文件包含漏洞的利用和防御。通过对PHP代码的审计,可以发现并利用文件包含漏洞来读取敏感文件或执行恶意代码。然而,通过严格限制用户输入、使用绝对路径、禁用URL包含和避免动态包含,可以有效地防御文件包含漏洞,从而提高Web应用的安全性。在实际开发中,应时刻保持安全意识,定期进行代码审计和安全测试,以防范潜在的安全风险。

目录
相关文章
|
数据安全/隐私保护 Python
BUUCTF [SWPU2019]神奇的二维码 1
BUUCTF [SWPU2019]神奇的二维码 1
869 0
BUUCTF [SWPU2019]神奇的二维码 1
BUUCTF FLAG 1
BUUCTF FLAG 1
1066 0
|
前端开发 Shell Linux
[网鼎杯 2020 白虎组]PicDown(精讲)
[网鼎杯 2020 白虎组]PicDown(精讲)
553 0
[网鼎杯 2020 白虎组]PicDown(精讲)
|
SQL Python
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
1253 0
[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
|
Linux
BUU [安洵杯 2019]easy_web
BUU [安洵杯 2019]easy_web
313 0
20基础解决-buuctf-1.RSA1
20基础解决-buuctf-1.RSA1
|
PHP
BUU [网鼎杯 2020 青龙组]AreUSerialz
BUU [网鼎杯 2020 青龙组]AreUSerialz
393 0
|
PHP
BUU [安洵杯 2019]easy_serialize_php
BUU [安洵杯 2019]easy_serialize_php
248 0
|
数据安全/隐私保护
BUU [HCTF 2018]admin
BUU [HCTF 2018]admin
155 0