Oh! JUN

아이디 중복 조회 기능 제작을 통한 UNION 공격 가능 여부 판단 본문

웹 해킹/SQL Injection

아이디 중복 조회 기능 제작을 통한 UNION 공격 가능 여부 판단

Kwon Oh! JUN 2022. 8. 24. 16:01

※ 실습 코드

<!--id_check.php-->
<?
    header("Content-Type: text/html; charset=utf-8");

    $db_conn = new mysqli("localhost", "root", "dh06802468", "login_example");

    $id = $_GET["id"];

    if(!empty("id")){
        $query = "select * from member where id='{$id}'";
        $tmp = $db_conn->query($query);
        $flag = $tmp->num_rows;

        if($flag==0){
            $msg = "<font color='blue'>사용 가능한 아이디 입니다.</font>";
        }
        else{
            $msg = "<font color='red'>사용 불가능한 아이디 입니다.</font>";
        }
    }
?>

<form action="id_check.php" method="GET">
<input type="text" name="id"><input type="submit" value="조회">
</form>
<hr>
<?=$msg?>

- 아이디가 중복되지 않으면 flag를 0으로 반환해서 "사용 가능한 아이디 입니다." 문구를 출력하게 된다.


1. 취약점 진단

- admi' 'n을 입력했는데 DBMS에서 자동으로 admin으로 인식해서 사용 불가가 뜨게된다.

 

- select * from member where id='' or 1=1#'

- 참인 쿼리문이 되기때문에 사용 불가

- select * from member where id='' or 1=2#'

- 거짓인 쿼리문이기 때문에 사용 가능

 

※ 위의 취약점 진단을 통해 sql 인젝션이 가능한다 판단


 

2. UNION 공격 가능 여부

- 위의 코드는 행이 존재하지 않으면 flag=0이 되어서 "사용 가능한 아이디 입니다." 문구가 출력되는데 이는 어플리케이션에서 반환하는 값들이다.

- UNION 공격 가능 조건은 DBMS에서 반환되는 값이 웹에 출력이 되어야한다.

 

그렇다면 어떻게 하면 UNION 공격이 가능해질까?

<!--id_check.php-->
<?
    header("Content-Type: text/html; charset=utf-8");

    $db_conn = new mysqli("localhost", "root", "dh06802468", "login_example");

    $id = $_GET["id"];

    if(!empty("id")){
        $query = "select * from member where id='{$id}'";
        $tmp = $db_conn->query($query);
        $flag = $tmp->num_rows;
        $user = $tmp->fetch_assoc();

        if($flag==0){
            $msg = "<font color='blue'>사용 가능한 아이디 입니다.</font>";
        }
        else{
            $msg = "<font color='red'>해당 '{$user["id"]}' 아이디는 불가능 합니다.</font>";
        }
    }
?>

<form action="id_check.php" method="GET">
<input type="text" name="id"><input type="submit" value="조회">
</form>
<hr>
<?=$msg?>

- 아이디 사용이 불가능해질때 쿼리에서 'id'가 웹에서 출력되도록 코드를 변경했다.

 

- 해당 쿼리가 웹에서 보여지니까 UNION 공격이 가능하다.