* 이 글을 보고 악용할 시 생기는 피해의 책임은 저에게 없음을 알립니다.
SQL Injection 이란?
SQL Injection 은 단어 그대로 SQL 을 Injection(주입) 하는 웹 해킹 기법이다.
SQL 란 데이터베이스를 구축하고 활용하기 위해 사용하는 언어가 바로 SQL이다.
SQL Injection 기본 원리
우리가 흔히 알고있는 네이버, 다음, 구글, 네이트, 줌 등등 90%의 사이트는 DB를 갖추고 있다.
이때 DB에 데이터를 추가, 수정, 삭제를 하기 위해서 SQL를 이용하는데 SQLi (SQL Injection)로
위 내용을 역으로 이용해서 사용자단(Client)에서 DB의 데이터를 추가, 수정, 삭제. 즉 열람이 가능하게 한다.
SQL Injection 의 간단한 예
사용자가 로그인을 시도하면 아이디와 패스워드의 값이 PHP를 지나 sql문에 담겨 DB로 전송이 된다.
'select * from members where id = '[id]' and pwd = '[pw]' ' 이렇게 생긴 로그인을 담당하는 sql가 있다.
관리자의 아이디는 admin 이라고 치고 간단한 가상 SQL injection 을 해보자.

위처럼 생긴 로그인창이 있다고 가정하자.
관리자의 아이디는 admin 이라고 한다.

이렇게 어드민을 대입해주자.
근데 비밀번호를 모른다, 하지만 이 로그인 창의 가장 취약한 취약점은 쿼리 전송방식이다.
select id from [table_name] where id='' and pw='' 이렇게 쿼리문이 있다면
나는 지금 id부분에 admin 을 넣었다. 그러면 id에는 'admin' 이 들어간다.
select id from [table_name] where id='admin' and pw=''
위에서 말했듯이 패스워드를 모른다. 나는 pw가 무조건 참으로 처리되도록 질의문을 보낼것이다.
id = admin 이후에 것을 모두 주석처리해버린다면 어떻게 될까?

이렇게 한다면
select id from [table_name] where id='admin'--' and pw=''
위 처럼 id 뒤에부터 모두 주석처리가 되어 버린다.

(가짜) 관리자 로그인 성공 사진.PNG
SQL Injection 는 주로 어디서 발생하나?
사실 위 예제처럼 막 ID부분에 '-- 를 대입한다고 로그인이 슝슝 되지는 않는다.
SQL Injection 의 발생 이유는 질의문을 확인하지 않고 바로 서버로 넘겨서 발생하는 취약점인데
로그인창같은 이용자에게 바로 눈으로 보이는곳 보단 url 뒤에붙는 파라미터에서 주로 발생한다.
예를 들어서 abc.com 이란 사이트가 있고 p라는 파라미터를 받고 게시글의 내용을 띄워준다고 가정하자.
abc.com/index.php?p=1
위는 파라미터에 1을 전달해주고 게시글의 내용을 잘 띄워주는 정상적인 URL 이다. 하지만
abc.com/index.php?p='
위는 싱글쿼터를 넣어줬다. 이렇게 되면 db에 있는 게시글의 내용을 가져올때
싱글쿼터로 인해서 sql 전달에 문제가 발생하게 되면서 SQLi 취약점이 발견될 수 있다.
댓글 없음:
댓글 쓰기