kangsecu's B1og

[wargame.kr] Md5 password 문제풀이 본문

Web Hacking/wargame.kr

[wargame.kr] Md5 password 문제풀이

Kangsecu 2018. 2. 18. 01:17

[wargame.kr]에 md5 password 문제를 풀어보도록 하겠습니다. 문제에 들어가면 아래와 같이 출력됩니다.

md5의 인자전달을 보여줍니다. 이제 Start를 눌러보도록 하겠습니다.

위에 사진과 같이 password를 입력하는 폼이 있고, 밑에 get source 가있습니다. 코드를 확인해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
 if (isset($_GET['view-source'])) {
  show_source(__FILE__);
  exit();
 }
 
 if(isset($_POST['ps'])){
  sleep(1);
  mysql_connect("localhost","md5_password","md5_password_pz");
  mysql_select_db("md5_password");
  mysql_query("set names utf8");
  /*
  
  create table admin_password(
   password char(64) unique
  );
  
  */
 
  include "../lib.php"// include for auth_code function.
  $key=auth_code("md5 password");
  $ps = mysql_real_escape_string($_POST['ps']);
  $row=@mysql_fetch_array(mysql_query("select * from admin_password where password='".md5($ps,true)."'"));
  if(isset($row[0])){
   echo "hello admin!"."<br />";
   echo "Password : ".$key;
  }else{
   echo "wrong..";
  }
 }
?>
<style>
 input[type=text] {width:200px;}
</style>
<br />
<br />
<form method="post" action="./index.php">
password : <input type="text" name="ps" /><input type="submit" value="login" />
</form>
<div><a href='?view-source'>get source</a></div>
cs


Exploit Vector

주의깊게 봐야할 곳은 md5함수의 인자전달 부분이다. md5함수에서 값을 전달할때 두번째 인자로 true가 있다. 이렇게 값을 전송하면 원래의 기본적인 default값이 아닌 binary값이 출력이 된다. 바로 이곳에서 취약점이 발생한다. 바로 값이 전달되며 md5 hash가 되는 과정에서 싱글쿼터(')를 만들수 있기 때문이다. 또한, typecasting과정에서 문자열이 0이 된다. 그러므로 "kangsecu"=0이라는 쿼리는 true가 된다. 그럼이제 이것을 이용하여 생각해보면,  hash를 binary로 받을때 값을 전송하면 asdf'='qwer를 넣게되면 password=asdf'='qwer이 되고 password=0 이된다. 

Exploit

아주 간단하다 php코드를 짜서 md5 hash를 한 후 "="이 나오는 쿼리를 찾으면된다. 

이러한 php 코드를 run해서 나온 결과값에 "="이 있는 값(something)을 password에 전송해주면 된다.


이렇게 문제가 해결된다.

md5 password Clear!