[라라벨] SQL Injection 공격 패턴 및 방어 방법

[라라벨] SQL Injection 공격 패턴 및 방어 방법

- SQL 주입 Attack 해킹 공격 기법과 대응법

//-------------------------------------

* 기본 패턴

- 입력값을 끊어서 공격자의 쿼리를 실행하고 주석( # , -- ) 처리

//-------------------------------------

* 검색 조건 무효화

- 숫자 형식 : 1 OR 1 #

SELECT * FROM Users WHERE UserId = 1 OR 1 # password = 'qwe' ;

- 문자 형식 : admin' OR 1 #

- 다른 유저로 로그인 가능

SELECT * FROM users WHERE name='admin' OR 1 # ' and age = 2 ;

//-------------------------------------

* 공격자 쿼리 실행

' ; DROP TABLE tbl1 ; #

SELECT * FROM users WHERE name = 'a';DROP TABLE tbl1; # and 't' = 't';

//-------------------------------------

* UNION 사용

- 다른 회원 으로 로그인

SELECT * FROM users WHERE id = '10' and password = 'pass' UNION select 'admin', '1';#

-

- DB 내용 알아냄

SELECT * FROM users WHERE col1= 'val' UNION select userid, password from users;#

//-------------------------------------

* 백슬래시 이용

username: \

password: or 1 #

$query = "SELECT * FROM users WHERE username='" . $username . "' and password='" . $password . "'";

- 결과

SELECT * FROM users WHERE username='\' or password=' or 1 # ';

- 백슬래시로 인해 따옴표가 내부 문자열이 되어 다음 조건까지 잠식

- 결과 적으로 username='\' or password=' 가 한 조건이 됨

//-----------------------------------------------------------------------------

//-------------------------------------

* 방어법 :

- 숫자 형식 : 숫자형식으로 강제 형변환

ex) $col = (int) $val;

- 문자열 형식 : 따옴표, 백슬래시를 이스케이핑

php : addslashes() 사용

- 주의! mysql에 저장시 따옴표 그대로 저장됨

- 다시 로드시 공격문자열이 그대로 불러짐

//-----------------------------------------------------------------------------

php, 라라벨

where() - 안전

- PDO::prepare() 가 적용되어 위험 문자열이 이스케이핑 됨

//-------------------------------------

* php 라라벨 , 안전하지 않은 쿼리 실행 함수

*Raw() 계열 함수

- whereRaw() , selectRaw() , fromRaw() , ...

DB::select();

DB::statement();

DB::unprepared();

DB::insert();

DB::update();

DB::delete();

- *Raw() 계열 함수도 안전하게 실행하는 방법

https://laravel.com/api/5.8/Illuminate/Database/Query/Builder.html

- 인자 사용

$results = DB::select('select * from users where id = ? and name = ?', [1, 'a']);

$results = DB::select('select * from users where id = :id and name = :name', ['id' => 1, 'name' => 'a']);

->whereRaw('col1 = ?', ['a'])

반응형

from http://codens.info/2237 by ccl(A) rewrite - 2021-09-03 11:01:07