[MYSQL & PHP]sql인젝션공격,mysql공격을 막아보자 - part.2

Program/오래된 PHP 게시판2




이 강좌는 deprecated 되었습니다.

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



1.php의 기본 틀을 작성합니다.



2.그 후 기본적인 mysql 접속구문을 작성합니다.


Colored By Color Scripter

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파일 하나를 더 작성합니다.


Colored By Color Scripter

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에 데이터를 요구하면.. 어어.. 무섭겠죠?


회원 로그인 그냥 획 가는겁니다.. 쭈욱.. 털리는겁니다..


먼저, 필자가 짠 자체 함수를 사용합니다.


Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
<?php
  function clear($filter){
$filter=htmlspecialchars($filter); 
//특수문자 표시 형식을 바꿔버림. ex) 단어가 < 이면 &lt; 로..
$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) 단어가 < 이면 &lt; 로..
$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.




Name(이름)
Password(비밀번호)
Homepage(홈페이지)
Secret(비밀글)