[wordpress] 원데이 취약점 분석 스터디 - 6주차

sani·2022년 11월 11일
0

2022.11.11 원데이 취약점 분석 스터디

취약점 분석 :

public function process_bulk_delete_submissions() {
		global $wpdb;

		if ( empty( $_POST['id'] ) ) {
			return;
		}

		$ids   = $_POST['id'];
		$table = $wpdb->prefix . 'hf_submissions';
		$ids   = join( ',', array_map( 'esc_sql', $ids ) );
		$wpdb->query( sprintf( "DELETE FROM {$table} WHERE id IN( %s );", $ids ) );
		$wpdb->query( sprintf( "DELETE FROM {$wpdb->postmeta} WHERE post_id IN ( %s ) AND meta_key LIKE '_hf_%%';", $ids ) );
	}

위의 부분에서 sqli 취약점이 발생하였다.

post 방식으로 id 값을 받아 $ids 변수에 저장한후 sql 문을 실행하여 해당 부분을 삭제한다.

취약점이 발생된 부분의 원인은 sprintf 부분인데,
sprintf를 사용하게 되면 $ids 값을 통하여 받아온 값을 %s 부분에 넣게되고,
이후 sql문이 실행된다.

이때 id 값이 그대로 sql 문에 삽입되어서 사용되기 때문에, 이 부분에 sqli 공격이 가능하다.

poc :


3 번째 submission에 대한 삭제 요청을 보냄

삭제 요청의 패킷을 잡으면 id[] 값을 요청하는 것을 알 수 있음

위의 사진과 같이 5);# 을 삽입하여서

DELETE FROM {$table} WHERE id IN( 5);#  );

와 같은 sql 구문을 완성시킴

오류가 발생하지 않고 5번째 submission을 삭제한 것을 확인 할 수 있다.


이것을 이용하면 원하는 postmeta 데이터를 삭제할 수 있다.

(Post Meta는 게시물이나 페이지에 대한 추가 정보를 포함하는 WordPress의 기능이다. 작성자 이름, 카테고리, 태그, 날짜 등을 포함하여 블로그 게시물에 대한 추가 정보를 저장할 수 있다.)
(출처 : https://www.wpdownloadmanager.com/post-meta-in-wordpress/)

예시로 한 게시판에 아래와 같은 postmeta 데이터를 추가하였다.

이후 wp_postmeta 테이블을 확인하면 아래와 같이 postmeta 데이터가 추가된 것을 확인할 수 있다.

이후 html forms 의 submission 창에서 submission 을 삭제할때, id 값을 5);# 으로
변조하여서 전송한다면 아래와 같이 postmeta 데이터가 삭제 된것을 알 수 있고,

글에서도 추가했던 postmeta 데이터가 삭제 된 것을 알 수 있다.

++ 또한 sleep 함수를 이용하여서 db의 원하는 값을 알아낼 수도 있다.

DELETE FROM {$table} WHERE id IN(1111) or sleep(2);#  );

배운점 :

위의 공격은 html-forms 플러그인을 조작할 수 있는 admin 권한 이상에서만 가능한 공격이다.

하지만 admin 이상의 권한 에서 가능한 공격이라도 해도 sql문에 유저가 입력하는 값에 이스케이프를 처리하는 것은 중요하다는 것을 알게되었다.

profile
창원대학교 보안동아리 CASPER

0개의 댓글