감자 텃밭

SQL Injection filtering Bypass (필터링 우회) 본문

Web Vulnerability

SQL Injection filtering Bypass (필터링 우회)

g2h 2023. 2. 4. 16:32
SQL Injection 공격을 을 수행하다 보면 공격자로부터 WebApplication을 보호하기 위해 수많은 보호기법 및
필터링이 적용되어 있다. 이러한 필터링에 대해 적절한 유효성 검사를 하지 않는다면, 공격자는 손쉽게 적용된
필터링을 우회하여 WAS에게 악의적인 질의를 통해 Database의 정보를 유출하거나, 시스템상의 피해를 입힐 것이다. 

SQL 인젝션에 적용된 필터링에 대한 적절한 우회기법에 대해 정리해자.

SQL Injection을 학습 해가며, 알게 된 정보들을 추가하고 있으며, 계속해서 새롭게 알게 된다면 지속적으로 추가할 것이다.

 

공격을 알아야 방어를 안다.

1. 주석을 통한 우회

  • # (URI 부분에서 SQL Query를 전달할 경우 %23으로 url 인코딩을 통해 전달해야 한다. URI부분에서 #는 프래그먼트로 예약된 문자이기 때문이다.) (MySQL의 경우 #뒤에 공백을을 한 칸 줘야 한다.)
  • --
  • /* [주석처리되는 구간] */
  • ;%00(;NULL) 
;(세미콜론)은 쿼리의 종료를 나타내며, 뒤에 null값을 붙여 쿼리를 마무리한다.

2. 싱글쿼터 우회

  • "(더블 쿼터) 사용
  • \(역 슬래쉬 사용) 이는 앞 문자를 문자 그 자체로 인식하게 한다. 이를 통해 패스워드를 md5로 해시값으로 저장한다는 등의 행위를 우회할 수 있다.
EX) select * from users where id = '입력' and pw=md5('입력') 와 같이 로그인 폼이 적용되어 있을 경우
-> select * from users where id='\' and pw=md5('') = select * from users where id='' 가 된다. 
-> select * from users where id='' or 1=1#을 통해 SQL Injection이 가능하게 된다.
  • HEX 16 진수값을 통한 아스키값으로 변환 후 사용 

3. 공백 (Space) 우회

  • %00 (Null)
  • /**/
  • () -> EX) (1=1) or(id=admin)
  • +-> EX) 1=1+or+id=admin+
  • %0a (\n), %09(\t), %0d(\r), %0b(\v), %0c(\f)
  • Backtick 이용 -> `

4. 논리 연산자 (or, and) 우회

  • or = || (URI 인코딩 값은 % 7c%7c)
  • and = && (URI 인코딩 값은 %26%26)

5. 문자열 필터링

  • HEX 16 진수값을 통한 아스키값으로 변환 후 사용 
EX) admin = 0x6146 d696 e
  • 대 소문자 변경 a->A
  • char() 함수 및 chr() 사용 및 concat -> concat(char(0x61), char(0x62))
  • (MySQL 진법) 0b110000101100010 -> ab
  • 가젯 이용 -> ex)myslq : select mid(@@version,12,1) -> n (각 DBMS별 문자열 추출 함수 사용)

6. 함수 우회

  • str_replace (문자열 치환 함수)
str_replace("abc", "", [입력값])와 같은 함수가 존재한다면, abc가 입력되면 ""로 치환하겠다는 것이다.
이럴 경우 ababcc로 입력할 경우 ab와 c의 중간에 입력된 abc가 로직에 걸려 "" 치환되고
ab""c -> abc가 된다. 이를 통해 쉽게 우회가 가능하다.
  • addslashes()와 같은 함수
위와 같은 함수등은 다수 존재하며 특수문자 및 null값을 입력하게 되면 '\' (역슬래쉬)를 붙여 이스케이프 처리하게 하는 함수이다. 이때 \를 입력해 주면 \\이 되어 이를 우회할 수 있다.
  • 문자열 추출 함수
    1. substr()
    2. substring()
    3. mid()
    4. left()
    5. light()
    6. left(light())
  • ascii값 획득을 위한 함수 우회
    1. ascii()
    2. ord()
    3. hex()

7. 대입연산자 (등호 (=)) 우회 및 필터링 우회

  • like 사용 
like의 경우 특정 패턴을 이용하여 문자열을 검색하는 함수이지만 이를 잘 활용하면 등호로 사용이 가능하다
예를 들어, id like "_dmin" 일 경우 _위치에 임의의 한자리 값을 포함하여 dmin이 이어지는 문장을 찾는다.
id like '% mi%' 일 경우 가운데 값이 mi이며 앞 뒤로 어떠한 값이 오든 mi가 포함되면 모두 찾겠다는 것인데
이때 _ % 둘 다 사용하지 않을 경우 지정한 문자열을 찾겠다는 뜻이 된다.
즉, id like 'admin;일 경우 id에서 admin이라는 문자열을 찾겠다는 뜻이 된다.

  • between
  • in("str")
  • <> (계속해서 범위를 추려가며 스무고개 형식, 이진탐색)
  • instr(id, "str")
  • not 연산자
  • !=
  • 정규표현식 사용  pw regexp 'p.*'

8. Error Based Blind우회

  • (select 1 union select 2)
(union all은 중복값을 제거하지 않지만, union만 사용할 경우 중복값을 제거하게 된다.)
select 1 union select 2를 하게 되면 1 그다음줄에 2가 추가하게 되는 점을 이용하여
select 1 union select 1을 하게 되면 1이 중복값으로 제거되며 오류가 발생하지 않는다.
  • exp(710)와 같은 연산을 사용하는 함수등을 사용하여 최대치 값을 이용해 오류를 낼 수 있는 방법들
  • if 또는 case when을 사용하여, 오류발생

9. 조건 연산자 우회

  • if
  • case when
  • COALESCE

10. 구문 검사 우회

  • union values() 사용

※ 내용이 이상하거나 문제가 있을 경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.

'Web Vulnerability' 카테고리의 다른 글

backup Vulnerability (백업 취약점)  (0) 2023.01.29
Webpack Vulnerability (웹팩 취약점)  (0) 2023.01.28