WordPress AutoSuggest는 워드프레스 자동 완성 검색 기능을 제공하는 플러그인으로 사용자가 검색어를 입력하면 사이트는 검색어와 일치하는 콘텐츠를 제공한다.


사용자에게 유용한 플러그인이지만 플러그인의 잘못된 설정으로 SQL Injection 취약점이 발견됐다.

 

취약점이 존재하는 소스코드 확인

Exploit-DB 사이트에 등록된 코드를 보면 autosuggest.php 파일의 wpas_keys 변수에 공백 문자가 입력되면 %문자로 치환한다. 하지만, 공백 문자 이외의 모든 문자를 별도의 검증 로직이 구현되어 있지 않다.


▶ Exploit-DB : AutoSuggest 0.24


$wpas_action = '';
$wpas_keys = '';

if(isset($_GET['wpas_action'])) {
  $wpas_action = $_GET['wpas_action'];
}

if (isset($_GET['wpas_keys'])) {
  $wpas_keys = $_GET['wpas_keys'];
} 

... 

$wpas_keys = str_replace(' ','%',$wpas_keys);
$pageposts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE (post_title LIKE '%$wpas_keys%') AND post_status = 'publish' ORDER BY post_date DESC");

데이터베이스 쿼리를 우회하는 '참'인 공격 패턴 입력

공백 문자를 치환하므로 공백 문자를 우회하는데 사용되는 공격 패턴(/**/)를 wpas_keys 변수에 주입하면 결과 값이 1개 출력된다.


○ http://10.10.10.12/wordpress/wp-content/plugins/wp-autosuggest/autosuggest.php?wpas_action=query&wpas_keys=test%'/**/and/**/'a%'='a



데이터베이스 쿼리를 우회하는 '거짓'인 공격 패턴 입력

wpas_keys 변수에 거짓을 의미하는 공격 패턴을 주입하면 결과 값이 출력되지 않는다.


○ http://10.10.10.12/wordpress/wp-content/plugins/wp-autosuggest/autosuggest.php?wpas_action=query&wpas_keys=test%'/**/and/**/'a%'='b



자동화 공격 도구 이용

서로 다른 각기 다른 반응으로 SQL Injection 취약점이 발견되었으며, 자동화 공격 도구인 sqlmap을 이용한 결과 데이터베이스 정보를 획득하는데 성공했다.



시큐어 코딩 적용

워드프레스에서 Prepare Statement를 지원하는 $wpdb->prepare 메소드를 이용한다.


취약점이 발견된 wpas_key 변수에 메소드를 사용해 검증하도록 한다. 또한, SQL Injection 취약점 외 다른 취약점에 악용될 수 있으므로 해당 변수를 시큐어 코딩 검증 함수를 사용한다.


$pageposts = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE (post_title LIKE '%$wpas_keys%') AND post_status = 'publish' ORDER BY post_date DESC");

취약점 검증

Prepare Statement를 적용 후 sqlmap을 실행하면 데이터베이스 정보를 획득하는데 실패했다고 출력된다.


▶ sqlmap - SQL Injection

▶ SQL Injection INTO OUTFILE - WebShell, Backdoor Upload

▶ DVWA 취약점 분석

▶ XSS htmlspecialchars 함수 우회

▶ CVE-2014-6332 취약점 분석 (Internet Explorer)

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유