이 강좌는 deprecated 되었습니다.
https://idongmai.tistory.com/646 이 글로 방문해주시길 바랍니다.
1.php의 기본 틀을 작성합니다.
1 2 3 | <?php ?> |
2.그 후 기본적인 mysql 접속구문을 작성합니다.
1 2 3 4 5 6 7 8 9 10 | <?php $sql_con=mysql_connect("localhost","idongmai","password"); $sql_send=mysql_select_db("idongmai", $sql_con); echo "GET속성에서 aa란 변수 안에 아무 값이나 집어넣어보세요. 인젝션 빼고요 히히 <br>"; if ($_GET[aa]){ mysql_query("INSERT INTO `test`(`no`, `memo`) VALUES (NULL,'$_GET[aa]');",$sql_con ); } ?> |
너무 이 값만 넣으면 식상하니 체크구문까지 더 넣어야겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $sql_con=mysql_connect("localhost","idongmai","password"); $sql_send=mysql_select_db("idongmai", $sql_con); echo "GET속성에서 aa란 변수 안에 아무 값이나 집어넣어보세요. 인젝션 빼고요 히히"; if ($_GET[aa]){ $js=@mysql_query("INSERT INTO `test`(`no`, `memo`) VALUES (NULL,'$_GET[aa]');",$sql_con); if($js){echo "성공"; exit;}else{echo "mysql 연결에러"; exit;} } ?> |
mysql에 기본적으로 넣을 구문이 완성되었습니다.
단 이 강좌에선 인젝션 에러를 집어넣으면 php에서 mysql연결에러가 뜨게 서술합니다. 단, 필자 서버는 php에러가 뜨지 않습니다.
만약 저 페이지로 접속하면 어떻게 될까요?
GET값인 aa값을 빼고 출력하니 저렇게 뜹니다.
이제, aa값에 인젝션을 삽입하면 어떻게 될까요?
그냥 따옴표 하나만 찍었을 뿐인데 오류가 나는걸 목격하실 수 있습니다.
저 상태에서 php코드가 노출되는경우 그저 간단한 피해가 아니라, 큰 피해가 아닐 수 없습니다.
그러면, mysql의 내용은 어떨까요?
mysql접속에러가 뜬 만큼 접속이 진짜 안되시는걸 경험하실 수 있습니다. 물론 글도 안써지지요.
그러면 한번 aa값에 망아지를 대입해 보겠습니다.
그냥 올라갑니다..
메모도 이상이 없이 잘 올라갔습니다.
그러면 이렇게 된 상황에서 mysql인젝션을 이용하여 공격하면.. 로그인도 그냥 먹힐게 뻔해 보입니다.
mysql에서 인젝션을 막기전 회원데이터를 감싸야합니다. 안그러면요..
저런형식으로 sql날리거나 SELECT문에 memo값에 그냥 [\'] 만 넣어도 털리는꼴이되니까요.
네.. 털려요.. 술술털려요..
일반적으로, insert문에서는 php에러가 뜨지 않습니다.
그럼 이제, SELECT문으로 한번 가볼까요?
php파일 하나를 더 작성합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $sql_con=@mysql_connect("localhost","idongmai","password"); $sql_send=@mysql_select_db("idongmai", $sql_con); $sa1=mysql_query("SELECT * FROM `test` WHERE `memo`='$_GET[aa]';"); if ($sa1){echo "mysql 연결 성공 <br>";} else {echo "mysql 연결 실패"; exit;} while ($data=mysql_fetch_array($sa1)){ echo "값 : ".$data[memo]."<br>"; } ?> |
GET로 aa값에 memo에 등록시켰던 내용을 출력시키니 저는 일단 이상이 없었습니다..
에러도 안뜨고요.. 필자 서버는 php에러가 위급한거아니면 씹어먹는단계로 설정해서..
무튼 저거까지 작성해도 못 알아먹는 분들이 있을듯 하여 mysql화면을 첨부합니다.
sql생성완료~
이제 저기에 무작위로 값 10개만 넣어서 실험 진행하도록 하겠습니다.
이 데이터로 진행하도록 하겠습니다.
보통 이런 형식으로 불러와서 데이터 처리를 못해 sql인젝션에 걸리는 형식이 다반사입니다.
SELECT * FROM `test_sql` WHERE `id`='idongmai' and `pw`='비밀번호는 일부러 암호화 안하는겁니다';
이렇게 불러오든
SELECT * FROM `test_sql`
이렇게 불러오든, 데이터를 불러오는 양에 차이가 있지 별 특별한건 없습니다. 중요한건 테스트로 앞에 * 를 사용하여 모두 불러온겁니다.
이런형식으로 바로 표시가됩니다.
그러면 다시 sql인젝션을 이용해 sql인젝션을 건다면 어떨까요?
비밀번호까지 모두 주석이 걸린상태로 진행이되자,
보시다 싶이 인젝션이 먹힌모습을 확인하실 수 있습니다.
저 상태로 mysql에 데이터를 요구하면.. 어어.. 무섭겠죠?
회원 로그인 그냥 획 가는겁니다.. 쭈욱.. 털리는겁니다..
먼저, 필자가 짠 자체 함수를 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php function clear($filter){ $filter=htmlspecialchars($filter); //특수문자 표시 형식을 바꿔버림. ex) 단어가 < 이면 < 로.. $filter=strip_tags($filter); //다시 제거해버림 $filter=addslashes($filter); //특수문자나 따옴표 같은 문자에 역슬래시를 추가함. return $filter; //값을 리턴함. } ?> |
사용방법은 clear(변수나 값); 저런식으로 사용하시면됩니다.
그 후, 다시 처음으로 돌아가서 저 라이브러리가 적용된 소스를 적용시켜보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php function clear($filter){ $filter=htmlspecialchars($filter); //특수문자 표시 형식을 바꿔버림. ex) 단어가 < 이면 < 로.. $filter=strip_tags($filter); //다시 제거해버림 $filter=addslashes($filter); //특수문자나 따옴표 같은 문자에 역슬래시를 추가함. return $filter; //값을 리턴함. } $sql_con=@mysql_connect("localhost","idongmai","password"); $sql_send=@mysql_select_db("idongmai", $sql_con); echo "GET속성에서 aa란 변수 안에 아무 값이나 집어넣어보세요. 인젝션 빼고요 히히 <br>"; if ($_GET[aa]){ $_GET[aa]=clear($_GET[aa]); $js=@mysql_query("INSERT INTO `test`(`no`, `memo`) VALUES (NULL,'$_GET[aa]');",$sql_con); if($js){echo "성공"; exit;}else{echo "mysql 연결에러"; exit;} } ?> |
귀찮아서 파일이랑 통합시켰으나, 이제 '를 넣어도 sql에러가 뜨는일이 없습니다. 즉 sql인젝션에서 해방은 된건지 모르겠습니다.
이 방법도 안전한 방법은 아닙니다. 다른방법을 찾아서 시도하는걸 필자는 추천드리는바 입니다.
쓸대없이 글만 길어졌네요.
아래의 손가락버튼을 눌러주시면 블로그에 매우 큰 도움이됩니다. 히히
Copyright © 이동마이의 컴퓨터 하루 All Rights Reserved.
'Program > 오래된 PHP 게시판2' 카테고리의 다른 글
[PHP]php로 boolean함수를 제작해보자 (0) | 2013.10.27 |
---|---|
[HTML&JAVASCRIPT]자바스크립트로 계산하기 - 곱하기 (0) | 2013.10.23 |
[PHP]PHP세션을 이용해 토큰을 만들어보자 (PHP 토큰제작) (2) | 2013.09.16 |
[PHP]PHP 경로 탐색 공격 예방하기 - idongmai (0) | 2013.07.31 |
[웹보안&PHP]폼 변조에 대해 알아보자 (0) | 2013.07.29 |
댓글