ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • |webhacking.kr| #13
    Wargame 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

    댓글

Designed by Tistory.