[Space WAR] for_beginner-SQL(해결X)

리안·2024년 1월 13일
0

CTF

목록 보기
3/5

<?php
session_start();
require_once "config/dbconn.php";

$userid = $_GET['userid'];
$password = $_GET['password'];

if(isset($userid) && isset($password)) {
    $query = "SELECT userid, password FROM user WHERE userid = '${userid}' and password = '".md5($password)."'";
    try {
        $result = $mysqli->query($query);
        $data = mysqli_fetch_array($result);
        if(isset($data) && $data[0] == "admin" && $data[1] === md5($password)){
            die($flag);
	    } else {
		    die("Wrong...");
	    }
    } catch(Exception $e) {
    }
} else {
    show_source(__FILE__);
}
?>

흠!! 이 문제 못 풀었다...

일단 url로 userid와 password를 전달해주면 조건이 안 맞아서 Wrong이 뜬다.

if(isset($userid) && isset($password)) {
    $query = "SELECT userid, password FROM user WHERE userid = '${userid}' and password = '".md5($password)."'";
    try {
        $result = $mysqli->query($query);
        $data = mysqli_fetch_array($result);
        if(isset($data) && $data[0] == "admin" && $data[1] === md5($password)){
            die($flag);
	    } else {
		    die("Wrong...");
	    }
    } catch(Exception $e) {
    }
} else {
    show_source(__FILE__);
}

조건 부분 다시 체크해보면, 일단 userid와 password를 전달 받지 못하면 코드를 보여준다.

userid와 password를 전달받으면

SELECT userid, password FROM user WHERE userid = '${userid}' and password = '".md5($password)."'

이 형식으로 쿼리를 전달한다.

if(isset($data) && $data[0] == "admin" && $data[1] === md5($password)){
            die($flag);
	    } else {
		    die("Wrong...");
	    }

전달된 쿼리 결과, 즉 DB에서 username이 admin이고 admin의 password가 해싱된 값과 url로 전달받은 password를 md5로 해싱한 값이 일치하면 flag를 알려준다. 일단 뭘 시도해봤냐면...

  1. md5로 복호화했을 때 or '1'='1'이 나오는 값을 password로 입력하기
  2. aa)' or '1'='1'# 입력하여 password 값과 관계 없이 참이 나오게 하기
  3. password와 userid 순서 바꿔서 전달하기

등등등... 근데 다 실패!! password 부분을 통째로 주석처리하면 password가 전달되지를 않으니 코드가 나오고.... 아무튼 실패 실패 실패ㅠ

0개의 댓글