보안/WebHacking

SQL Injection - Union Select 로그인 우회

kimjingyu 2023. 11. 28. 13:24
728x90

이번 포스팅에서는 아이디와 비밀번호를 DB에서 확인하여 일치하면 인증하는 방법을 확인해보고자 한다.

 

우선 이를 위한 서버 코드는 다음과 같다.

<?php
	session_start();
    
    $id = $_POST[user];
    $pw = $_POST[pass];
    
    mysql_connect('localhost', 'root', '1111');
    mysql_select_db('auth');
    
    $sql = "select * from login where user = '$id'";
    $resource = mysql_array($sql);
    $count = mysql_num_rows($resource);
    $row = mysql_fetch_array($resource);
    
    if ($count != 0 and md5($pw) == $row[pass]) {
    	$hash = $id . $pw;
        $hash = md5( $hash );
        $_SESSION[islogin] = $hash;
        $_SESSION[name] = $id;
        echo "<script> alert('login success') </script>";
    } else {
    	echo "<script> alert('login fail') </script>";
    }
?>

 

위 코드를 보면 ID만 쿼리문에 들어가있다. 그래서 ID만 검색한 후에 그 데이터에서 비밀번호를 입력받은 비밀번호와 일치하는지에 따라 인증을 하는 코드이다.

 

이런 코드의 경우에는 union select를 이용하여 우회할 수 있다. 예를 들어, ID 입력칸에 1' union select 1, 2 from login을 입력하면, 다음과 같은 SQL문이 발생한다.

select * from login where user = '1' union select 1, 2 from login;

 

즉, 다음과 같은 데이터가 받아들여져서 검색이 된다. 이럴 경우에 일반적으로 pass의 값 2를 가져오게 되고, 우리가 입력칸에 비밀번호 2를 입력하면 로그인 우회가 되고, 이를 union select 를 이용한 로그인 우회라고 한다.

user pass
1 2

 

하지만 위 코드를 보면 비밀번호를 md5로 해서 DB에 저장해놓은 것을 알 수 있따. 따라서 여기서는 mysql 내장함수 md5()를 이용해서 ID 입력칸에 1' union select 1, md(5) from login # 을 넣어주고 다음과 같은 SQL query문을 발생시키면 된다.

select * from where user='1' union select 1, md5(2) from login;

 

728x90