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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2018-7747 — CalderaForms 1.5.9.1 XSS (WordPress 플러그인) - 튜토리얼 | Kitploit
도구/GitHubGitHub/mindpr00f/cve-2018-7747
Vulnerability AnalysisWeb Application ExploitationWeb SecurityCTFPenetration TestingLearning & Education
GitHubmindpr00f/cve-2018-7747

CVE-2018-7747

CalderaForms 1.5.9.1 XSS (WordPress 플러그인) - 튜토리얼

저장소 보기
8년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2018-7747

CalderaForms 1.5.9.1 XSS (WordPress 플러그인) - 튜토리얼


CalderaForm은 드래그 앤 드롭으로 쉽게 양식을 만들 수 있는 WordPress 플러그인입니다. 최근 활동 중 일부 포털을 테스트할 기회가 있었는데, 그중 하나에는 이 플러그인으로 만든 문의 양식이 있었습니다. 대상 인스턴스의 사용자 지정 구성 덕분에 취약점을 발견할 수 있었습니다. 그 취약점은 단순하고 매뉴얼에 가까운 성격이라 초보자에게 몇 가지 메커니즘을 설명하기 좋은 예라고 생각합니다.

오로지 교육 목적으로만 제공됩니다 - 명시적 허가 없이 대상 테스트에 사용하거나 불법적인 목적으로 사용하지 마십시오 - 소화 중에 차가운 물에 뛰어들지 마십시오 - 더울 때는 양파처럼 겹쳐 입으십시오

전체 익스플로잇:
https://www.exploit-db.com/exploits/44489/
CVE:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-7747


구성

분석 대상 구성에서 양식은 사용자가 방금 입력한 이름을 호출하여 사용자에게 감사 메시지로 응답하도록 설정되어 있었습니다.

테스트 환경을 재현하려면 로컬에 WordPress 인스턴스를 설치하고 CalderaForms 버전 1.5.9.1 플러그인을 설치하세요(여기 또는 여기에서 다운로드 가능).

설치가 완료되면 WordPress 관리 콘솔 > 왼쪽 열 > "Caldera Forms" > 상단 버튼 > "New Form" > Contact Form을 선택하고 이름을 변경한 다음 "Create Form"을 클릭합니다.

alt text

생성한 후에는 구성을 수정할 수 있습니다: 상단 버튼 > "Form Settings" > Success Message를 사용자가 입력한 데이터 중 하나를 포함하도록 수정합니다. 상자를 클릭하면 제안 드롭다운이 나타납니다.
%first_name%을(를) 추가합니다.

alt text

상단 버튼 > "Save Form"

양식을 페이지에 삽입하려면: 왼쪽 열 > "Pages" > "Sample Page" > "Edit" > "Caldera Form" > 방금 만든 양식 선택 > "Insert Form" > 오른쪽 열 > "Update"

alt text

완료.


정찰 및 벡터 식별

분할 정복(divide et impera) 패러다임에 따라 이러한 유형의 공격을 구성하는 데 필요한 단계를 하나씩 살펴보겠습니다.

테스트 단계에서 구성 요소와 상호 작용할 때는 주어진 자극에 대한 반응에 항상 주의를 기울여야 합니다. 특히 우리가 입력한 데이터의 "경로"와 데이터가 거치는 변환에 초점을 맞춥니다.

우리의 경우에 대한 구체적인 예는 다음과 같습니다.

  1. 양식이 포함된 페이지를 방문합니다: http://127.0.0.1/wordpress/sample-page/

  2. 양식을 다음 데이터로 채웁니다.
    "First Name": myName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  3. 데이터는 플러그인 로직에 따라 처리됩니다.

  4. 받은 감사 메시지에는 First Name 필드에 입력한 문자열이 포함됩니다.
    "Thank you myName, form has been successfully submitted."

alt text

"First Name" 필드에 입력한 문자열이 감사 메시지로 반환됩니다.
특히 해당 문자열은 HTML div 태그 안에 포함됩니다.
우리의 입력은 페이지의 HTML에 들어갑니다.
고려 사항: "좋습니다. 접점이 생겼습니다."

한 걸음 더 나아가 봅시다. 우리가 "처리"라고 부른 단계(2번 항목)에서 입력은 어떻게 처리될까요? 특히 알고 싶은 것은: 사용할 수 있는 문자(및 그 조합)에 제한이 있는가입니다. 물론 목표는 "무언가"를 주입하는 것입니다. 인젝션을 시도할 때는 입력이 어디에 도달하는지 염두에 두고 적절한 "언어"를 사용해야 합니다.

우리의 입력이 SQL 인터프리터에 의해 처리되는가? 그 언어를 사용해야 합니다.
우리의 입력이 PHP 스크립트에 의해 처리되는가? 그 언어를 사용해야 합니다.
우리의 입력이 HTML 페이지로 들어가는가? ...

따라서 우리가 관심을 갖는 것은 HTML의 전형적인 문자와 구문을 사용할 수 있는지 이해하는 것이며, 특히 이 언어가 JavaScript 코드를 포함/해석할 수 있다는 점을 고려하여 앞서 언급한 div 태그, 즉 "착륙 지점"에 코드를 삽입할 전략을 찾을 수 있는지 이해하는 것입니다.

이를 위해 "First Name" 필드에 간단한 HTML 태그를 입력하고 "새니타이즈(sanitize)"되는지, 즉 무해하거나 해석 불가능하도록 수정되는지, 아니면 그대로 반환되는지 확인합니다. 이를 위해 텍스트에 줄 바꿈(line break)을 삽입하는 데 사용되는 <br> 태그를 사용합니다.

앞선 번호에 따라:

  1. 양식을 다음 데이터로 채웁니다.
    "First Name": m<br>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. 감사 메시지에는 수정되지 않은 우리의 HTML 태그가 포함되어 있으며, 해당 태그는 올바르게 해석되어 메시지 중간에 줄 바꿈을 삽입합니다.

root@kitploit:~
"Thank you m  
yName, form has been successfully submitted."

alt text

고려 사항: "좋습니다. 보다 작음(<) 및 보다 큼(>) 기호를 사용할 수 있고, 새니타이즈되지 않고 해석되는 HTML 태그를 삽입할 수 있습니다."

한 걸음 더 나아가 서식 태그를 더 유용한 것으로 교체합니다. 예를 들어 <script> 태그를 사용하면 페이지 내에서 JavaScript 코드를 삽입하고 실행할 수 있습니다.

  1. 양식을 다음 데이터로 채웁니다.
    "First Name": m<script>alert(1);</script>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. 감사 메시지에는 수정되지 않은 우리의 HTML 태그가 포함되어 있으며 올바르게 해석되어 alert 상자를 표시합니다.

alt text

고려 사항 1: "좋습니다. 사용자 브라우저의 맥락에서 임의의 JavaScript 코드를 실행할 수 있습니다."
고려 사항 2: "좋지 않습니다. JavaScript를 실행하는 사용자는 우리 자신입니다."


저장 및 재호출

상황은 이렇습니다: 우리는 우리가 통제하지 않는 사이트를 통해 사용자 브라우저의 맥락에서 JavaScript를 실행할 수 있지만, 현재 그 사용자는 양식에 값을 입력하는 바로 그 사람입니다. 이는 상당히 쓸모가 없습니다.
아이디어는 이렇습니다: 실행할 코드가 포함된 감사 메시지를 호출할 방법이 있을까요?

첫 번째 제출, 즉 "정찰"용 제출로 돌아갑시다(또는 첫 단계를 다시 실행합니다).

네트워크 트래픽이나 페이지 소스를 분석하면 양식이 다음 주소로 POST 요청을 실행한다는 것을 알 수 있습니다.

http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4

(마지막 부분은 다를 수 있으므로 이후의 모든 예제에서 적절히 수정하세요)
즉 다음 주소로 요청합니다.

http://<target>/cf-api/<form-id>

그리고 이 요청에 대한 응답은 감사 메시지를 포함한 일부 데이터가 담긴 JSON이며 다음 구조를 가집니다:

root@kitploit:~
{
      "data":
          {"cf_id":"48"},
      "html":"<div class=\" alert alert-success\">Thank you myName, form has been successfully submitted.<\/div>",
      "type":"complete",
      "form_id":"CF5ad9b3176c0f4",
      "form_name":"MyContactForm",
      "status":"complete"
}

이 정보는 잠시 보관해 두겠습니다. 곧 다시 사용할 것입니다. 특히 "form_id"와 "cf_id" 필드를 주목하세요.

POST가 실행되는 주소에는 무엇이 있을까요? 너무 많은 추측 없이 GET을 실행하면(즉, http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4 주소의 페이지를 방문하면) 다름 아닌 해당 양식의 HTML이 표시되는지 확인해 봅시다.

  1. 양식을 다음 데이터로 채웁니다.
    "First Name": myRedirectedName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

그리고 제출로 인해 발생하는 네트워크 트래픽을 확인합니다.

alt text

이번에는 위치 /wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=49로의 HTTP 302(리디렉션) 코드를 받습니다. 이는 다름 아닌 감사 메시지의 div 태그를 포함한 HTML을 반환합니다.

이 주소의 형식을 살펴봅시다:

http://<target>/cf-api/<form-id>/?cf_su=1&cf_id=<cf-id>

여기서 <form-id>와 <cf-id> 값은 앞서 분석한 JSON에 포함된 값, 즉 각각 "form_id"와 "cf_id"입니다.

처음의 질문에 답했나요? 그렇습니다. 감사 메시지의 내용을 호출할 방법을 찾았습니다.
고려 사항 : "좋습니다. 필요에 따라 우리의 데이터가 포함된 메시지를 호출할 수 있습니다."


공격 구성

지금까지 수집한 모든 정보를 종합하여 정리하고 공격을 만들어 봅시다.
1) 타깃에 악성 코드를 저장합니다.
2) 해당 코드를 복구하는 데 필요한 데이터를 수집합니다.
3) 공격을 "발화시키기"( "to trigger"에서)에 적합한 URL을 구성합니다.

  1. 양식(두 페이지 중 아무 곳에서나, 어느 쪽이든 무관)을 다음 데이터로 채웁니다.
    "First Name": m<script>document.body.innerHTML=String.fromCodePoint(128046);</script>yName
    "Last Name": myLast
    "Email Address": my@e.mail
    "Comments": myComm

  2. 생성된 트래픽을 분석하여(sample-page 페이지에서는 수신된 JSON을 읽거나, 양식만 포함된 페이지에서는 리다이렉트를 읽어서) form_id와 cf_id 식별자를 확보합니다.

root@kitploit:~
{  
      "data":  
          {"cf_id":"69"},  
      "html":"...",  
      "type":"...",  
      "form_id":"CF5ad9b3176c0f4",  
      "form_name":"...",  
      "status":"..."  
}
  1. 공격을 실행할 URL을 구성하고 사용합니다.

http://127.0.0.1/wordpress/cf-api/CF5ad9b3176c0f4/?cf_su=1&cf_id=69

alt text


몇 가지 고려 사항:

  • 마지막으로 방문한 페이지의 콘텐츠(더 일반적으로는 동작)가 우리에 의해 통제된다는 점에 주목하세요. 상상력을 발휘하세요.
  • 우리의 JavaScript 코드를 통한 페이지 수정이 사용자 브라우저 내부에서 발생한다는 점을 생각해 보세요: XSS는 클라이언트 측(client-side) 공격 유형입니다.
  • 스크립트를 호출할 방법을 찾아야 했던 이유는 무엇일까요?
    XSS 공격의 배경 아이디어는 피해자 브라우저의 맥락에서 코드를 실행하는 것이기 때문입니다. 처음 테스트에서는 JS 코드를 실행했지만 휘발성 방식으로, 그리고 우리 자신의 브라우저 맥락에서 실행했습니다.
  • 왜 소가 사용되었을까요? 귀여우니까요.
  • GET 요청의 "cf_id" 매개변수는 양식에 입력된 데이터 세트의 (순차) 식별자입니다. 따라서 그 값을 줄이면 "시간을 거슬러" 진행하여 다른 사람들이 이전에 제출한 정보를 복구할 수 있습니다. 목성이 전갈자리에 있고, 금성이 토성과 대립하지 않으며, 양식이 감사 메시지에 사용자의 이메일 주소도 포함하도록 설정된 경우, 이론적으로 과거 방문자의 주소를 복구할 수 있을 것입니다.

관심이 있다면 독자에게 다음을 제안합니다:

  • 공격을 반복하고, 피해자가 "MUCCA" 문자열이 포함된 alert를 볼 수 있도록 적절한 버퍼를 구성합니다.
  • 문자 '(아포스트로피, single quote), "(큰따옴표, double quotes) 또는 `(억음 부호, backtick 또는 backquote 또는 grave accent)를 사용하지 않고 앞선 연습을 반복합니다. 이 문자는 이탈리아어 키보드 배열에는 없습니다.
  • 선호하는 언어로 스크립트를 개발하여, 자신의 포털에 있는 양식이 포함된 페이지 주소가 주어지면 다음 작업을 수행합니다:
    • 양식 작성 및 제출
    • 입력한 필드 중 하나가 반환되는지 확인
    • 유용한 필드에 악성 버퍼 구성 및 전송
    • 공격을 호출할 페이지의 주소 반환
  • 양식 시작 부분에 했던 구성을 변경(감사 메시지 수정)하고 이전 항목의 스크립트를 다시 테스트합니다.
도구 다운로드