본문 바로가기

교육 및 자격증/스터디

GH(NOB); SQL 인젝션 추가+

728x90

 

2017과 2021 owasp top10 [sql 인젝션]

출처 : owasp top10

 -> 위 사진처럼 sql 인젝션은 XSS와 보안적인 측면에서 긴밀하게 연결되어 병합됐고 2021년 3위로 강등되었다.

 

하지만 2017년과 2021년 데이터 셋이나 카테고리 구성 등 많은 요소가 달라졌다.

 

 - 카테고리 구성 방법

데이터 셋의 수 30 vs 400

OWASP Top 10에서 몇 가지 범주가 변경되었다.

이전 데이터 수집 노력은 추가 조사 결과를 요구하는 필드가 있는 약 30개의 CWE로 지정된 하위 집합에 집중됐지만 거의 400개의 CWE로 늘었다.

 

 - 데이터가 범주에 사용되는 방식

2017년에는 가능성을 결정하기 위해 발생률별로 범주를 선택한 다음, 악용 가능성 , 탐지 가능성  기술적 영향 에 대한 수십 년간의 경험을 기반으로 팀 토론을 통해 순위를 매겼었다. 

2021년에는 가능한 경우 악용 가능성  (기술적) 영향 에 대한 데이터를 사용했다.

 

 - 데이터의 요소

상위 10개 범주 각각에 대해 나열된 데이터 요소가 있으며 그 의미는 다음과 같다.

  • 매핑된 CWE: 상위 10개 팀이 범주에 매핑한 CWE의 수
  • 발생률: 발생률은 해당 연도에 해당 조직에서 테스트한 모집단에서 해당 CWE에 취약한 응용 프로그램의 백분율
  • (테스트) 적용 범위: 주어진 CWE에 대해 모든 조직에서 테스트한 애플리케이션의 비율
  • 가중 익스플로잇: CWE에 매핑된 CVE에 할당된 CVSSv2 및 CVSSv3 점수의 익스플로잇 하위 점수는 정규화되고 10pt 척도에 배치
  • 가중 영향: CWE에 매핑된 CVE에 할당된 CVSSv2 및 CVSSv3 점수의 영향 하위 점수는 정규화되고 10pt 척도에 배치
  • 총 발생 수: 범주에 매핑된 CWE가 있는 것으로 확인된 총 응용 프로그램 수
  • 총 CVE: 카테고리에 매핑된 CWE에 매핑된 NVD DB의 총 CVE 수

 

 - sql 인젝션 취약점

  • 사용자 제공 데이터는 애플리케이션에서 검증, 필터링 또는 삭제되지 않는다.
  • 컨텍스트 인식 이스케이프가 없는 동적 쿼리 또는 매개 변수화되지 않은 호출은 인터프리터에서 직접 사용된다.
  • 적대적 데이터는 ORM(개체 관계형 매핑) 검색 매개변수 내에서 사용되어 민감한 추가 레코드를 추출한다.
  • 적대적인 데이터가 직접 사용되거나 연결됩니다. SQL 또는 명령에는 동적 쿼리, 명령 또는 저장 프로시저의 구조 및 악성 데이터가 포함되어 있다.

#일반적인 인젝션에는 SQL, NoSQL, OS 명령, ORM(Object Relational Mapping), LDAP 및 EL(Expression Language) 또는 OGNL(Object Graph Navigation Library) 인젝션이 있다. 

 

 - 예방하는 방법

삽입을 방지하려면 데이터를 명령 및 쿼리와 분리하여 유지해야 한다.

  • 선호하는 옵션은 인터프리터를 완전히 사용하지 않고 매개변수화된 인터페이스를 제공하거나 ORM(개체 관계 매핑 도구)으로 마이그레이션하는 안전한 API를 사용할 것
    참고: 매개 변수가 있는 경우에도 PL/SQL 또는 T-SQL이 쿼리와 데이터를 연결하거나 EXECUTE IMMEDIATE 또는 exec()를 사용하여 악의적인 데이터를 실행하는 경우 저장 프로시저는 여전히 SQL 주입을 도입할 수 있다.
  • 긍정적인 서버측 입력 유효성 검사를 사용한다. 많은 애플리케이션이 텍스트 영역이나 모바일 애플리케이션용 API와 같은 특수 문자를 필요로 하므로 이는 완벽한 방어 수단이 아니다.
  • 나머지 동적 쿼리의 경우 해당 인터프리터에 대한 특정 이스케이프 구문을 사용하여 특수 문자를 이스케이프합니다.
    참고: 테이블 이름, 열 이름 등과 같은 SQL 구조는 이스케이프할 수 없으므로 사용자가 제공한 구조 이름은 위험합니다. 이는 보고서 작성 소프트웨어에서 흔히 발생하는 문제입니다.
  • 쿼리 내에서 LIMIT 및 기타 SQL 컨트롤을 사용하여 SQL 삽입 시 레코드가 대량으로 공개되지 않도록 합니다.

 

 - sql인젝션 공격에 사용되는 우회 문자

1. 공백 문자 우회

1) Line Feed (\n)

- 커서(캐럿)를 다음 줄(현재 위치에서 바로 아래줄)로 이동시키는 개행 문자

- URL Encoding: %0a

- ex) no=1%0aor%0aid='admin'

 

2) Tab (\t)

- 커서를 한 tab만큼 이동시키는 문자

- URL Encoding: %09

- ex) no=1%09or%09id='admin'

 

3) Carrage Return (\r)

- 커서(캐럿)를 줄의 맨 앞(왼쪽)으로 이동시키는 개행 문자

- URL Encoding: %0d

- ex) no=1%0dor%0did='admin'

 

4) 주석 (/**/)

- ex) no=1/**/or/**/id='admin'

 

5) 괄호 ()

- ex) no=(1)or(id='admin')

 

6) 더하기 (+)

- ex) no=1+or+id='admin'

 

7) %0b, %0c, %a0

- 1~6까지의 모든 우회 방법이 먹히지 않을 경우 공백 대신 사용

- %a0보다 %0b나 %0c를 위주 사용

 

2. 논리 연산자, 비교 연산자 우회

1) OR 연산자

- ||

 

2) AND 연산자

- &&

- URL Encoding: %26%26

 

3) 등호(=)

1) LIKE 연산자

- ex) id like "admin"

- 정규 표현식을 이용하여 쿼리문을 조작가능 (ex. pw like "a%" → pw의 첫 번째 문자가 a이면 true)

 

2) IN 연산자

- ex) id in ("admin")

 

3) instr(string $str, string $substr)

- ex) instr(id, "admin")

 

4) 부등호 (< , >)

- ex) length(pw) > 7 and length(pw) < 9

 

3.  함수 우회

1) str_replace(string $search, string $replace, string $subject)

- 필터링되는 문자열 사이에 문자열을 넣는다.

- ex) str_replace("admin", "", $_GET[id])

       → adadminmin 으로 입력하면 중간에 있는 admin이 공백으로 필터링되어 admin만 남게 된다.

 

2) substr(string $str, int $start, int $length)

- substring(string $str, int $start, int $length)

- mid(string $str, int $start, int $length)

 

3) ascii(string $str)

- ord(string $str): ascii 함수와 마찬가지로 문자열을 아스키코드 값으로 변환해줌

- hex(string $str): 문자열을 아스키코드 헥사값으로 변환해줌

  ex) hex(substr(pw, 1, 1)) = hex(61)

 

4. 주석 처리

① --

- 뒤에 반드시 공백이 있어야 정상적으로 주석 처리가 된다.

- 한 줄만 주석처리한다.

 

② # (URL Encoding: %23)

- '--'처럼 뒤에 공백이 없어도 정상적으로 주석 처리

- 한 줄만 주석 처리

 

③ /* */

- /* */ 사이의 문자열들이 모두 주석 처리

 

④ ;%00

- NULL 문자인 %00과 ;이 결합한 주석 처리 문자

 

5. 싱글 쿼터(') 우회

1) 더블 쿼터(") 사용

ex) id="admin"

 

2) 백슬래시(\) 사용

- select id from table where id='$_GET[id]' and pw='$_GET[pw]' 와 같은 쿼리문에 제한적으로 사용 가능

- ex) id='\' and pw=' or 1#' → \에 의해 바로 뒤에 있는 싱글쿼터(')가 문자로 인식됨

                              ☞ '\' and pw'가 문자열로 인식되고 이 뒷부분부터는 쿼리문으로 인식됨

                              ☞ 인자 전달: id=\&pw=%20or%201%23

 

 - 요약

2017년과 2021년 owasp top10의 변화는 정보수집이나 요소들이 많이 다르기 때문에 연관성이 거의 없고 2021년 지표가 더 정확해지지 않았을까 생각한다.[2021년 top10은 새로운 지표로 만든 목록느낌]

웹 기반 공격은 아직도 우세하며 많이 행해지고 있고 최근에는 여러가지 단기간에 여러 공격기법도 사용한다.

 

 - 참고

https://www.igloo.co.kr/security-information/%ED%95%9C%EB%B0%9C-%EC%95%9E%EC%84%9C-%EC%82%B4%ED%8E%B4%EB%B3%B4%EB%8A%94-owasp-top-10-2021-draft/

https://owasp.org/Top10/

https://owasp.org/Top10/A03_2021-Injection/

https://zdnet.co.kr/view/?no=20220803171520 

https://www.boannews.com/media/view.asp?idx=110990&kind=3

https://g-idler.tistory.com/61

https://www.igloo.co.kr/security-information/%ED%95%9C%EB%B0%9C-%EC%95%9E%EC%84%9C-%EC%82%B4%ED%8E%B4%EB%B3%B4%EB%8A%94-owasp-top-10-2021-draft/