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이 항상 성립하여 결과를 보여주게 된다.
'웹 해킹 & 시큐어 코딩' 카테고리의 다른 글
웹 해킹 & 시큐어 코딩 (6) (0) | 2025.01.15 |
---|---|
웹 해킹 & 시큐어 코딩 (5) (0) | 2025.01.15 |
웹 해킹 & 시큐어 코딩 (3) (0) | 2025.01.13 |
웹 해킹 & 시큐어 코딩 (2) (1) | 2025.01.10 |
웹 해킹 & 시큐어 코딩 (1) (0) | 2025.01.10 |