2024. 4. 26. 15:12ㆍProject/Web Application-모의해킹
시큐어 코딩 : 사용자 입력 값 검증
1) 개요
Project:Web Site 웹 사이트 로그인 페이지 user_id 파라미터에서 발견된 SQL Injection 취약점을 방지하기 위하여 대응 방안 중 하나인 사용자 입력 값 검증 로직을 구현하고 적용시켜 실제로 SQL Injection 공격을 방지할 수 있는지 확인한다.
2) 방법
사용자 입력 값 검증은 Client Side에서 구현을 하게 되면 공격자에 의해 변조될 가능성이 존재하므로 보안을 위해 Server Side에서 구현을 한다. 또한 검증 필터링 방식은 블랙 리스트 기반 필터링 대신 보안적인 측면에서 더 강한 화이트 리스트 기반 필터링 방식을 사용한다. 적용 대상이 로그인 페이지의 user_id 파라미터이므로 알파벳 대소문자 및 숫자만 리스트에 추가하여 입력을 허용한다. 그러나 이러한 방식으로 로직을 구현하게 되면 사용자 계정도 알파벳 대소문자 및 숫자만으로 구성되도록 회원가입 페이지에서도 로직을 구현해야 하는 번거로움이 존재하는 것을 인지한다.
3) 시큐어 코딩
[1] login_proc.php 페이지 전문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?php
require_once("db.php");
// 로그인 페이지에서 전송된 변수 저장
$user_id = $_POST['user_id'];
$user_pass = $_POST['user_pass'];
session_start();
// URL 직접 입력 접근 방지
if(!strlen($user_id) || !strlen($user_pass))
{?>
<script>
alert('권한이 없습니다.');
window.location.replace('/php/login.php');
</script>
<?php
exit();
}
if(!preg_match("/^[a-zA-Z0-9]*$/", $user_id))
{?>
<script>
alert('특수문자가 포함되어있습니다.');
window.location.replace('/php/login.php');
</script>
<?php
exit();
}
// 데이터베이스에 저장되어있는 아이디와 비밀번호 비교
$result = db_select("test_user",$user_id);
$row = mysqli_fetch_array($result);
// 입력된 비밀번호와 데이터베이스의 비밀번호가 일치여부를 비교하여 일치하면 TRUE, 불일치하면 FALSE를 반환한다.
$match_pass = password_verify($user_pass, $row['user_pass']);
// $match_pass 값이 TRUE인 경우(비밀번호 일치)
if($match_pass){
$_SESSION['user_id'] = $row['user_id'];
header("Location:/php/");
exit();
}
// $match_pass 값이 FALSE인 경우(비밀번호 불일치)
else{?>
<script>
alert('아이디 혹은 비밀번호가 틀렸습니다.');
window.location.replace('/php/login.php');
</script>
<?php
}
?>
|
cs |
[2] 사용자 입력 값 검증 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
if(!preg_match("/^[a-zA-Z0-9]*$/", $user_id))
{?>
<script>
alert('특수문자가 포함되어있습니다.');
window.location.replace('/php/login.php');
</script>
<?php
exit();
}
?>
|
cs |
login_proc.php 페이지에서 사용된 사용자 입력 값 검증 코드는 21번 라인부터 29번 라인까지이다. 해당 웹 사이트는 PHP로 개발되었기 때문에 PHP 문법을 이용한 사용자 입력 값 검증 기능을 구현하였다. 사용된 함수는 preg_match() 함수이며 해당 함수는 정규 표현식을 이용하여 필터링을 적용할 수 있다.
preg_match($pattern, $string[, $matches]);
preg_match() 함수는 세 인수로 구성되어있다. 첫 번째 인수는 정규 표현식으로 구성된 패턴이며 두 번째 인수는 첫 번째 인수에서 전달받은 패턴이 포함되어 있는지 확인할 문자열을 의미한다. 세 번째 인수는 패턴에 해당하는 문자열을 저장하는 반환값을 의미하며 이는 생략 가능하다. preg_match() 함수는 일치하는 패턴이 존재하면 1을 반환하고, 존재하지 않으면 0을 반환한다.
preg_match() 함수에 적용된 정규 표현식 "/^[a-zA-Z0-9]*$/"의 의미는 알파벳 대소문자와 숫자로만으로 이루어진 문자열을 의미한다. 따라서 해당 preg_match() 함수에서는 $user_id의 값이 이러한 정규 표현식에 해당하는 문자열인지 검사한다. 위 사용자 입력 값 검증 코드는 로그인 페이지에서 전달받은 아이디에 알파벳 대소문자와 숫자 이외의 문자가 포함되면 Javascript로 경고문을 띄우고 다시 로그인 페이지로 돌아가도록 구현하였다.
[3] 동작 화면
로그인 페이지에 접속하여 로그인 가능한 계정 정보를 입력하고 로그인 버튼을 클릭한다. 사용된 계정은 vanhart, 비밀번호는 123123이다.
페이로드 : vanhart' and '1'='1
모의해킹에서 SQL Injection 취약점을 발견했을 때 사용한 페이로드를 입력하고 로그인 가능한지 확인한다. 위 페이로드를 아이디 입력 칸에 입력하고 로그인 버튼을 클릭한다.
로그인 버튼을 클릭하게 되면 '특수문자가 포함되어있습니다.'라는 경고문과 함께 로그인 페이지로 이동된다.
'Project > Web Application-모의해킹' 카테고리의 다른 글
[Web Application-모의해킹] SQL Injection : 시큐어 코딩(Prepared Statement) #3-4 (0) | 2024.04.27 |
---|---|
[Web Application-모의해킹] SQL Injection : 시큐어 코딩(에러 메시지 출력 방지) #3-3 (0) | 2024.04.27 |
[Web Application-모의해킹] SQL Injection : 대응 방안 #3-1 (0) | 2024.04.25 |
[Web Application-모의해킹] 증적 사진 분류 19, 20, 22, 27 #2-3 (0) | 2024.04.22 |
[Web Application-모의해킹] 증적 사진 분류 12, 13, 15, 17 #2-2 (0) | 2024.04.22 |