[MYSQL,PHP]mysql sql 인젝션 공격 예방방법

Program/오래된 PHP 게시판2






이 강좌는 deprecated 되었습니다.

https://idongmai.tistory.com/646 이 글로 방문해주시길 바랍니다.


--


본문

---------

요즘 어나니머스로 인해 인터넷이 많이 떠들썩한데요, 이 어나니머스가 주로 사용하는 공격이 바로 sql인젝션입니다. 이 글은 악용의 소지가 있으나 아직 프로그래밍이 미숙한 분들을 위해 쓰는글이니 너그럽게 봐주시면 합니다.



먼저 실제로 운영중인(?) 사이트의 DB를 사용하도록 하겠습니다. 다 모의계정입니다.


정상적인  mysql의 정보로드방식은 "SELECT * FROM `db_hostname`.`db_name`" 입니다.


여기에 인젝션 공격을 사용하면 어떻게 될까요?


모의 코드를 작성해 보았습니다.


단 이 강좌를 보시고 이해를 하시면 문제가 없을것으로 생각됩니다.



결과는


정상출력입니다.


이점을 악용하여 헤커들이 해킹을 하는데요, 일단 방법을 알고넘어가야 공격을 방지할수있습니다.



그냥 아무값만 넣었더니 아무것도 출력되지 않습니다.

여기서는, 실제 값을 사용하여 쿼리를 이용해 정보를 나오게 하였습니다.


만약에 id만 알고 비밀번호를 모르는경우 어떻게 대처해야할까요?


mysql은 "--","#" 를 주석으로 처리하는데요. 이건 한줄주석입니다.


보통 mysql과 통신할때 개발자들이 mysql에 보내는 데이터를 체크를 안해 인젝션 공격이 발생합니다.


실제 적용중인 사이트에 적용시켜봤습니다.(같은 사이트에요 db이름만 다릅니다.)




로그인의 경우입니다.


이와 같이 소스를 작성할때는 비밀번호가 틀려 로그인이 되지않습니다. 그러면 방법을 바꿔 주석을 이용해서 접속을 하면 어떻게 될까요?



이렇게 된경우 sql에 접속이 됩니다. 하지만 그전에 말했듯이 한줄주석입니다. 보통 헤커들은 한줄주석만 알고있는 경우가 많은데요. 다중 줄 주석 (주석을 쓴곳 다음 모든곳을 주석으로 만들어버림)을 이용할수 있으나 최신 버전의 mysql에서는 막힌걸로 알고있습니다.


과연 저대로 두면 쿼리는 어떻게 되는건지 보여드리겠습니다.




보시다 싶이 뚫렸습니다.




이렇게 두줄로만 해두셔도 일반헤커에게는 뚫리지 않습니다.



이렇게요.


그리고 예방을 하기위해 해야하는게 문자를 필터링해야합니다.


모든 프로그래머들은 사용자가 쓰는값 그건 곧 방사선쓰래기로오염된돌맹이 정도라고 생각하셔야합니다.


필터링은 어떻게 해야하는걸까요?


기본적으로 값은 삭제해야합니다. 그러기 위해 배열을 하나 만들어야하고요.





이런식으로 필터링후 사용하시면 mysql접근이 어렵게 막힙니다.



이런식으로 mysql인젝션 공격을 막음으로서 큰 프로그래밍 보안 효과를 얻을수 있을거라 굳게 믿습니다.


이 글이 이해가 안되면 댓글에 질문해주시면 답변해드리도록 하겠습니다.


아래의 손가락버튼을 눌러주시면 블로그에 매우 큰 도움이됩니다. 히히




Copyright © 이동마이의 컴퓨터 하루 All Rights Reserved.



윤성권 2013.08.19 16:47 URL EDIT REPLY
어떻게 하면 저렇게 구문을2줄로 만들 수 있나요?

'이렇게만 해도 일반 해커에게는 뚫리지 않습니다'
라고 뒤어있는 글 위에를 어떻게 하나요?
Favicon of https://idongmai.wo.tc BlogIcon 한빛가람 | 2013.08.19 22:04 신고 URL EDIT
그냥 엔터만 쳐주시면 되는데요. php의 경우
<?php
$query="SELECT * FROM `데이터베이스이름` WHERE `id`='아이디'

`password`='비밀번호'
";
?>

이런식으로 따로 쿼리를 만드신후 전송시키면 될겁니다.
레버리지효과 2013.08.25 12:16 URL EDIT REPLY
좋은 정보 감사합니다. 손가락 눌러드렸습니다 ㅋㅋ 다음에도 유용한 정보 많이 업로드해주세요! 아주 이해가 잘되고 유용한것 같습니다.
pilot376 2014.10.13 16:33 URL EDIT REPLY
좋은 정보 감사합니다.
Name(이름)
Password(비밀번호)
Homepage(홈페이지)
Secret(비밀글)