Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
wpgarlic — 개념 증명용 워드프레스 플러그인 퍼저 | Kitploit
도구/GitHubGitHub/kazet/wpgarlic
Vulnerability AnalysisWeb SecurityFuzzing
GitHubkazet/wpgarlic

wpgarlic

개념 증명용 워드프레스 플러그인 퍼저

저장소 보기
200231년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

wpgarlic

거의 3천만 개 사이트에 설치된 WordPress 플러그인에서 300개 이상의 취약점을 발견하게 한 개념 증명(proof-of-concept) WordPress 플러그인 퍼저입니다.

사용된 기술은 https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html 에 설명되어 있습니다.

연구를 계속하고 싶다면 덜 인기 있는 플러그인부터 시작하세요. 만약 플러그인이 2021년 10월과 2024년 1월 사이에 최소 10,000회의 활성 설치를 달성했다면, 제가 이미 퍼저 보고서를 검토했을 가능성이 높습니다(특히 20,000회 이상 활성 설치가 있는 플러그인에 초점을 맞췄습니다). 퍼저가 작동하는 방식에 많은 무작위성이 있기 때문에, 이러한 플러그인 중 일부 취약점은 여전히 발견되지 않은 상태로 남아 있을 수 있지만, 그 수는 더 적습니다.

퍼저 보고서에는 많은 오탐(false positive)이 포함되어 있습니다. 대부분이 취약점을 나타내지는 않습니다. 보고서를 본 후에는 먼저 관찰된 동작이 실제로 취약점인지 오탐인지 분석하세요. WPScan/벤더에 원시 퍼저 보고서를 스팸으로 보내지 말고 대신 PoC 익스플로잇을 제공하세요.

예시

명백한 이유로, 예시에는 이미 수정된 취약점만 포함됩니다.

임의 파일 읽기 (Arbitrary file read)

버전 6.4.0에서 responsive-vector-maps를 퍼징한다고 가정해 봅시다:

root@kitploit:~
./bin/fuzz_object plugin responsive-vector-maps --version 6.4.0

(최신 버전을 퍼징하려면 --version을 생략하세요).

퍼징이 끝난 후(이 플러그인의 경우 10~30분 소요) 다음을 호출할 수 있습니다:

root@kitploit:~
./bin/print_findings data/object_fuzz_results/

그러면 다른 것들 중에서 다음과 같은 내용이 표시됩니다:

responsive-vector-maps fuzzer output example.

이는 퍼저가 알려진 페이로드에 대해 fopen() 실행을 감지했음을 의미합니다. 대부분의 페이로드에는 출력에서 자동 감지를 용이하게 하기 위해 GARLIC이라는 단어가 포함되어 있습니다. docker_image/magic_payloads.php에서 이를 확인하거나 구성할 수 있습니다.

그런 다음 소스 코드를 살펴보면 wp_ajax_rvm_import_markers 엔드포인트가 실제로 파일 내용을 사용하여 출력을 렌더링하므로 서버에서 임의의 파일을 읽을 수 있음을 알 수 있습니다: CVE-2021-24947.

흰색으로 표시된 부분은 흥미로운 크래시로 간주됩니다(수정하거나 새로 추가하려면 crash_detectors.py를 편집하세요). 녹색은 컨텍스트입니다. 파란색에는 보고서 파일 이름(플러그인 이름 포함), 플러그인 인기도 및 엔드포인트 이름(여기서는 AJAX 액션 이름)이 표시됩니다.

노란색 데이터는 어떤 변수에 어떤 페이로드가 주입되었는지를 나타냅니다.

반사형 XSS (Reflected XSS)

버전 1.4.9.4에서 page-builder-add를 퍼징한다고 가정해 봅시다:

root@kitploit:~
./bin/fuzz_object plugin page-builder-add --version 1.4.9.4

결과를 출력하면 알려진 페이로드가 에코백된 것을 볼 수 있습니다:

page-builder-add fuzzer output example.

그런 다음 이 위치(기억하세요: 파란색에는 엔드포인트 이름, 여기서는 메뉴 페이지 이름이 있습니다)가 XSS에 취약한지 수동으로 테스트할 수 있습니다. 이 경우 그렇습니다: CVE-2021-25067.

옵션 업데이트로 인한 저장형 XSS (Stored XSS)

root@kitploit:~
./bin/fuzz_object plugin duplicate-page-or-post --version 1.4.6

결과를 출력하면 update_option이 호출되는 것을 볼 수 있습니다:

duplicate-page-or-post fuzzer output example.

엔드포인트 코드를 분석하면 이것이 실제로 저장형 XSS 취약점으로 이어짐을 알 수 있습니다: CVE-2021-25075.

오탐 (False positives)

안타깝게도 대부분의 플러그인에서 퍼저는 흥미로운 크래시를 발견하지 못하며, 나머지의 경우 대부분의 보고서는 오탐입니다. 예를 들어 다음과 같은 내용이 보이면:

root@kitploit:~
Call: wp_mail arguments={'to': '[email protected]', 'subject': '[Plugin contact]  - http://GARLICGARLICGARLIC.example.com'}

이는 wp_mail이 실제로 호출되지만 수신자와 제목의 대부분을 제어할 수 없음을 의미할 수 있습니다. 확실히 하려면 플러그인 소스 코드를 확인하세요.

퍼저 보고서 읽기를 위한 추가 팁

  • May as well be equal: ... and ... 메시지가 보이면, 이는 알려진 페이로드를 다른 문자열과 동일하다고 간주하는 메커니즘(https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality 에 설명됨)이 트리거되었음을 의미합니다.
  • __GARLIC_ACCESSED__ _FILES[files] __ENDGARLIC__가 보이면, 이는 업로드된 파일 접근이 감지되었음을 의미합니다. 현재 추가 확인은 이루어지지 않습니다. 이것이 취약점인지 확인하려면 코드를 확인하세요.
  • 때때로 퍼저가 GET, POST 등에 주입하는 내용은 실제 세계에서 재현할 수 없습니다. 예를 들어 $_GET['page']에 특정 메뉴 페이지를 표시하려면 아무것도 주입할 수 없습니다.

사용법 치트시트

퍼징 또는 테스트를 처음 실행하는 경우 약 1시간 정도 걸릴 수 있습니다. 이는 계측된 PHP와 WordPress로 Docker 이미지를 빌드해야 하기 때문입니다.

이름으로 플러그인 퍼징하기

root@kitploit:~
./bin/fuzz_object plugin PLUGIN_SLUG

이름으로 테마 퍼징하기

root@kitploit:~
./bin/fuzz_object theme THEME_SLUG

파일에서 플러그인 퍼징하기

로컬 zip 파일에서 플러그인을 설치할 수도 있습니다:

root@kitploit:~
./bin/fuzz_object plugin PLUGIN_FILE_NAME.zip

발견 결과 출력하기

퍼저가 찾은 내용을 출력하려면 다음을 사용하세요:

root@kitploit:~
./bin/print_findings data/object_fuzz_results/

테스트 실행하기

테스트를 실행하려면 다음을 사용하세요:

root@kitploit:~
./bin/test

경고: 테스트는 오래 걸리고(1시간 이상) 퍼저가 취약점을 찾을지 확인하기 때문에 일부 확률로 실패합니다.

코드 포맷팅 및 린터 실행하기

wpgarlic는 pre-commit을 사용하여 린터를 실행하고 코드를 포맷팅합니다. CI에서 pre-commit을 실행하여 코드가 올바르게 포맷되었는지 확인합니다.

로컬에서 실행하려면 다음을 사용하세요:

root@kitploit:~
pre-commit run --all-files

각 커밋 전에 실행되도록 pre-commit을 설정하려면:

root@kitploit:~
pre-commit install

수동 테스트 환경

플러그인 하나만 설치된 테스트 환경을 시작할 수 있습니다:

root@kitploit:~
./bin/manual_testing PLUGIN_SLUG|PLUGIN_PATH.zip [version]

슬러그를 사용하거나 로컬 zip 파일에서 플러그인을 설치할 수 있습니다.

http://127.0.0.1:8001/ 에서 수신 대기합니다.

데이터베이스에는 두 명의 테스트 사용자가 있습니다:

  • 사용자명: admin, 비밀번호: admin, 권한: administrator
  • 사용자명: subscriber, 비밀번호: subscriber, 권한: subscriber

퍼저 확장 및 구성

이 도구는 개념 증명입니다. 이 섹션에는 더 많은 취약점을 찾기 위해 개선할 수 있는 부분이 포함되어 있습니다.

filtering.py를 편집할 수 있습니다. 이 파일에는 특정 크래시를 중요하다고 간주하는 규칙이 포함되어 있습니다. 변경하면 더 많은 오탐이 발생할 수 있지만 더 많은 취약점을 찾을 수도 있습니다. 예를 들어, 제가 흥미롭다고 생각하는 유일한 헤더는 Open Redirect 취약점을 탐지하기 위해 Location 헤더입니다. 이는 하나의 아이디어일 뿐이며 다른 아이디어가 있을 수 있습니다.

확장할 가치가 있는 또 다른 파일은 docker_image/patch_wordpress.sh입니다. 이 파일은 어떤 함수 호출이 흥미로운 것으로 기록될지 설명합니다.

다른 페이로드를 주입하거나 주입 확률을 변경하려면 docker_image/magic_payloads.php 및 docker_image/fuzz/config.py를 편집하세요.

crash_detector.py에는 흥미로운 크래시나 (예: 이메일) 노출된 흥미로운 정보를 찾는 정규 표현식이 포함되어 있습니다.

로그인된 관리자로서 REST 경로를 퍼징하는 것은 오탐으로 이어져 비활성화되었습니다. config.DEFAULT_ENABLED_FEATURES에서 rest_routes_admin을 주석 해제하여 변경할 수 있습니다.

퍼저 내부 구조

블록리스트

일부 플러그인은 다른 플러그인(예: woocommerce)을 종속성으로 필요로 합니다. 종속성이 있는 플러그인을 퍼징할 때는 선택한 플러그인만 퍼징하고 종속성의 AJAX 액션, REST 경로 및 메뉴 페이지는 건너뛰고 싶습니다. woocommerce를 퍼징할 때만 woocommerce 액션/경로/페이지를 퍼징하고 싶습니다.

종속성 액션/경로/페이지 목록은 블록리스트라고 하며 docker_image/blocklists/에 나열됩니다. common이라는 파일에는 WordPress 핵심 액션/경로/페이지가 포함되어 있습니다. 이것들도 퍼징하고 싶지 않습니다.

이러한 블록리스트를 업데이트하려면 ./bin/update_blocklists를 사용하세요.

FAQ

퍼저가 무언가를 찾았는데, 이것이 취약점인가요?

그럴 수도 있습니다. 로컬 테스트 환경(예: 수동 테스트 환경 섹션에 설명된 환경)에 플러그인을 설치하고 버그를 분석하세요.

퍼저가 아무것도 찾지 못했는데, 플러그인이 안전한가요?

그렇게 생각하지 마세요. 퍼저는 일부 클래스의 취약점을 찾지만 한계가 있습니다.

대부분의 플러그인에서는 퍼저가 아무것도 찾지 못합니다. 이 도구의 목적은 단일 플러그인에 대한 종합적인 테스트를 수행하는 것이 아니라 대량의 WordPress 플러그인을 대규모로 스캔하는 것입니다.

한 번 실행에서는 퍼저가 무언가를 찾았지만 다음 실행에서는 찾지 못했습니다. 무슨 일인가요?

가능합니다. 퍼저는 페이로드를 무작위로 선택하고 다른 곳에서도 무작위성을 도입합니다(예: https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality 에 설명된 경우에서 == 연산자가 어떻게 작동할지 등).

작동하지 않나요? 질문이 있나요?

Github 티켓을 제출하거나 이메일을 보내주세요: [email protected].

도구 다운로드