select id from db where pw= "" or 1; 일반적으로 매우 기초에서 알려주는 SQLi의 쿼리 예제
1. SQLi 란?
SQL injection을 간단히 줄여서 SQLi 라고 부르고는 합니다.
일단 injection의 사전적 의미는 다음과 같습니다.
1. 주사하다
2. (액체를) 주입하다
3. (특성을) 더하다
(출처 : 네이버사전)
SQL injection에서의 injection은 아마도 3번의 의미이지 않을까 싶다.
특성을 더하다. SQLinjection은 기존의 쿼리에서 사용자가 개입하여
그 쿼리를 변조하여 설계자가 의도한 대로가 아닌 사용자가 원하는 대로 쿼리의 작동을 바꾸는 것이다.
2. 예제
예를 들어보자 만약에 다음과 같은 쿼리에서 value 값을 불러오는데에 성공해야지만 로그인에 성공한 것이라고 인식한다고 하자
Query : select value from db where id='$_GET[id]' and pw='$_GET[pw]';
이 경우 우리가 조작할 수 있는 부분은 GET파라미터 id와 pw이고 설계자가
아무런 처리도 해놓지 않았다면 매우 많은 방법으로 공격이 가능합니다.
하지만 매우 간단한 것만 해보도록 하죠
우리는 저 쿼리의 값을 단순히 참으로 만들어 쿼리를 가져오는데 성공했다고 느끼게 할 것입니다.
pw에 값을 넣어서 무조건 참을 만들어 보죠
다음과 같은 상황을 만들어 보겠습니다.
id = hacker
pw = ' or '1
와 같은 값을 파라미터로 넣어보겠습니다.
그러면 쿼리는 다음과 같이 바뀝니다.
select value from db where id='hacker' and pw='' or '1';
그리고 where 의 조건문에서 and 와 or 중에서 and 의 우선순위가 더 높으므로 앞의 성공하지 않는 컨디션이 처리되고
뒤의 문자열을 수로 캐스트하여 or 처리로 하여
0 or 1 을 통해서 true(1)을 반환한다.
따라서 where 뒤의 조건 값은 참이 되고 value를 얻어오는데 성공한 것 처럼 작동합니다.
설계자가 의도하지 않은 대로 작동한 상황입니다.
이런 식으로 SQLi는 쿼리를 조작하여 우리가 원하는 값을 얻어오거나 어떤 동작을 하게 만드는 것입니다.
SQL은 종류가 정말 많습니다. SQL Server, MySQL, Oracle 등등..
모두 각각 같은 문법도 있지만 서로 문법이 다른 부분도 있습니다.
그래서 여러 SQL을 다룰 줄 알아야 되며 이런 것을 막기 위해서는 우리가 어떻게 해야하는 지도 알고 있어야 합니다 (공격과 방어)
앞으로 SQLi에 대해 더 깊이 알아봅시다
'Security > SQL Injection' 카테고리의 다른 글
[ 01 ] Blind SQL Injection (0) | 2017.12.07 |
---|---|
[Memo] - MySQL 이 동일 취급하는 문자들 (0) | 2017.11.09 |