
초기 화면에는 Webhacking.kr 내 ID와 비번이 들어있고 제출을 눌러보면

Wrong 이 뜬다
<?php
if($_POST['id'] && $_POST['pw']){
$db = dbconnect();
$input_id = addslashes($_POST['id']);
$input_pw = md5($_POST['pw'],true);
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"));
if($result['id']) solve(51);
if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>";
}
?>
id와 pw는 post 방식으로 넘겨지고 id는 addslashes()를 통해 쿼트 처리가 된다.
pw는 md5() 처리가 되는데,
md5("문자열"): 문자열을 md5 암호화해서 32자리의 16진수 값으로 반환하고
md5("문자열", true): 위의 값을 16자리의 2진수 형식으로 반환한다. 기본값은 false다.
id는 쿼트 같은 거 처리만 해주는 함수기 때문에 아무거나 넣어도 상관이 없을 것 같은데
pw는 내가 넣은 값 -> md5 암호화 -> 16자리 2진수로 표현의 과정을 거치기 때문에 아무거나 넣어서는 안된다.
select id from chall51 where id='{$input_id}' and pw='{$input_pw}' 의 쿼리문에서
pw 변수가 들어가는 양쪽으로 싱글 쿼터가 있기 때문에
위의 일련의 과정을 고려해 양쪽으로 싱글쿼터가 있고 그 둘을 이어줄 '='이 있어야 한다.
즉, aaaa'='bbbb 의 형식이다. 물론 여기서 aaaa와 bbbb는 무슨 값이든 상관없다.
'거짓=거짓'은 참이기 때문이다.
md5암호화, 16자리 2진수 표현값에 '='가 포함되면 그만이다.
그럼 pw를 찾아보자

문자열에 내가 찾는 특정 문자열이 포함되어 있는지 확인할 수 있는 strpos()를 사용했다.
결과값은 다음과 같다.

id는 admin으로, pw는 1839431로 넣어보자

'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 56 (250) (0) | 2020.02.11 |
---|---|
Challenge old 53 (350) (0) | 2020.02.11 |
Challenge old 48 (350) (0) | 2020.02.11 |
Challenge old 47 (150) (0) | 2020.02.11 |
Challenge old 46 (300) (0) | 2020.02.11 |