4번 문제의 화면이다. 16진수로 표기된 문자열이 있는 것으로 보아 base, md5, sha 함수로인코딩, 암호화된 것 같다. view source를 확인하자.
php 코드를 보면 'chall4'의 세션 값이 있고 포스트 방식의 'key' 값이 'chall4' 값과 같으면 문제가 풀린다. 그리고
'hash' 변수에 10000000~99999999 사이의 랜덤값을 합친 [숫자]salt_for_you 문자열을 저장한다. 저장한 해쉬 값을 chall4의 값에 저장하고 for 문을 이용하여 hash를 sha1()로 500번 암호화 한다.
문제접근
문제를 풀려면 'chall4'의 값이 'key' 값과 같아야 한다. 여기서 'key'값은 4번 문제 화면에서 입력란 값이다. 그렇다는 것은 *salt_for_you = $hash 값을 500번 암호화한$hash을 복호화하여 원래의 hash값을 찾아야 한다. 하지만 sha1로 암호화 한 값을 복호화 할 수는 없기 때문에 불가능하다.
그러면 해쉬화된 16진수 값들을 다량으로 만들어 원래의 hash값을 찾는다. 파이썬 스크립트를 작성하여 '10000000~99999999salt_for_you'의 문자열을 sha1로 500번 암호화 한 값이 홈페이지 화면의 hash와 같을 때를 찾는다.
10000000~99999999를 일일히 다 500번 암호화 하기에는 시간이 너무 오래걸려서 대략 10000000~20000000 만큼의 문자열을 500번 암호화하여 txt에 저장하고 문제 페이지의 $hash와 같을 때를 찾는다.
실행
text 값을 sha1로 암호화 할때는 text -> 인코딩 -> 해쉬화 -> 16진수 과정을 거친다. hashlib.sha1(text.encode()).hexdigest()가 이 과정을 나타내는 코드이다. 암호화 한 값을 txt에 저장한다.
txt에 저장할때는 앞 8자리까지만 출력한다.
몇천만의 반복을 하는거기 때문에 실행 완료가 상당히 오래걸린다.
txt는 위와 같이 나오며 문제 페이지의 hash 값과 비교하여 같은 값이 있으면 입력란에 답을 입력한다.
암호화 된 hash 값의 앞의 8자리를 가져와 txt에 찾는다.
이렇게 일치하는 값이 나오면 11385619salt_for_you를 입력란에 입력하면 문제가 풀린다. 일치하는 값을 찾기 위해서 30~40번 정도 화면을 새로고침 하였다.
문제 핵심
1. hashlib 라이브러리를 이용한 암호화 코드를 작성할 수 있어야 한다.
2. 문자열로 된 암호화 값을 복호화 하는게 불가능 한 것을 알고 레인보우 테이블 형식으로 접근해야 한다.
'웹 > 웹 해킹 문제 풀이' 카테고리의 다른 글
webhacking.kr 7번 문제풀이 (0) | 2023.02.07 |
---|---|
webhacking.kr 5번 문제풀이 (0) | 2023.02.06 |
webhacking.kr 56번 문제풀이 (0) | 2023.01.19 |
webhacking.kr 43번 문제풀이 (0) | 2023.01.07 |
webhacking.kr 41번 문제풀이 (0) | 2023.01.07 |