웹 해킹 & 시큐어 코딩

웹 해킹 & 시큐어 코딩 (4)

홍시뗄레 2025. 1. 13. 21:51

SQL Injection이란 무엇인가?

SQL: 구조화된 질의 언어 / Injection: 주입

--> 구조화된 질의 언어를 주입하는 공격

변조된 구문으로 질의하는 것이 sql injection의 취약점이다.

 

취약점 발생 원인

(사용자 입력값+미완성된 sql 구문)을 주입하여 db에 질의를 요청할 수 있음. 

 

예시

String id=request.getParameter("id");

String query="select*from member where id='"+id+"'";

 

?id=hongsi (정상적)

?id=' or 1=1-- (비정상적)

결과에 따른 동적 구성을 통해 공격!

입력값 검증이 없어서 생기는 문제.

 

[실습2-1] 취약점 유/무 판별 방법

실습을 위해 게시글 2개를 만들었다. 가장 최근에 쓴 게시글을 눌러보자.

url에 idx=3으로 돼있는 것을 알 수 있다. 3번째로 쓴 게시글이라는 뜻이다. 임의로 url의 3을 2로 바꿔보자.

이전 게시물이 나오는 것을 알 수 있다. url에 4-1를 넣어보자.

3번째로 쓴 게시글이 나오는 것을 볼 수 있다. 연산이 가능하다는 의미이다. 산술 연산으로 취약점 판별이 가능해진 것.

 

사용자 입력(파라미터) -숫자형
-산술 연산자를 통해 판별 가능

 

$query="select* from board where idx={$idx}";

String query="select * from board where idx=" +idx+";

 

url에서는 연산이 되지 않은 모습이지만, 연산이 되어 응답하는 것.

보통 취약점을 판별할 때 1 and 1=1을 입력해보지만, 취약 유무를 빠르게 확인할 때는 산술연산자를 사용하는 것이 좋다. 공격할 때는 전자가 나은 방법일 수도 있다.

 

사용자 입력(파라미터) -문자형

연결 연산자!

te' 'st라고 쓰면 검색되지만, te'bv'st라고 하면 검색이 안 되는 것을 알 수 있다.

mysql> select 'te' 'st';

이렇게 치게 되면 연결연산자가 되어 test값이 반환된다. 둘이 붙는다는 의미.

이를 통해 빠르게 취약 유무를 판별할 수있다.

이렇게 입력해도 test를 검색했을 떄와 같은 결과가 나온다.

test%' and 1=1#

이렇게 하면 #을 통해 뒷부분이 주석이 되므로 1=1이 항상 성립하여 결과를 보여주게 된다.