2023. 5. 22. 09:30ㆍ해킹/CSRF
저번 시간에는 GET 방식으로 사용자의 password를 변경하는 곳에 CSRF공격을 통해서 비번을 바꿔보았습니다.
하지만 POST 방식으로 바꾼다면 무용지물이죠.
<?php
include "connect.php";
?>
<?php
session_start();
$id = $_SESSION['userid'];
$pw = $_POST['pw'];
if($pw != null){
$sql = "Update test_tbl set pass = '$pw' where id = '$id'";
$result = mysqli_query($conn, $sql);
echo "<script>alert('변경에 성공하셨습니다'); location.href = 'modify.php';</script>";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Modify</title>
</head>
<body>
<h1>Modify</h1>
<form method="POST" action="">
새로운 비밀번호 : <input type="text" name="pw"> <br>
<input type=submit>
</form>
</body>
</html>
바꾸어 보았습니다.
하지만 이것은 무적이 아닙니다.
우리들의 친구...XSS가 있기 때문이죠.
게시판 측에 XSS 공격을 통해서
사용자 비밀번호 변경 페이지에 POST 방식으로 요청을 하는 것 입니다. (CSRF)
이 처럼 두개의 공격이 연계되면 소용이 없습니다.
한번 시도 해 봅시다.
먼저 게시판에 악성 스크립트를 삽입합시다.
요청을 할 때 XML REQUEST는 보안 정책에 따라서 막혔다고 합니다.
따라서 가장 흔히 보이는! Form 태그를 이용해서 요청 해 봅시다.
이런식으로 게시물을 작성합니다.
XSS 공격이 일어나서 중간에 해커가 입력한 form 태그가 보입니다.
이것을 클릭 해 보면...
정상적으로 1523으로 변경되었습니다.
즉 POST 도 아무 소용이 없다는 소리입니다.
하지만, 이걸 누가 클릭해 라고 생각하실수도 있습니다.
클릭을 안해도 자동적으로 실행하면 됩니다....
어떻게요? 자바스크립트를 이용해서요!
이렇게 하면 페이지에 들어온 순간 바로 제출이 되겠죠.
네... 이렇게 바로 바뀌네요.
이제 좀 위험성이 체감됩니다.
하.지.만
여전히 문제점은 피해자측이 비밀번호 변경 시도를 바로 알 수 있다는 점 입니다.
아주 은밀하게,치밀하게 바꿔버려야죠.
어떻게 하느냐. iframe를 사용하는 방법입니다.
iframe를 사용하면 웹 페이지 안에 또다른 웹 페이지를 삽입할 수 있습니다.
보통 웹 페이지 광고를 생각하시면 됩니다.
한번 시도 해 봅시다.
비밀번호는 0000hack0000으로 바꾸겠습니다. value에서 설정하세요.
target 속성을 iframe로 지정해서 결과를 iframe에 표시합니다.
iframe의 가로 세로 테두리를 모두 없애고 display: none을 통해서 화면에서 보이지 않게 처리합니다.
단순히 보이지 않는것 뿐 안에서 처리는 계속됩니다.
이제 클릭을 하면
변경에 성공하셨습니다 까지는 똑같고
다시 그 페이지에 머무네요.
비밀번호는 변경되었습니다.
저 알람창만 안뜨면 사용자는 자신의 비밀번호가 바뀌었다는 사실을 모릅니다.
다시 한번 점검을 합시다.
input 태그를 hidden으로 감춰버립니다.
iframe의 sandbox 속성은 보안 설정입니다.
allow-forms를 입력해서 form은 허용하되
ifame 페이지의 자바스크립트는 실행되지 않게 막았습니다.
다시 해 봅시다.
이제 페이지는 XSS 공격을 한지 안한지 구분을 못 할 정도로 정상적으로 보입니다.
비밀번호는 해커의 비밀번호로 변경되었습니다.
정말 무서운 공격입니다!!!!
다음 시간에는 이 무서운 XSS+CSRF 공격을 대응하는 방법을 알아봅시다.
'해킹 > CSRF' 카테고리의 다른 글
CSRF 공격 1,2번 문제 취약점 정리 (0) | 2023.05.25 |
---|---|
게시판 CSRF 공격과 취약점 고치기 (0) | 2023.05.21 |
CSRF 공격 학습 (0) | 2023.05.19 |