[실습8-5] 취약 환경 시큐어 코딩 적용 실습
우선 저번에 실습할 때 작성해둔 코드는 싹 지워준다 (action.php에서의 검증 로직)
파일을 업로드하는 write 부분과 modify 부분에 시큐어 코딩을 적용해주어야 한다.
action.php에서 다음과 같이 코딩한다. 우선 화이트 리스트 방식으로 허용된 확장자만 받도록 한다. (png, jpg, gif)
그리고 이 외의 확장자가 들어오면 허용된 확장자가 아니라고 표시하며 종료시킨다.
또한, 파일명을 바꿔서 저장할 계획이므로 이를 sha1 해시함수로 변환시켜서 저장하도록 한다. 확장자는 그대로 유지해야 하므로 $final_filename .= ".".$ext; 이렇게 작성해주었다. 이렇게 되면 파일명으로 내부 웹 디렉터리에 혼란을 주는 것을 피할 수 있다.
또한 밑의 줄에
$query = "insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$final_filename}', '{$secret}', now())";
$db_conn->query($query);
기존에 uploadFile로 되어 있던 걸 final_filename으로 바꿔준다. 그러면 게시글을 열람했을 때 기존의 파일명이 아니라 해쉬함수 처리 된 파일명을 볼 수 있을 것이다.
이제 이 코드를 저장하고, 직접 웹 페이지가 어떻게 작동하는지 확인해보자.
우선 php 파일을 업로드하려고 시도해보자.
이렇게 경고창이 나온다.
png, jpg, gif가 아니기 때문이다.
그럼 이번엔 사진 파일을 업로드해보자.
크기가 너무 크면 업로드가 안돼서 사진 크기를 바꿔주었다..ㅎㅎ
이렇게 업로드를 시도해보자.
얼마나 작게 만들었냐면 이렇게 작게 만들었다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 가로 세로 10 13이다 ㅋㅋㅋㅋㅋ
ㅠㅠ 근데 안된다
이유를 모르겠다
아무튼 사진 파일을 잘 업로드하면 view page에서는 해쉬함수가 적용된 png 파일이 나온다. 이건 그 전에도 있었던 문제점이라 어떻게 해결해야 될지 모르겠다.
+수정)
사진 파일에 문제가 있는 것 같아서 다른 파일을 다운받아보았다.
감사합니다 예원씨
예원이가 보내준 파일을 넣고 올려보면?
성공적으로 업로드된다! sha1 해쉬함수를 적용시켰기 때문에 게시글에선 이렇게 뜬다.
웹 디렉터리도 확인해보자.
오!! 원본 파일명 그대로 저장되어 있는 걸 확인할 수 있다.
아무튼 아까는 화이트 리스트 방식으로 했으니 이번에는 블랙 리스트 방식으로도 시큐어 코딩을 해보자.
이렇게 만들어주었다. 화이트리스트 방식과의 차이점은, 우선 안되는 확장자명을 나열해준 다음에 if 조건문에서 아까는 부정 (!)을 했다면, 이번에는 $ext_black_arr에 있다면 허용된 확장자가 아니라고 뜨게끔 만들어주면 된다.
이렇게 저장하고 php를 넣어보자.
이렇게 허용된 확장자가 아니라고 뜨며 잘 코딩된 것을 확인할 수 있다.
그리고 아까 png 파일을 올리려고 헀을 때 무슨 문제인진 모르겠지만 자꾸 업로드가 안돼서
이번엔 블랙리스트 방식으로 적용한 후에 hi.txt라는 작은 파일 하나를 업로드해보았다.
그러면 아까 sha1 해쉬함수를 적용했기 때문에 그대로 해쉬함수로 적용돼서 파일명이 바뀌는 것을 알 수 있다.
다운 받을 떄에는 이렇게 웹디렉터리에 원래 이름대로 나타난다. 그냥 게시글에서 파일명이 해쉬함수로 바뀌어서 나오는 것일 뿐! 원본 파일명은 웹디렉터리에 저장되어 있다.
modify 부분도 위에처럼 이렇게 시큐어코딩해준다.
아까 위에서도 write 부분에서 다시 $uploadFile = $final_filename; 로 바꿔준다. 이게 더 편할 것 같다. 마찬가지로,
$query = "insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())";
$db_conn->query($query);
아까 final_filename로 바꿨던 부분을 다시 원래대로 uploadFile로 바꿔준다. (안 바꿔도 상관은 없겠지만 원활한 코딩을 위해)
이렇게 modify 페이지에서도 파일 업로드를 수정할 때, 화이트 리스트 방식을 적용했기 때문에 사진 파일들만 업로드될 것이다.
'웹 해킹 & 시큐어 코딩' 카테고리의 다른 글
웹 해킹 & 시큐어 코딩 (30) (0) | 2025.02.22 |
---|---|
웹 해킹 & 시큐어 코딩 (29) (0) | 2025.02.21 |
웹 해킹 & 시큐어 코딩 (27) (0) | 2025.02.18 |
웹 해킹 & 시큐어 코딩 (26) (0) | 2025.02.15 |
웹 해킹 & 시큐어 코딩 (25) (0) | 2025.02.06 |