두번째 라인의 첫번째 문제인 7번 문제를 풀어보자.
문제의 점수는 300point이다.
auth 버튼을 클릭해보자.
당연히 나에게 인증권한을 쉽게 줄리가 없다.
이제 한번 소스코드를 확인해보자.
소스코드를 확인해본 결과
val값이 2일때 admin mode를 주어진다고 나와있으며
해당 서버의 php파일은 index.phps로 되어있다.
한번 val값을 2로 설정한 후 해당 페이지를 확인해보자.
다시 해당 페이지의 소스코드를 확인해보자.
별 내용이 없으므로.
이제
index.phps를 확인해보자.
해당 소스코드를 보니
라는 힌트와 함께
언뜻봐서 쿼리를 날리는 코드가 보인다.
생각보다 소스코드가 길다.
이제 해당 소스코드를 분석해보자.
해당 파트를 확인해보면
GET방식으로 넘어온 변수 val값을 받아서 go라는 변수에 담고
해당 변수의 문자열을 다시 $ck변수에 담고있다.
그후 /* */ 라는 주석처리를 막기 위해 다음과 같은 문자들을 제거하고있고,
이외에도 여러가지 문자열과 공백을 막고 있는 것으로 확인된다.
$rand값에 1, 2, 3, 4, 5 중에 무작위로 하나를 골라서
해당 쿼리를 보내는것을 확인할 수있다.
그러므로 통계적으로 생각해보면 아마 확률이 각자 20%로의 확률로 분배되니까
약 5번정도 실행시에 적절한 쿼리를 날릴수 있을 것으로 확인되므로,
괄호의 개수가 가장 적은
$rand값이 1을 기준으로
쿼리를 작성해보겠다.
"select lv from lv1 where lv=($go)"
다음의 소스코드를 확인해보면
쿼리의 결과값을 $data라는 변수에 담고
해당 조건문들을 실행하고 있다.
결과적으로 우리는 해당 쿼리의 결과값 데이터가 2를 뽑아내면 되는 것이다.
작성할 쿼리를 생각해보자.
union을 사용하라고 하였다.
union이란 동시의 데이터베이스에서 데이터를 가져올 수 있는 문법적 요소인데,
여기서는 다루지 않고 따로 포스팅 하겠다.
우리는 val에 2값을 넣어주면 되는 것이기 때문에
val = -1을 통해 첫번째 조건을 false로 만든 후
union이라는 문법적 요소를 이용해 해당 쿼리를 이어주면 되는 것이다.
즉 val에 들어가야 하는 값은
-1) union select (2
이다.
"select lv from lv1 where lv=(-1) union select (2)"
해당 사각형 부분이 val변수를 시각화 시켜보았다.
허나 중요한 요소가 있다.
첫번째 코드 분석에서 여러가지 문자가 필터링 된것을 확인할 수 있다.
그렇다면 해당
필터링을 먼저 확인해보면
'공백'과 '2' '%20' '+' 등의 문자를 이용하면 안된다.
그렇다면
공백 부분에서는 공백을 대신할 수 있는 %0a나 %0d등등을 이용하고
숫자 2는 -기호를 통해 나타내면 되는 것이다.
이로써 필터링을 우회하기 위한 문자열로써 재작성시에
-1)%0dunion%0dselect%0d(5-3
이 결과적으로
-1) union select (2
동일한 의미를 나타내게 되므로 한번
val값에 해당 문자열을 통해 쿼리를 날려보겠다.
몇차례 시도 후에도
다음과 같은 메세지를 찾아볼 수 있었다.
그래서 도저히 생각이 안되 구글링 해본결과.
연관 검색에서
webhacking 7번 문제 오류
가 있었다.
찾아본결과 현재 해당문제의 서버가 오류가 있어 해결이 안되는 것 같다.
서버에서 해당 문제를 수정하는대로 풀어보겠다.
'IT > 웹 해킹(Web Hacking)' 카테고리의 다른 글
webhacking.kr [문제 9번] (0) | 2018.03.04 |
---|---|
webhacking.kr [문제 8번] (0) | 2018.02.27 |
webhacking.kr [문제 6번] (0) | 2018.02.24 |
webhacking.kr [문제 5번] (0) | 2018.02.23 |
webhacking.kr [문제 4번] (0) | 2018.02.23 |