본문 바로가기
wargame/wargame.kr

7번 md5_password

by NTART 2019. 10. 8.

php md5 취약점 문제인 것 같다.

 

문제를 시작하며 간단한 sql 인젝션을 시도해봤으나 역시 실패

 

get source를 클릭하면 php 소스를 볼 수 있다. 

 

 if(isset($_POST['ps'])){
 	sleep(1); 
    mysql_connect("localhost","md5_password","md5_password_pz");
    mysql_select_db("md5_password"); 
    mysql_query("set names utf8");

post 방식으로 ps를 받으면, md5 db와 연결하는 내용이다.

 

	 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..";  
    }
}

그리고 이어서 key, ps, row 변수들을 선언한다.

 

key변수는 md5 hash를 해주고, ps 변수는 ps를 post방식으로 받을 때, mysql real escpae을 해준다.

 

Mysql_real_escape_string은 Sql 인젝션에 대비하여 명령문에 사용되는 문자열에서 특수 문자를 사용할 수 없다.

 

그리고 핵심인 row변수에는 php에서 md5 해쉬를 해주는 raw hash 함수인 md5($ps,true)를 사용하며 fetch array를 통해 mysql 테이블에 저장된 값을 배열로 뽑아내어 php가 인식할 수 있는 배열 형태로 변환한다.

 

이 배열이 맞다면, key 값을 주는 구조이다.

 

#raw hash 함수는 php에서 md5를 해주는 함수이다.

기본적인 md5("문자열") --> hash값을 32자리의 16진수값으로 반환하지만,

md5("문자열", true) --> 옆에 true를 붙히면 16자리의 바이너리 형식으로 변환한다.

하지만 이 함수에는 해쉬 바이너리 했을 때, 1' or'1 과 같은 sql injection 값을 면 공격이 가능한 취약점이 있다.

129581926211651571912466741651878684928 이 값은 다른 사이트를 참조하였고, 해쉬를 하면 1' or '1 이 나오는 값이라 한다.

 참고 : https://bbolmin.tistory.com/77

cf)

Mysql_real_escape_string 앞의 @는 ph에서 함수 실행시 에러가 발생하여도 에러메시지를 출력되지 않게 하는 기능이 있다.

추가로 &는 함수명 앞에 붙으면, 리턴값을 우선순위로 참조한다. 

참고: https://ckbcorp.tistory.com/326

 

그리고 mysql_fetch_array 함수는 4번 login filtering에서 조금 더 자세히 설명해두었다.

 

해당 값을 넣으면 바로 키 값을 얻을 수 있다!

'wargame > wargame.kr' 카테고리의 다른 글

9번 strcmp  (0) 2019.10.30
8번 DB is really good  (0) 2019.10.09
6번 fly me to the moon  (0) 2019.10.05
5번 WTF_CODE  (0) 2019.09.15
4번 login filtering  (0) 2019.09.10