[ 환경 ]
DVWA | v1.9 |
Burp Suite | Community Edition v2024.11.2 |
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$id = $_GET[ 'id' ];
if(is_numeric( $id )) {
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
if( $data->rowCount() == 1 ) {
$first = $row[ 'first_name' ];
$last = $row[ 'last_name' ];
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
generateSessionToken();
앞서 살펴본 소스코드는 SQL Injection 공격을 방어할 수 있는지만 XSS 공격에는 취약하다.
사용자 입력값 $id를 그대로 출력하기 때문에 XSS 공격에 취약하다. 이를 해결하기 위해 출력 시 htmlspecialchars()를 사용하여 HTML 특수 문자를 이스케이프 처리한다.
echo "<pre>ID: " . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . "<br />";
echo "First name: " . htmlspecialchars($first, ENT_QUOTES, 'UTF-8') . "<br />";
echo "Surname: " . htmlspecialchars($last, ENT_QUOTES, 'UTF-8') . "</pre>";
숫자가 아닌 값을 입력하거나 조회 결과가 없을 경우 사용자에게 아무런 피드백을 제공하지 않는다. 이를 해결하기 위해 입력값이 숫자가 아니거나 결과가 없을 경우 적절한 메시지를 출력한다.
if (!is_numeric($id)) {
echo "<pre>Invalid ID format. Please enter a numeric ID.</pre>";
} elseif ($data->rowCount() === 0) {
echo "<pre>No user found with the given ID.</pre>";
}
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
if (!checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' )) {
die("<pre>Invalid CSRF token. Request denied.</pre>");
}
$id = $_GET[ 'id' ];
if (!is_numeric($id)) {
echo "<pre>Invalid ID format. Please enter a numeric ID.</pre>";
} else {
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
$row = $data->fetch();
if ($data->rowCount() == 1) {
$first = htmlspecialchars($row['first_name'], ENT_QUOTES, 'UTF-8');
$last = htmlspecialchars($row['last_name'], ENT_QUOTES, 'UTF-8');
echo "<pre>ID: " . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . "<br />First name: {$first}<br />Surname: {$last}</pre>";
} else {
echo "<pre>No user found with the given ID.</pre>";
}
}
}
generateSessionToken();
?>
CSRF 보호
XSS 방지
유효성 검사
보안 강화
DVWA : SQL Injection - High level (0) | 2025.01.07 |
---|---|
DVWA : SQL Injection - Medium level (0) | 2025.01.06 |
DVWA : SQL Injection - Low level (0) | 2025.01.05 |
DVWA : File Upload - Impossible level (0) | 2025.01.05 |
DVWA : File Upload - High level (0) | 2025.01.05 |