본문 바로가기
php

[PHP] mysqli injection #SQL 공격

by bryan.oh 2021. 1. 9.
반응형

SQL Injection

사용자에게 입력받은 문자열을 Query 에 포함하여 실행하게 되면, 공격받을 수 있습니다.

예를들기 위해 아래와 같은 코드를 만들어 봤습니다. ( 안좋은 코드 입니다. )

<?
    include_once $_SERVER["DOCUMENT_ROOT"]."/inc/config.php";

    $user = $_GET['u'];
    $pass = $_GET['p'];

    $conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);

    $result = mysqli_query($conn, "select * from tb_user where userId = '$user' and userPwd = '$pass'");

    if ($result->num_rows > 0)
        echo "로그인 성공";
    else
        echo "로그인 실패";

    mysqli_close($conn);
?>

(이해하기 쉽게 하기위해 GET 방식으로)

http://hello-bryan.tistory.com/test.php?u=hello&p=bryan

이때 u 파라메터에 다음과 같이 입력하면 어떻게 될까요?

http://hello-bryan.tistory.com/test.php?u=%27or%201=1;%23&p=anything
// url encode가 되어 저렇게 보여지지만 다음과 같은 문자입니다.  'or 1=1;#

이렇게 url 로 날리면 로그인 성공이 뜹니다.

쿼리가 어떻게 되길래 성공이 될까요?

"select * from tb_user where userId = '$user' and userPwd = '$pass'"
// 위의 쿼리에 $user 값에 'or 1=1;# 을 대입하면 아래와 같이 됩니다.
"select * from tb_user where userId = ''or 1=1;#' and userPwd = 'anythong'"

Where 절은 userId = '' or 1=1 이기 때문에 무조건 true 가 됩니다.

그리고 그 뒤에는 # 이기 때문에 주석처리가 되어 무시됩니다.

간단히 select 문을 예제로 봤지만 

Delete, update, insert 등 모든 쿼리에 파라메터를 입력해서 SQL 공격을 할 수 있습니다.

예를들면 u 파라메터에 '; delete from tb_user;# 을 입력하면? 모든 데이터가 지워지겠죠.

 

개발 시 대비를 해야합니다.

 

Prevent SQL Injection

  1. 입력받은 파라메터 문자를 치환하는 방법
  2. Prepared Statements 를 사용 <-- 추천

 

Prepare Statement 사용 설명

2021/01/09 - [php] - [PHP] MySQL How To Prevent SQL Injection #SQL 공격 방지

 

[PHP] MySQL How To Prevent SQL Injection #SQL 공격 방지

Prevent SQL Injection SQL 공격 방지 어떻게 SQL Injection 을 하는지는 아래 글 참고 하시고요. 2021/01/09 - [php] - [PHP] mysqli injection #SQL 공격 MySQLi Prepared Statements Prepared statements 를 사..

hello-bryan.tistory.com

 

728x90
반응형

댓글