Oh! JUN
아이디 중복 조회 기능 제작을 통한 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;
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 공격이 가능하다.
'웹 해킹 > SQL Injection' 카테고리의 다른 글
UNION 공격 검증 (0) | 2022.08.25 |
---|---|
UNION과 UNION ALL 차이점 실습 (0) | 2022.08.24 |
효과적으로 DBMS 에러를 발견하기 위한 방법(설정) (0) | 2022.08.24 |
ORACLE ERROR-BASED 공격 실습 (0) | 2022.08.23 |
MYSQL ERROR-BASED 공격 실습 (0) | 2022.08.18 |