R's Hacking Daily Log

SQLi (6) 본문

Port Swigger/SQL Injection

SQLi (6)

hanhxx 2023. 5. 14. 15:41

How to detect SQL injection vulnerabilities

공격자의 입장에서 SQL injection 공격을 한다고 할 때, 

1. ' 를 입력해서 에러가 발생하는지 확인
2. or '1' = '1와 같은 boolean 조건문 활용
3. case then 문 사용
4. time delay

와 같은 기술을 Lab을 통해 접해보았다. 

 

sql injection에서는 web page에 결과를 포함하느냐 안 하느냐의 여부가 중요한 정보가 될 수 있으며

web page에서의 차이를 찾을 수 없다면 time delay와 같이 부가적인 기술을 사용할 수 있다는 것도 배울 수 있었다!

 

 

또한 mysql의 information_scheme같이 meta data를 저장하는 table을 활용하여 어떤 테이블이 존재하는지, 

어떤 컬럼이 존재하는지 알아낼 수 있는 방법에 더불어

 

column의 데이터 유형, 개수를 알아내기 위해 order by, union을 다루는 것까지 전반적인 내용을 훑어보았다!!

 

 

sql injection attack을 위해 알아내야 하는 정보와 그 정보를 수집하기 위해 어떤 sql을 활용할 수 있는지

따로 복습해 보는 것도 좋을 듯하다.

 

마지막으로 sql injection attack을 방어하기 위한 방법을 무엇이 있을지 알아보자.

 


How to prevent SQL injection

대부분의 SQL 인스턴스는 쿼리에 문자열을 그대로 연결하는 것 대신에

미리 준비해 둔 SQL에 매개변수 형태로 대입(바인딩)함으로써 방지할 수 있다. 

 

이를 prepared statement or paramiterized query라고 한다. 

 

 

"SELECT * FROM products WHERE category = '"+ input + "'";

문자열을 그대로 연결하는 방식의 sql을 보면 사용자가 선택한 옵션이나 입력한 값이 input 자리에 들어간다고 했을 때,

그 값이 그대로 input 자리에 들어가서 

 

1. "SELECT * FROM products WHERE category = ' 에 input을 이어 붙여

2. "SELECT * FROM products WHERE category = ' INPUT 이 되고 마지막에 따옴표로 마무리되면서

3. "SELECT * FROM products WHERE category = ' INPUT '이라는 SQL이 만들어지게 된다.

 

 

반면 prepared statement는 

"SELECT * FROM products WHERE category = ?"

사용자의 값이 들어갈 부분을 " ? " 처리하고 물음표 자리에 사용자의 입력값을 대입하게 되는 것이다.

 

 

만약 공격자가 임의 데이터를 삭제하고 싶어서 다음과 같은 sql을 주입한다고 하면 

'; DELETE * FROM product--

이전 sql query에서는 위의 query가 문자열 그대로 연결되면서 

 

"SELECT * FROM products WHERE category=''; DELETE * FROM products--'"

select문을 실행한 다음 delete문이 실행되어 products 테이블에 있는 모든 데이터가 삭제될 것이다.

 

 

 

이와 달리 prepared statement 방식으로 처리하게 되면 

"SELECT * FROM products WHERE category = 'DELETE * FROM products--'"

카테고리 이름이 'DELETE * FROM products--'인 상품을 products 테이블에서 조회해!

라는 의미가 되어버리기 때문에 공격자가 의도한 대로 sql이 실행되지 않게 된다.

 

 

** prepared statement에서 statement는 사용하는 sql query 자체를 가리키는 말이라고 생각하면 된다.

 

** sql에서 " ; " 세미콜론 문자는 앞의 query와 뒤에 오는 query를 병렬적으로 연결해 주는 접속사 느낌이라고 보면 된다. 

 

 

예시에서 본 것처럼 Prepared Statement를 구현하면 공격자가 주입한 sql이 

실질적인 sql 문법으로 동작하지 못하기 때문에 SQLi attack에 대해 방어할 수 있다!! (OoO)

 

'Port Swigger > SQL Injection' 카테고리의 다른 글

SQLi (5) - Lab  (0) 2023.05.01
SQLi (5)  (0) 2023.04.30
SQLi (4)  (0) 2023.04.28
SQLi (3) - Lab  (0) 2023.04.28
SQLi (3)  (0) 2023.04.27
Comments