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 |