웨에에엡 해애애애애 키이이잉 유우욱 주차아아 과아아제에에[CSRF,XSS]
1)https://www.youtube.com/watch?v=nzoUgKPwn_A
Cross Site Request Forgery 공격기법은 웹사이트가 어느정도의 보안수준을 갖추었을때 사용할 수 있는 기법(여전히 스크립팅 공격은 가능하다는 전제하에 가능!)
사용자의 권한 탈취는 불가능하지만 특정 사용자가 어떠한 행위를 하도록 할 수 있다!
*POST 방식으로 서버로 전송되는 데이터도 주소값 뒤로 줄 수 있다. (따로 POST방식으로만 받기로 정하지 않은 경우에 한함)
2) https://dreamhack.io/learn/1/7#19
후 시작해보쟈
CSRF - 웹 브라우저는 기본적으로 Same-Origin-Policy(흠,,그냥 보안정책 중 하나, 다른 오리진의 리소스를 요청하거나 상호작용하는 것 금지)에 위반되지 않는 모든 요청에 쿠키를 함께 전송한당. 이때 비정상적으로 사용자의 의도와 무관하게 다른 사이트에 HTTP 요청을 보내는것을!? CSRF 공격이라고 한다.
CSRF 공격 -> 해당 세션 쿠키를 가진 사람만 사용할 수 있는 기능을 요청할 수 있다.(사용자의 의도와 무관하게, 공격자의 의도대로)
CSRF 공격을 성공적으로 수행하기 위해서는 아래의 2가지 조건 요구댐
1. 해당 웹사이트가 쿠키를 이용한 인증 방식을 사용해야함.
- 모든 HTTP 전송에는 쿠키가 함께 전송되는데, 우리가 이 공격에서 사용하는 세션 아이디도 쿠키에 저장된 값이 전송되기 때문
2. 공격자가 사전에 알 수 없는 파라미터가 존재하면 안된다
- 예를 들어 자동 입력 방지 문자를 넣어야하는 요청, 또는 비밀번호 변경 기능에서 기존 패스워드를 입력받아야 하는 경우
공격자의 예상대로 송금을 받는 사용자(to), 송금하는 금액(amount), 이렇게 2가지의 파라미터만 존재한다.이 두개의 파라미터와 쿠키를 함께 bank.dreamhack.io에 HTTP요청을 하게 됩니당!
후 이 문제만 보면 to파리미터로 dreamhack을 주고, amount 파라미터로 1000000을 주면 될거같다!!
이렇게 게시물을 작성하면 사용자가 저 게시물을 클릭했을때! 자기도 모르게 dreamhack의 계좌로 1000000원이 송금될것같다. 후 해보자!!
뭐지잉
아 잘못 입력했구나
태그를 안닫아주는 실수를!!?? 게시글을 작성하면?
쪼기 밑에 보면 이 글을 클릭한 사용자들이 자기도 모르게 dreamhack의 계정으로 돈을 송금하고 있다..!무섭다
이런 무서운 CSRF 공격을 막기 위한 두가지 방법이 있다.
1. 세션 쿠키 대신 커스텀 헤더를 사용하여 사용자 인증
- 사용자 인증만을 위한 헤더를 추가한다!
2. 공격자가 예측할 수 없는 파라미터 추가 및 검증
- Same Origin에서만 접근 가능한 데이터를 삽입
-CAPTCHA
-정상적인 사용자만 아는 기존의 값을 물어본다! 예를 들어 비밀번호
위 두가지 방식은 오버헤드가 발생(서버 사이드에서 추가적인 검증을 진행하는 것이기에 서버 코드에 검증 로직이 추가될 수 밖에 없음)
CSRX 공격이 가능한 이유를 생각해보면 다른 사이트로부터 시작된 요청에 쿠키를 함께 전송하기 때문이다.
최근에 쿠키에 SameSite라는 옵션이 추가되어 같이 저장되게 되었다.
이는 3가지 값 중 하나를 설정할 수 있는데 그것은 Strict, Lax, Normal이다.
{
Normal 옵션은 기존과 동일하게 모든 요청에 쿠키를 삽입한다.
Lax 옵션은 Link, Prerender, Form GET 을 제외한 요청에는 쿠키를 삽입하지 않는다.
Strict 옵션은 모든 크로스 사이트에서 출발한 요청에 해당 쿠키를 삽입하지 않는다.
}
워어어어 게에에에에에에이이이이ㅣ이이이이이ㅣㅁ
1. https://www.root-me.org/en/Challenges/Web-Client/CSRF-0-protection
흐음,,가입을 해야하나
회원가입한대로 아이디와 비번을 적고 로그인을 시도하니!?
모지 프로필을 봐보자
위에 사이트 탐방하면서 본 것들보다 이게 더 중요해보인다.
흠
이메일 주소가 어떤 이름으로 전송되는지는 잘 모르겠지만 일단 comment 칸에 입력한 데이터는 comment라는 이름으로 주어진다
아니아니 잠깐,,후,, 정리를 해보자구요!?
private탭으로 들어가면 뜨는 이 문구! 관리자가 내 계정을 승인하게 만들어야한다 후.
관리자가 사용자의 계정을 승인하는 탭은 Profile 같다.
오 저기 이상한거 발견!
일단 post 방식으로 전해지고~ enctype 속성은 폼 데이터(form data)가 서버로 제출될 때 해당 데이터가 인코딩되는 방법을 명시한다!
저기서 enctype 속성의 속성값으로 주어진 "multipart/form-data"는 모든 문자를 인코딩하지 않음을 의미한다!
그럼 뭐 따로 인코딩할 필요는 없을거같당,,
흠 여기서 가져갈껀 username이라는 파리미터로는 내 아이디인 "jagosipda"가 들어가야겠구나,,정도? 하 모르겠다
그냥 아무거나 써보자 후
의도한 바는 이렇다!
관리자가 내 이메일을 확인함과 동시에 profile 탭으로 이동하게 되는데, 그때 파라미터값으로 아까 위에서 알아낸 username=jagosipda와 status=1을 주었다. status=1을 준 이유는 뭔가,, 아까 profile 탭에서 어드민 계정일시에 활성화되는 체크박스가 있길래 1을 주면 될거같아서,,모르겠다!!!
하씨 안해줄거면서 왜 연락 기다리래,, 너무해
후...그 과제파일에 힌트가 있었다!!
오옹 발췌를 하는건가보다,,
발췌를 하라니깐 흠,,아까 봐놨던 기능들이 있는 부분 아닐까?
이걸 발췌,,?
이렇게?
이대로 submit..?
될리가 없찌,,
아니 근데
<form action="?action=profile" method="post" enctype="multipart/form-data">
<div class="form-group">
<label>Username:</label>
<input type="text" name="username" value="jagosipda">
</div>
<br>
<div class="form-group">
<label>Status:</label>
<input type="checkbox" name="status" disabled >
</div>
<br>
<button type="submit">Submit</button>
</form>
이렇게 만약 내용에 써서 보내!
그럼 관리자가 이 글을 누를거고!
그럼 뭐 어쩔건데? 저 form 태그에서 submit 버튼을 누르지는 않을거아냐
끄지!!??
맞지??
그럼 자동으로 저게 눌렸으면 하는데,, 저거 눌리면 되지 않겠어?
https://mainia.tistory.com/3850
갓구글,,
script 태그 안에 getElementByID()를 사용해 form 태그의 객체를 가져오는거다!! form 태그의 아이디를 저 안에다가 딱!
document.getElementByID("form태그의 id 속성값").submit() 을 해주면 form의 객체가 전송함수인 submit()을 실행시킨다!
후 해보자
기존에 있던 submit 타입의 input 태그를 지워주고 form 태그 뒤에 스크립트 태그를 붙여주었다.
물론 저기 form 태그의 아이디로 들어간 huhahuha는 form 태그 속성값으로 추가하였다! 후 간다.
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
후,,
한참을 고민했다..
사실 누워있었다.
마지막 희망이 하나 남긴 했는데
그건 바로!!!!!
status 체크박스,,
disabled로 해놓을거면 왜 해놓은거지
굳이 넣어놓을 필요가 없지 않나?
아깐 이걸 의심해서 status=1을 넣어봤었다. 근데 1로 해결될거 같지는 않고,,
구글링!
오오오오오ㅗ오오오
체크박스에 체크를 시켜놓을 수가 있었다.
disabled 자리에 checked를 넣으면 된다.해보자 후
<form action="?action=profile" method="post" enctype="multipart/form-data" id="huhahuha">
<div class="form-group">
<label>Username:</label>
<input type="text" name="username" value="jagosipda">
</div>
<br>
<div class="form-group">
<label>Status:</label>
<input type="checkbox" name="status" checked >
</div>
<br>
</form><script>document.getElementById("huhahuha").submit(); </script>
후핳
후핳
후핳
왜
안
돼
?
아!!!
아!!!!
아!!!!
아!!!!
form 태그 맨 처음에 뭔가 잘못된거 같아
form 태그가 전송될때 켜지는 주소가 이상합니다. 관리자가 어느 상태에 있을줄 알고 지금 그 사이트에서 파라미터로 action=profile을 줍니까!!!
상대주소가 아니라 절대주소..? 풀 어드레스..? 힣 모르겠다 그냥 주자.
<form action="http://challenge01.root-me.org/web-client/ch22/index.php?action=profile" method="post" enctype="multipart/form-data" id="huhahuha">
<input type="text" name="username" value="jagosipda">
<input type="checkbox" name="status" checked >
</form><script>document.getElementById("huhahuha").submit(); </script>
쓸데없어보이는거 좀 정리해줬다.
후 간다..?
야쓰 꿍쓰꿍쓰꿍쓰 꿍쓰꿍쓰꿍쓰 쿵쿵따리 쿵쿵따리
후우우,, 마지막 과제다. 시작해보자
호오 영어다.
해석해보자! 노츠 풜 올 스테이쥐스,,하씨
확인.
그냥 alert(document.domain);을 삽입하여 현재 페이지 주소를 alert하는게 목표다
한 번 해보니깐 사용자의 입력을 그대로 출력하는걸로 볼 수 있었다.
그럼 뭐 검색창에
<script>alert(document.domain);</script>
를 입력해주면!?
깼당 ㅎㅎ
옹 똑같다. 뭔가 필터링이 있겠지?
와 이게 뭔데..?
출력을 하는게 아니고 그냥 그대로 검색창에 남아있다.
이건,,흠
value 속성값으로 입력한 값이 들어가버린다...어카지 이거
모르겠다~ 힌트 보자~
어 이거 뭔가 딱 해석해봐. 현재의 태그를 닫고 스크립트 태그를 넣어라
호우씨 아이 갓 츄~!
아까 위에서 확인했던 사용자의 입력값이 들어가는 곳에 사용해보자
"><script>alert(document.domain);</script>"
처럼 작성해주면???
이렇게 들어가버리고!?!!?!??!?
유후~
후우
목표는 똑같구,,
되게 신기한 검색방식이다
사용자가 입력한 값이 그대로 출력되는거 같으니 스크립트 코드 그대로 넣어보겠당
와 정말 그대로 출력된다.
아까와 비슷한 방법으로 안될까??
간다!
미친놈이다 이거
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ힌트만 보자
?
흠 이번에는 나의 힘으로 해석해보겠다.
더 인풋 인 텍스트 박스 이스 프로펄리 이스케입드. 후
텍스트 박스 속 인풋값은 적절하게 나왔다.....이게 뭔
뭔지 모르겠다
그냥 일단 전단계와 달라진게 나라 선택하는 부분이니 이걸 이용해보자
Japan을 입력했을때 그대로 Japan이 출력된다.
흠
저 보기에 내 스크립트 태그를 넣고싶다.
html 코드에 도전해본다.
후 간다.
탭에서 선택해주고 했는데,, 안되네
이 방법은 맞는거 같은데,, 저 값을 어케 변경하징
라고 검색을 하니,, 무슨 jQuery??? 를 이용해서 바꾸는거밖에 안나오는데, 뭔소린지 모른당
하 도저히 모르겠어서 풀이를 보고 진행하겠다...
으아아ㅏ 크롬의 콘솔창을 이용한다.콘솔창으로 select 태그의 옵션 값을 변경할 수 있나보다
풀이에 나와있는 코드인
void(document.getElementsByTagName('option')[0].innerText='<script>alert(document.domain);</script>');
를 사용했다.
앞에 뭐 void 이런건 왜 붙는지는 모르겠는데,,
암튼 태그 이름(여기서는 option 태그)을 불러와서 그 중 첫번째꺼([0])의 안 내용을
<script>alert(document.domain);</script>
로 바꾸는 기능을 한다! 이렇게 치고 엔터 누르면
위처럼 옵션값이 바뀌게 되고, 검색창에 아무거나 친 후 검색버튼을 누르면?
후,,어렵다아
목표는 다 똑같다. 검색창에 나라 선택까지 있는게 전 단계와 똑같다. 혹시나 해본 똑같은 공격에 역시나 되지 않는다.
이제는 뭐 힌트를 보고 시작하자.
눈에 보이지 않는 input 공간이 있나보다.
이시키가 사람을 농락한다. 저 hidden type을 없애주자 모습을 드러냈다
안에 내용을 입력하고 엔터를 누르자
다시 되돌아갔다.아까처럼 콘솔로 할 수 있지 않을까
뭐 대충 요런 느낌?
엔터를 치자 모습을 드러냈고,,
어 근데 여기다가 입력해봤자 드러나는게 없는데?
다시 뚝딱뚝딱 만들어주자
이 상태에서 아까 사용했던 그 현재의 태그는 닫고 뭐시기를 사용하면 되지 않을까
오 뭐야
안되겠지 싶어서 했는데 됐다.
입력한 값은
"><script>alert(document.domain);</script>
였다.
하씨 안될까봐 스샷도 안찍었는데ㅡㅡ
그래도 성공은 기분 좋다 흐핳
후 마지막 라운드
나라 선택이 사라졌다. 그만큼 더 어려워졌단 뜻일것이다...
이번 라운드의 힌트는?
길이가 제한된 텍스트박스인가
input 태그에 최대 길이 속성이 추가되었다. 이를 넘으면 어떻게 되지?
15자를 넘겨서 검색해볼려고 a를 15번 치고 있는데,, 더이상 안쳐지는거였다 후힣
콘솔로 저 maxlength를 늘리고, 사용자가 입력한 값이 value에 들어갈테니 거기 안에서 input 태그를 닫아서 script 태그를 넣으면 되지 않겠나!? 오오 벌써 짱짱해커 된 기분
후 해보겠다
input태그들중 첫번째이니깐?
요로코롬?? 여유있게 100을 주고 해보자 후,,
엔터를 치면!?
길이 제한이 풀릴줄 알았는데 안풀려가지구,,
html 코드를 다시 보니
앞에 input 태그가 하나 더 있었다!
후 그럼 [1]로 줘보자
요로코롬??
하씨 왜 제한이 안풀리지?
왜냐고오ㅗㅇ오ㅗㅇ
아씨 홧김에 그냥 HTML 태그에서 maxlength 속성 지워버리고 텍스트박스에
"><script>alert(document.domain);</script>
입력했는데
허?
허어어어엉?????????
야씨,, 잘 들어갔네,, 잘 살아라
후 끝!
신난다잉~
댓글
이 글 공유하기
다른 글
-
웨페킹 팔주차 [Bandit OverTheWire All clear]
웨페킹 팔주차 [Bandit OverTheWire All clear]
2020.06.03 -
\x00웹\x00해\x00킹\x00스\x00터\x00디\x007\x00주\x00차\x00과\x00제
\x00웹\x00해\x00킹\x00스\x00터\x00디\x007\x00주\x00차\x00과\x00제
2020.05.29 -
웹해킹 5주차 과제 모음 뚜둥
웹해킹 5주차 과제 모음 뚜둥
2020.05.15 -
<2/2> 웹해킹 5주차 과제 뚜두두두두두두두두둥 [XSS]
<2/2> 웹해킹 5주차 과제 뚜두두두두두두두두둥 [XSS]
2020.05.15