꿈을꾸는 파랑새

오늘은 워드프레스(WordPress)에서 사용을 할 수 있는 플러인 The Events Calendar 플러그인 6.6.4.1 SQL Injection 취약점에 대해 간단하게 다루어 보겠습니다.
워드프레스(WordPress)는 오픈소스를 기반으로 한 설치형 블로그 또는 CMS이며 전 세계 43%가 사용을 하는 웹사이트는 그냥 이것으로 제작되었다고 생각을 하시면 되고 한국에서는 인지도가 낮기는 하지만 티스토리 일부 사태를 때문에 많이 여기로 갈아타는 분들 있었죠. 아무튼, The Events Calendar이라는 플러그인에서 SQL Injection 취약점이 발견되었습니다.
SQL 인젝션 이라는 것은 간단하게 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입해 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 취약점
입니다.
인젝션 이라는 말처럼 삽입을 하는 공격입니다.
일단 Custom_Tables_Query(.)php 부분에 있는 부분만 보겠습니다.

// Each `ORDER BY` entry could specify an order (DESC|ASC) or not.
			if ( preg_match( '~\s*(?<orderby>[^\s]+]?)\s+(?<order>.+)$~i', $orderby_frag, $m ) ) {
				$orderby = trim( $m['orderby'] );
				$order = $this->sanitize_order( $m['order'] );
			} else {
				// Follow the WordPress default and use DESC if no order is specified.
				$orderby = $orderby_frag;
				$order = 'DESC';
			}

			if ( strpos( $redirected_orderbys, $orderby ) !== false ) {
				// The field has been already added to the redirected `ORDER BY` clause.
				continue;
			}

			$parsed_orderby = $this->parse_orderby( (string) $orderby ) ?: $orderby;

			$redirected_orderbys .= $redirected_orderbys === '' ?
				$parsed_orderby . ' ' . $order
				: ', ' . $parsed_orderby . ' ' . $order;
		}

		return $redirected_orderbys;
	}

입니다.

SQL 인젝션 취약점 코드
SQL 인젝션 취약점 코드

문제가 되는 부분과 취약점

해당 코드는 ORDER BY에서 정렬 방향(DESC, ASC)을 처리하는 로직
$orderby 와 $order 변수 처리 방식에서 발생
1.$orderby 변수
$orderby는 SQL 쿼리의 ORDER BY 절에서 정렬할 필드를 나타내고 있음
해당 값은 사용자 입력으로부터 파생되었으며 trim() 함수를 통해 공백만 제거되고 그대로 SQL 쿼리에 포함
문제는 해당 값이 제대로 검증되지 않으면 사용자가 SQL 구문을 직접 입력할 수 있다는 점
예를 들어 orderby 파라미터에 id; DROP TABLE users; --와 같은 값을 넣으면, SQL 문이 변경되어 데이터베이스를 파괴할 수 있음
이렇게 되면 id`로 정렬하고 users 테이블이 삭제되는 공격이 가능
2.$order 변수
$order 변수는 정렬 방향(ASC 또는 DESC)을 결정
$this->sanitize_order( $m['order'] ) 함수를 통해 정렬 방향을 구체적인 구현이 제공되지 않음
만약 이 함수 부분에서 악용한다고 가정을 한다고 하면 공격자는 정렬 방향 대신 SQL 코드를 삽입할 수 있습니다. 예를 들어 ORDER 값에 ASC; DROP TABLE users; --와 같은 값을 넣는다면 쿼리가 오염될 수 있음
$order = "ASC; DROP TABLE users; --";
해당 경우 생성될 쿼리는 다음과 같이 변형 가능
ORDER BY column_name ASC; DROP TABLE users; -- 
SQL 인젝션을 통해 데이터베이스에 치명적인 영향을 줄 수가 있음
3.parse_orderby`와 검증 문제
해당 코드에서 $this->parse_orderby() 함수는 $orderby 를 변환하는 것으로 보이며 하지만 해당 함수가 실패할 때는 원래의 $orderby 값을 그대로 사용
만약 이 함수가 충분한 검증을 하지 않거나 제대로 실패 처리를 하지 않는다면 공격자는 잘못된 orderby 값을 우회할 수 있음
parse_orderby 가 실패하면 ?: 연산자를 통해 $orderby 값이 그대로 사용되므로 위험한 값이 SQL 쿼리로 직접 들어가게 됨
결론
해당 코드에서 SQL 인젝션 위험은 사용자 입력이 SQL 쿼리로 직접 삽입되기 때문에 발생할 수 있으며 입력 값에 대한 검증이 부족하고 제대로 여과되지 않은 값이 쿼리에 포함되면 공격자가 악의적인 SQL 코드를 삽입할 수 있음
최근에 김수키(Kimsuky), 라자루스(Lazarus) 등에서 최근에 해외에 있는 워드프레스 블로그 해킹해서 악성코드 배포 지로 사용을 하는 것을 가끔 볼 수가 있습니다. 

항상 조심하는 습관을 가지면 자신이 사용하는 플러그인들이 최신 상태가 아니며 빨리 업데이트를 하시는 것을 권장을 드리면 The Events Calendar 6.6.4.1 버전에서만 해당 문제가 되기 때문에 최신 버전을 사용하시면 안전할 것입니다.
결론 자신이 사용하는 워드프레스 플러그인들 모두 최신 상태를 항상 유지하는 것이 안전하게 사용을 하는 것입니다. 끝

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band