klaus

[Week-4] BLIND Based SQLi (20221103) 본문

수업/모의해킹

[Week-4] BLIND Based SQLi (20221103)

klus! 2022. 11. 6. 22:25

벌써 4주차 수업이 끝났습니다.

이번주까지 SQLi를 진행하고 차주부터는 XSS에 대해서 배우는 것 같습니다.

과제가 생각보다 밀리는.... 

서론은 여기까지하고 이번주 공부했던 내용을 정리해보도록 하겠습니다.

 

1. BLIND Based SQLi이란??

Blind Based SQL Injection은 SQL쿼리의 결과 값이 참 OR 거짓의 응답에 따라 사용가능 유무를 확인합니다.

단, 문법적 에러가 아닌 논리적 에러가 발생해야합니다.(==문법적 에러가 발생하면 문턱도 못 밟아보고 끝)

 

SQL 인젝션이 가능한 모든 곳에 사용 가능하다는 장점이 있습니다.

한글짜씩 추출하여 찾기 때문에 시간이 오래걸린다는 단점이 있어 파이썬이나 프로그래밍 언어로 매크로를 작성하여 사용합니다.

 

 

2. BLIND Based SQLi 사용 되는 트릭

1) LIMIT : 출력되는 데이터의 하나의 행만 추출될 수 있도록 만드는 쿼리문으로, 추출되는 데이터는 0이 첫번째!

사용예시

LIMIT[시작위치],[출력갯수]

LIMIT 0,1  ##첫번째 데이터부터 1개의 데이터 추출

LIMIT 1,1  ##두번째 데이터부터 1개의 데이터 추출

 

2) SUBSTRING : 글자를 잘라내는 쿼리문 (첫번째가 1부터 시작)

사용예시

 

SUBSTRING('문자열',[시작],[출력갯수]) 

'test'라는 문자열의 데이터를 추출한다고 할때

SUBSTRING('test', 1,1) = t 출력 (첫번째부터 첫번째까지)

 

SUBSTRING('test', 3,1) =s 출력 (3번째부터 첫번째까지)

 

3)ACCII코드(아스키코드) : 문자 인코딩으로 컴퓨터는 0과 1로을 사용하여 문자와 숫자를 표현하는데 그중 문자를 표현하는 방법입니다.

0~127까지가 표준 아스키 코드 입니다.

사용예시

~~ ascii('a')= a문자에 대한 아스키 코드 97이 출려됩니다.

 

[아스키 코드표]

4) 이진 탐색 알고리즘

 데이터를 찾을 때 아스키코드인 127에서 값을 출력할 때 x > 70 값이 참으로 나온다면?

70~127사이 이런식으로 해당값을 찾는 방법으로 술게임에서 병뚜껑 숫자맞추기와 같다고 할 수있다.(너무 고전이라 모르나...)

 

3. Blind Based SQLi  사용 예시

 

Step 1.Blind based SQLi 사용가능한지 확인

a' and '1'='1     ##참
a' and '1'='2     ##거짓

으로 데이터의 값이 나온다면 사용이 가능하다는 것을 알 수있습니다.

 

Step 2. Payload 구성 (조건문)

위에서 알아본 것처럼 a' and '1'='1 사용이 가능하다면 and를 한번 더 사용하여 a' and (조건문) and '1'='1 사용이 가능하지 않을까라는 생각을 해봅니다.

 

Step 3 database 이름 찾기

mysql의 경우 위의 트릭을 사용하여 ascii(substring((select database()), 1, 1))>0 같은 형태로 사용가능 할 것 같아보입니다.

이렇게 초기 작성후 아스키 코드 값을 이진 트리 탐색 방법으로 하나씩 찾아가면 되는 형태입니다.

 

Step 4 table 이름 찾기

ascii(substring((SELECT table_name FROM information_schema.tables WHERE table_schema='DB_name' limit 0,1), 1, 1))>0) AND '1'='1

위와 같이 information_schema.tables에서 table_name을 하나씩 찾을 수 있습니다(limit사용)

 

Step 5 column 이름 찾기

ascii(substring((select column_name FROM information_schema.columns WHERE table_name='Table_name' limit 0.1)1.1))>=0 AND '1'='1

위와 같이 컬럼 명을 하나씩 찾아내는 방식입니다.


Step 6. Data 추출

ascii(substring((select [컬럼명] from [테이블명] limit 0,1),1,1))>0 and '1'='1

 

※문자열을 하나씩 찾아 추출하는 방식으로 매우 오래걸리는 블라인드이지만 SQLi가 가능하다면 무조건 사용가능한 방법이라고 할 수있습니다.

 

이번 수업까지 느낀점은 SQL에 공부를 해보고 프로그래밍 언어도 공부를 조금 해봐야겠다는 생각이 들었습니다.

머리속에 정처기가 생각나는 1~4주차 수업이였습니다.

 

 

Comments