[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--+
댓글
댓글 쓰기