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