[SQL Injection] DB 보안설정 : 저장 프로시저의 활용

 DB 보안설정 



저장 프로시저의 활용

SQL 인젝션은 DB에서 쿼리가 실행되기 때문에 DB에서 방어가 가능하다면 좋겠지만 웹어플리케이션에서 발생한 취약점은 DB에서 방어할 수 없습니다

그래서 SQL 인젝션을 DB에서 방어 한다는것은 불가능에 가깝습니다.
다만 일부 기능을 이용하여 취약점으로 인한 정보 노출을 제한하거나 완화할  수 있습니다 . 



















SQL 인젝션의 취약점 피해를 DB에서 완화 시키기 위한 현실적인 방법으로는 웹 어플리케이션에서 저장 프로시저를 이용하여 데이터를 조작하는 방법이 있습니다 . 



저장 프로시저 적용하기 

저장 프로시저를 이용한 방법으로 간혈적으로 이 방식에 대해서 매우 안전한 것으로 소개됩니다 . 
보안이 강화 될수도 있지만 개발자의 실수를 어느정도 완화시켜준다는데 의미가 있습니다 . 


1. 숫자형 데이터

프로시저를 생성합니다 


















저장 프로시저 실행은 CALL 명령을 사용합니다 . 
















CALL을 이용한 쿼리 명령을 사용하기 위해서는 mysqli 함수를 사용해야 합니다 . 
앞서 실습한 프리페어드 스티이트먼트 적용한 소스코드를 수정해보겠습니다 . 
<?php
$conn = new mysqli('localhost', 'root', 'root', 'northwind');



if ($conn->connect_Error) {
    die("Connection failed : " . $conn->connect_Error);
   
}

$_empid =$_GET['empid'];
$stmt=$conn->query("CALL EMPINFO($_empid)");
#$sql    = 'SELECT * FROM Employees WHERE EmployeeID=' . $_empid;
#$result = mysql_query($sql, $link);

#if (!$result) {
#    echo "DB Error, could not query the database\n";
#    echo 'MySQL Error: ' . mysql_error();
#    exit;
#}

print "<table border=1 cellpadding=5 cellspacing=0>\n";
print "\t<tr>\n\t\t<td>Employee ID</td><td>First Name</td><td>Title</td><td>Hire Date</td>\n\t</tr>";

while ($row = $stmt->fetch_object()) {
    print "\t<tr>\n\t\t<td>" . $row->EmployeeID . "</td><td>" . $row->FirstName . "</td><td>" . $row->Title . "</td><td>" . $row->HireDate . "</td>\n\t</tr>\n";
}
print "</table>\n";
$conn->close();
#mysql_free_result($result);
?>



/empinfo_id.php?empid=1'












DB의 에러 메세지가 노출 되지만 저장 프로시저에 매개변수가 숫자형으로 저장되어 있어서 숫자 외에는 모두 동일한 에러가 출력됩니다 .

 

2. 문자형 데이터

저장 프로시저 생성 

















mysqli 예제로 변경한 empinfo_id.php 예제를 empinfo_name2.php로 복사하고 다음과 같이 수정합니다 . 
$_empname =$_GET['empname'];
$stmt=$conn->query("CALL EMPNAME('$_empname')");


/empinfo_name2.php?empname=Nancy'








ㅅ숫자형 데이터 예제와 동일한 에러가 발생합니다 . 
그러나 이데이터는 문자형으로 싱글 쿼터의 주입가능 여부가 공격가능 여부라고 할 수 있습니다 . 
시간지연 함수를 주입하여 쿼리 실행여부를 확인해 보겠습니다 . 

/empinfo_name2.php?empname=Nancy%27%2Bsleep(1)%2B%27












아무런 에러를 출력하지 않고 1초 지연 후 응답 페이지가 회신됩니다 . 

주입한 시간 지연 쿼리가 실행되어 SQL 인젝션에 취약하다는 것을 알 수 있지만 저장 프로시저로 취약점 분석 및 공격 구문 제작에 많은 시간이 소요된다는 차이점이 있습니다 .

취약점을 안전하게 제거 하기 위해서는 앞서 실습한 시큐어 코딩 기법을 사용해야 합니다 







댓글