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 |