-
|webhacking.kr| #13Wargame Site/Webhacking.kr 2019. 7. 6. 07:13
SQL injection 문제이다!!
우선 form 태그를 살펴보자
두 개의 입력란이 각자 다른 곳으로 GET 전송을 하도록 설계되어 있다.
문제를 풀다보니 no 이나 상수가 들어갈 것 같은 곳에 Blind injection 의 구멍을 뚫어놓는 경우가 많은 것 같다.
no 은 숫자이니 ' ' 작은따옴표의 사용을 할 수 없도록 만드는데 수월하며,
그렇기 때문에 if 로 시작이 가능하기 때문이다.
no = 0 일 때
no = 1 일 때
no > 1 일 때
우선 Blind Injection 을 하기 위한 판단근거를 찾았다.
기존의 방식에서 출력된 결과가 <td>1</td> 인지 <td>0</td> 인지를 기준으로 참 거짓을 분류하면 될 것이다.
우선 간단한 프로그램을 통해 사용가능한 문자열들을 살펴보았다.
우선 괄호가 가능한 것으로 보아 공백은 걱정 없겠거니 싶었다.
그리고 if 가 가능하다는 점과 length, substr 이 살아있는 것으로 보아 접근방법이 맞는 것 같다.
자 그럼, 이제 Query 를 만들어 보자.
큰 틀은 if([ 조건 ],1,0) 과 같은 형태로 진행될 것이다.
만약 조건절이 참일 경우 '<td>1</td>' 가 감지될 것이다.
Hint 에 " select flag from prob13password " 라고 나와있다.
flag column 을 가져오는 것으로 작성하면 될 것이다.
처음에는 if((select%0alength(flag)%0a.... 와 같은 방법으로 접근했지만 아무것도 나오지 않았다.
계속 끙끙 앓다가 조금의 힌트를 얻고자 구글링을 했다.
SQL injection 을 하면서 처음으로 다뤄보는 문법이 있었다.
Min 과 Max
라고하는 테이블이 있을 때, min 과 max 의 사용이다.
이처럼 min 은 문자열을 비교했을 때 처음 나오는 문자의 대소를 따른다.
그 중 작은 것을 반환하는 것이다.아래의 Query 는 where True 가 성립하는 Query 이다.
이것을 학습하고 나니 맨 처음 설계한 Query 가 동작하지 않은 이유를 알게되었다.
select 의 결과가 여러개일 수도 있겠다는 생각을 했다.
다중행이기 때문에 상수와 비교대상이 될 수 없다.
단일행이기 때문에 상수와 비교할 수 있다.
그것과 상수를 비교하는 형태이니 동작하지 않았던 것이라고 해석된다.
추후 더 자세히 알아봐야겠다
min , max 를 사용해서 단일 행이 반환되도록 하여 비교한다
in 의 사용
=, like 의 사용이 불가하므로 in 을 사용했다. in 을 사용할 때 주의해야할 점이 있다.
바로, 괄호의 사용이다. 이는 LOS 에서도 다뤘던 바 있다.
Length 구하기 : if((select%0amax(length(flag))%0afrom%0aprob13password)in({}),1,0)
Substr 접근하기 : if(ord(substr((select%0amin(flag)%0afrom%0aprob13password),{},1))in({}),1,0) 과 같이 구성했다.
min 과 max 의 경우를 둘 다 진행해보면 Query 를 위와 같이 작성할 수 있을 것이다.
문제를 풀면서 만약 min, max 가 아닌 중간의 값일 때도 문제를 해결할 수 있을까 하는 생각이 들었다.
Clear ~
'Wargame Site > Webhacking.kr' 카테고리의 다른 글
|webhacking.kr| #15 (0) 2019.07.06 |webhacking.kr| #14 (0) 2019.07.06 |webhacking.kr| #12 (0) 2019.07.05 |webhacking.kr| #11 (0) 2019.07.05 |webhacking.kr| #10 (0) 2019.07.05 댓글