
PyJFuzz - Python JSON 퍼저

PyJFuzz는 모바일 엔드포인트 REST API, JSON 구현체, 브라우저, CLI 실행 파일 등 JSON 입력을 퍼징하는 데 사용되는 작고 확장 가능하며 바로 사용할 수 있는 프레임워크입니다.
| 버전 | 1.1.0 |
|---|---|
| 홈페이지 | http://www.mseclab.com/ |
| Github | https://github.com/mseclab/PyJFuzz |
| 저자 | Daniele Linguaglossa (@dzonerzy) |
| 라이선스 | MIT - (LICENSE 파일 참조) |
의존성
PyJFuzz가 작동하려면 몇 가지 의존성이 필요합니다: bottle, netifaces, GitPython, gramfuzz가 있으며, 자동 setup.py 설치를 통해 설치할 수 있습니다.
설치
다음 명령으로 PyJFuzz를 설치할 수 있습니다.
git clone https://github.com/mseclab/PyJFuzz.git && cd PyJFuzz && sudo python setup.py install
CLI 도구
설치가 완료되면 PyJFuzz는 Python 라이브러리와 pjf라는 명령줄 유틸리티를 생성합니다 (아래 스크린샷).
라이브러리
PyJFuzz는 라이브러리로도 작동할 수 있으므로 다음과 같이 프로젝트에 임포트할 수 있습니다.
from pyjfuzz.lib import *
클래스
사용 가능한 객체/클래스는 다음과 같습니다:
예제
아래는 PyJFuzz 기반 프로그램을 구현하는 방법에 대한 몇 가지 간단한 예제입니다.
simple_fuzzer.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6))
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
custom_techniques.py
from argparse import Namespace
from pyjfuzz.lib import *
# Techniques may be defined by group , or by technique number
# groups are CHTPRSX , to understand what they are , please run pyjfuzz with -h switch or look at the command line screenshot
# This below will initalizate a config object which use only the P group attacks where P stay for Path Traversal
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, techniques="P"))
# once a config object is defined you can access to config.techniques to view the selected techniques for your group
print("Techniques IDs: {0}".format(str(config.techniques)))
# you can eventually modify them!
config.techniques = [2]
# This way only attack number 2 (LFI Attack) will be performed!
fuzzer = PJFFactory(config)
while True:
print fuzzer.fuzzed
simple_server.py
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, debug=True, indent=True))
PJFServer(config).run()
때로는 HTTPS 또는 HTTP 서버 포트와 같은 사용자 정의가 불가능한 표준 설정을 수정해야 할 수도 있습니다. 이는 다음과 같은 방식으로 수행할 수 있습니다.
from argparse import Namespace
from pyjfuzz.lib import *
config = PJFConfiguration(Namespace(json={"test": ["1", 2, True]}, nologo=True, level=6, indent=True))
print config.ports["servers"]["HTTP_PORT"] # 8080
print config.ports["servers"]["HTTPS_PORT"] # 8443
print config.ports["servers"]["TCASE_PORT"] # 8888
config.ports["servers"]["HTTPS_PORT"] = 443 # Change HTTPS port to 443
기억하세요: 기본 포트를 변경할 때는 필요한 권한으로 인한 예외를 항상 처리해야 합니다!
다음은 PJFConfiguration 객체의 사용 가능한 모든 설정/사용자 정의 목록입니다:
구성 테이블
기법 테이블
아래는 PyJFuzz에서 기대할 수 있는 내용을 보여주는 몇 가지 스크린샷입니다.
PyJFuzz에는 PyJFuzz Web Fuzzer라는 내장 도구가 포함되어 있습니다. 이 도구는 HTTP 및 HTTPS 서버를 통해 자동 퍼징 콘솔을 제공하며, 프로세스 상태를 제어할 수 없는 경우에도 거의 모든 웹 브라우저를 쉽게 퍼징하는 데 사용할 수 있습니다!
이 도구를 실행하는 데 사용되는 두 가지 스위치가 있습니다 (--browser-auto 및 --fuzz-web). 첫 번째는 충돌 발생 시 브라우저를 자동으로 다시 시작하고, 두 번째는 브라우저가 더 이상 요청을 보내지 않을 때를 감지하려고 시도합니다. 둘 다 항상 테스트케이스를 저장합니다. 아래는 몇 가지 스크린샷입니다.
이슈문제가 있으면 GitHub를 통해 여기로 보내주세요. 가능한 한 빨리 수정하겠습니다.
다음은 PyJFuzz가 발견한 알려진 문제 목록이며, 이 목록은 매주 업데이트됩니다
PyJFuzz를 사용해 주셔서 감사합니다!
mseclab에서 즐거운 퍼징하세요
| 이름 | 유형 | 설명 |
|---|---|---|
| json | dict | 퍼징할 JSON 객체 |
| json_file | str | JSON 파일의 경로 |
| parameters | list<str> | 퍼징할 매개변수 목록 (JSON 객체에서 가져옴) |
| techniques | str<int> | XSS, LFI 등과 같은 퍼징된 JSON을 생성하는 데 사용되는 활성화된 공격 문자열입니다. 예: "CHPTRSX" (**기법 테이블** 참조) |
| level | int | 0-6 범위의 퍼징 레벨 |
| utf8 | bool | true이면 유니코드 인코딩에서 순수 바이트 표현으로 전환합니다 |
| indent | bool | 결과 객체를 들여쓸지 여부를 설정합니다 |
| url_encode | bool | 결과 객체를 URL 인코딩할지 여부를 설정합니다 |
| strong_fuzz | bool | 강력한 퍼징을 사용할지 여부를 설정합니다 (강력한 퍼징은 JSON 구조를 유지하지 않으며 파서 퍼징에 유용합니다) |
| debug | bool | 디버그 출력을 활성화할지 여부를 설정합니다 |
| exclude | bool | parameters 옵션으로 선택된 매개변수를 퍼징에서 제외합니다 |
| notify | bool | 충돌 발생 시 프로세스 모니터에 알릴지 여부를 설정하며 PJFServer에서만 사용됩니다 |
| html | str | PJFServer 내에서 제공할 HTML 디렉터리의 경로 |
| ext_fuzz | bool | "command"의 바이너리를 외부 퍼저로 사용할지 여부를 설정합니다 |
| cmd_fuzz | bool | "command"의 바이너리를 퍼징 대상으로 사용할지 여부를 설정합니다 |
| content_type | str | PJFServer 결과의 콘텐츠 유형을 설정합니다 (기본값 application/json) |
| command | list<str> | 실행할 명령입니다. 각 매개변수는 리스트 요소이며, Python의 shlex.split을 사용할 수 있습니다 |
| 인덱스 | 설명 |
|---|---|
| 0 | XSS 인젝션 (Polyglot) |
| 1 | SQL 인젝션 (Polyglot) |
| 2 | LFI 공격 |
| 3 | SQL 인젝션 polyglot (2) |
| 4 | XSS 인젝션 (Polyglot) (2) |
| 5 | RCE 인젝션 (Polyglot) |
| 6 | LFI 공격 (2) |
| 7 | Data URI 공격 |
| 8 | LFI 및 HREF 공격 |
| 9 | 헤더 인젝션 |
| 10 | RCE 인젝션 (Polyglot) (2) |
| 11 | 일반 템플릿 인젝션 |
| 12 | Flask 템플릿 인젝션 |
| 13 | 무작위 문자 공격 |