Webhacking.kr 의

21번 문제풀이이다.

 

지금까지와 마찬가지로 정답이 공개되어 있으니

참고하고 본 포스팅을 읽기 바란다.

 

 

 

인덱스 페이지를 보고 시작하자.

블라인드 인젝션 문제이다.

 

블라인드 인젝션은 앞이 보이지 않는 장님이 앞을 두드리며 가는걸 예로 들면 좋을 것 같다.

 

보이지 않는 결과를 단지 참이냐 거짓이냐 만으로 하나하나 두드려가며 찾아내기 때문이다.

 

블라인드 인젝션에서는 AND 연산자가 매우 중요하다.

참인 쿼리를 완성해 둔 후 뒤에 궁금한걸 물어보기 때문이다.

 

말로 풀어서 간단히 얘길 해보자.

이번 문제에선 1 이나 2라는 값을 넣었을 땐 참이 나오고 0을 넣었을 땐 거짓이 나오게 된다.

즉 1과 2는 쿼리값이 존재하고, 나머지는 존재하지 않는다는 말이다.

 

그럼 쿼리를 날릴 때를 보자.

 

보통 WHERE 구문에 넣는게 대부분이므로

SELECT * FROM table WHERE no=$_GET[no];

이러한 형태의 쿼리가 날라갈거라 예상을 할 수 있다.

우리가 저 폼값에 1을 넣고 제출을 누르게 되면

말로 풀어서 보면 table이란 이름의 테이블에 no값이 1인애를 보여줘~ 라는건데

우리는 결과값을 보는게 아니라 참과 거짓뿐이다.

즉 참이 나오면 쿼리값이 존재하는것이고, 거짓이라면 쿼리값이 존재 하지 않는것이라고 되는거다.

 

그럼 좀 더 진행해서 블라인드 인젝션의 개념을 보자.

 

기본적으로 참의 쿼리결과를 가지고 진행해야한다.

저 위의 쿼리를 이용해서 하면

no값이 1 이고, id의 첫글자가 'a' 인애를 보여줘~ 라는식으로 변조가 되는것이다.

 

그 후 쿼리결과가 존재하면 id의 첫글자는 'a' 인것이고,

거짓이라면 'a' 가 아닌것이다.

 

상황에 따라 거짓인 쿼리문에 or 연산을 이용해도 되지만,

이번 문제에선 and 연산자를 이용해 문제를 풀어보겠다.

 

 

입력 폼에 이렇게 넣어보자.

1 and ascii(substr(id, 1,1))=103

그럼 최종적으로 완성되는 쿼리는

SELECT * FROM table WHERE no=1 and asci(substr(id, 1,1))=103

결과값은 TRUE 가 나오게 된다.

즉 no가 1이고, id 의 첫글자는 'g' 라는것이다

( 103은 'g' 의 아스키 값 )

 

 

 

간단한 예시를 들어보겠다.

 

다음은 모의 구성한 DB 테이블 정보이다.

( 18번 문제를 풀며 만들어놨던걸 재탕한다 ..! )

Table18 의 정보를 보면 guest 와 admin 이라는 id 를 가진 두개의 컬럼이 존재한다.

 

보통 블라인드 인젝션시에는 substr, ascii 등의 내장함수를 이용하여 쿼리를 조회한다.

 

다음은 0, 1, 2 를 순서대로 입력 폼에 입력 후 제출을 눌렀을 때를 확인한 것 이다.

 

그럼 and 를 이용하게 되면 이러한 형태로 변한다 .

OR 의 경우는 둘 중 하나의 값이 참이면 참을 반환하는데

AND 의 경우는 뒤의 값이 거짓이라면 앞의 구문이 참이더라도 거짓을 반환한다.

 

즉 우린 참의 결과를 만들어 둔 후 뒤에 쿼리를 만들어 날리면 되는 것이다.

 

그럼 저 위에서 한줄 써봤던 내장함수를 이용하면 어떠한 값이 나오나 확인해보자 .

먼저 substr 로 문자열을 자른다.

Guest 라는 문자열의 1번째 문자에서 1개의 문자만 출력한다. ( g )

그 후 ascii 함수로 g의 아스키 값을 반환 받는다 .

 

자 우린 저 값을 그대로 비교하면 된다.

 

확장이 아닌 기본 아스키 값만 해도 127개의 값이 존재하는데

특수문자를 제외한 문자들로만 해도 너무 값이 많다.

이걸 다 하나하나 = 로 비교하기 보단

UP,DOWN 놀이를 하듯 <, > 연산자를 이용하자.

자 이런 방법으로 문자열을 하나하나 받아오면 된다.

 

 

하지만 문자열의 길이를 모르니 몇글자 까지 받아야 할지 모른다.

그에 사용가능한 length 함수를 보자 .

5보다는 작고, 4보단 크다는 결과가 나왔다.

즉 문자열의 길이는 5글자 라는 것.

 

 

그럼 문제에 대해서 다시 보도록 하자 .

 

Get 방식으로 넘기는 값이 no, id, pw 세 가지가 존재한다.

Id 가 100 보단 크단다.

103 보단 작고

102보단 크다.

 

저런식으로 각각 한글자 한글자 찾아내면 된다.

우리의 목표는 pw 이다.

 

일일히 다 쳐보기 싫어서 간단한 스크립트를 제작하였다.

 

파싱은 처음이라 로그인 쿠키를 가져오는데 많은 삽질을 거듭했던게 생각이 난다 -_-…;;

 

많이 부족하지만 참고하여 도움이 되면 좋겠다.


[Programing/Example_Code] - Blind SQL Injection Tool by Python


'WarGame > WEB_Hacking' 카테고리의 다른 글

Webhacking.kr 24번 문제풀이  (0) 2015.11.14
Webhacking.kr 23번 문제풀이  (0) 2015.11.14
Webhacking.kr 20번 문제풀이  (0) 2015.11.14
Webhacking.kr 19번 문제풀이  (0) 2015.11.14
Webhacking.kr 18번 문제풀이  (0) 2015.11.13

+ Recent posts