워드프레스에서 플러그인 “상세 보기”가 안 뜨는 문제 해결 방법 (iframe + AJAX 이슈)

By: master

워드프레스 관리자 페이지에서 [플러그인 추가] > “더 많은 상세”를 클릭했을 때, 아무 내용도 안 뜨거나 “연결이 거부되었습니다” 라는 오류 메시지를 본 적 있으신가요?

결론부터 말하자면, Nginx 보안 헤더 설정이 문제 였습니다. 그리고 해결 과정중에 워드프레스 내부 AJAX 요청 차단 문제도 있어서 같이 해결했습니다. 이 글에서는 해당 문제의 원인과 해결 방법을 공유합니다.

플러그인 상세 보기 안되는 문제

문제 증상

  • 플러그인 > 새로 추가 > 상세보기 클릭 시 화면이 비어 있거나
  • “aaaaaaa.com에서 연결을 거부했습니다” 와 같은 오류가 iframe 창에 표시됨
  • 실제로 플러그인은 설치되고 활성화되지만, 팝업 상세 설명은 확인할 수 없음

원인이 될 수 있는 사항들

  1. X-Frame-Options: DENY 보안 헤더가 설정되어 있어,
    워드프레스 내부 iframe이 자기 자신(example.com) 을 로딩하지 못함
    워드프레스는 상세보기 팝업을 띄울 때 iframe으로 내부 URL을 호출함:
    https://example.com/wp-admin/plugin-install.php?tab=plugin-information&plugin=YOAST... → 이 요청이 서버에서 차단됨 (보안 헤더)
  2. 일부 서버에서는 admin-ajax.php 또는 wp-json 엔드포인트가 차단되어,
    플러그인 데이터 불러오기 자체가 실패하는 경우도 있음

해결 방법

1. X-Frame-Options 헤더 수정

Nginx 설정(default, sites-enabled 등)에 아래와 같이 수정합니다:

# 기존: iframe 완전 차단
add_header X-Frame-Options DENY;

# 수정: 동일 도메인 내 iframe 허용
add_header X-Frame-Options "SAMEORIGIN";

SAMEORIGIN은 워드프레스가 자기 자신을 iframe에 띄우는 것은 허용

이후 Nginx 재시작:

sudo nginx -t
sudo systemctl reload nginx

2. admin-ajax.php 경로 확인

혹시라도 “curl -I https://도메인/wp-admin/admin-ajax.php” 요청이 400 또는 403이라면,
Nginx 셋팅에서 별도로 예외 처리를 추가해줍니다 (/etc/nginx/site-available/default):

location = /wp-admin/admin-ajax.php {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

3. LiteSpeed Cache, 보안 플러그인 확인

  • LiteSpeed Cache, Wordfence, iThemes Security 같은 플러그인이 loopback 요청을 차단할 수 있음
  • 일시적으로 해당 플러그인을 비활성화 후 다시 시도

확인 방법

수정 후 브라우저에서 개발자 도구 (F12) > 네트워크 탭을 열고 다시 “상세보기”를 클릭하면,
iframe 요청이 정상적으로 전송되고 200 OK 응답을 받는 것을 확인할 수 있습니다.


최종 결과

  • 워드프레스 플러그인 상세정보 팝업 정상 표시
  • admin-ajax.php 정상 작동 확인
  • iframe 차단 해제 → 보안은 유지하면서도 기능 정상화

추가 내용

X-Frame-Options 설정의 중요성

X-Frame-Options 이 없는 경우 다른 사이트에 내 사이트를 iframe으로 넣을 수 있음

이 때, 위험성 클랙재킹

클릭재킹이란?

<!-- 공격자의 악성 사이트 -->
<iframe src="https://aaaaaaa.com/wp-admin" style="opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 999;"></iframe>

<button style="position: absolute; top: 100px; left: 100px;">클릭하세요!</button>

공격자가 자신의 사이트에 내 사이트를 iframe 으로 넣어 어떤 동작을 유도 할 수 있음. 게시글 삭제, 플러그인 끄기, “결제하기” 버튼 클릭 유도, “공유” / “팔로우” 버튼 악용 등을 할 수 있음.

예: 공격자가 iframe으로 호출할 수 있는 주소

URL목적결과
https://example.com/wp-admin/plugins.php?action=deactivate&plugin=litespeed-cache/litespeed-cache.php&_wpnonce=XXXX특정 플러그인 비활성화웹사이트 기능 중단 가능
https://example.com/wp-admin/post.php?post=123&action=delete&_wpnonce=XXXX게시글 삭제중요한 콘텐츠 손실
https://example.com/wp-admin/options-general.php?option_name=siteurl&value=http://evil.com사이트 설정 변경트래픽 탈취 또는 피싱
https://example.com/wp-admin/user-new.php새로운 관리자 계정 생성공격자 계정 침투

위 주소들은 모두 이미 로그인된 관리자의 쿠키를 공유해서 실행됩니다.
즉, 브라우저가 로그인 세션을 유지하고 있기 때문에 클릭만 하면 실제 조작이 됩니다.
반드시 X-Frame-Options: SAMEORIGIN 또는 DENY를 설정해야 합니다.

현실적인 공격 시나리오 예시

1. 공격자는 WordPress 사이트들을 사전에 수집해둠
  • 크롤링 또는 공개된 목록으로 WordPress 사이트 수천 개 확보
  • URL 패턴 (/wp-login.php, /wp-admin/, /wp-json/) 등으로 식별
2. 방문자 IP를 기준으로 호스트 추적

공격자가 iframe이 삽입된 피싱 사이트에서 다음을 수행:

fetch("https://api.ipify.org?format=json")
  .then(res => res.json())
  .then(data => {
    let visitorIP = data.ip;

    // 공격자가 저장한 리스트에서 이 IP의 접속 이력이나 관련 도메인 확인
    if (knownWPAdmins.includes(visitorIP)) {
      document.getElementById("trap").src = "https://target-wp-site.com/wp-admin/plugin-install.php";
    }
  });

👉 여기에선 공격자가 이미 이 IP가 운영 중인 WordPress 사이트를 알고 있다는 전제가 필요합니다.


3. Referrer, 쿠키, User-Agent, Open Graph 등을 통해 식별 강화
  • 방문자가 이전에 어떤 사이트를 방문했는지 (document.referrer)를 통해 유추
  • 브라우저 세션에서 특정 도메인에 로그인한 상태인지 쿠키 여부로 탐지 시도

4. iframe src는 정적으로 안 넣고, 자바스크립트로 동적으로 삽입
// 공격 대상 사이트를 미리 선정
let targets = ["https://site1.com/wp-admin", "https://site2.com/wp-admin"];

document.getElementById("trap").src = targets[Math.floor(Math.random() * targets.length)];

또는:

// 공격자가 DNS 조회 또는 사용자 IP로 판단
let guessedTarget = "https://ssssss.com/wp-admin/plugin-install.php";
document.getElementById("trap").src = guessedTarget;

    마무리

    이번 문제는 겉보기엔 단순한 워드프레스 문제처럼 보였지만,
    실제로는 서버 보안 설정(X-Frame-Options)AJAX 요청 허용 여부가 핵심 원인이었습니다.

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Content-Security-Policy "frame-ancestors 'self';" always;

    이런 옵션은 보안에 꼭 도움이 되기 때문에 설정을 하는 것이 좋습니다. 꼭 확인 후 설정해보세요.
    특히 Nginx 서버에서 워드프레스를 운영 중이신 분들은 iframe 관련 헤더 위 처럼 설정해보세요.

    1 thought on “워드프레스에서 플러그인 “상세 보기”가 안 뜨는 문제 해결 방법 (iframe + AJAX 이슈)”

    Leave a Comment