CSRF는 Cross-site request forgery의 약자로 사이트 간 요청 위조 또는 크로스 사이트 요청 위조를 뜻한다.

XSS( 사이트 간 스크립팅) 을 이용한 공격이 사용자가 특정 웹사이트를 신용하는 점을 이용한 것이라면,

CSRF는 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노린 것이다.



1. 발생 원인

개별 링크와 폼이 사용자 별로 예측 가능한 토큰을 사용할 때

-> 예측 불가능한 토큰이 있으면 공격자는 요청 메시지를 변조할 수 없고, 예측 가능한 토큰이 있으면 요청 메시지를 변조할 수 있다.

- 인증이나 세션, 쿠키 등 모든 웹사이트에서 인증된 사용자가 보내는 데이터는 정상적인 경로를 통한 파라미터 요청으로 판단

-> 정상적인 요청과 비정상적인 요청을 구분하지 못한다.




2. 공격 과정



3. 공격 영향

1.사용자 계정 생성

2. 중요 데이터 액세스

3. 게시글 내용 변경

4. 관리자 권한 획득

5. 라우터 및 공유기 설정 변경

6. 계정 정보 변경

etc.



4. 공격 방법


공격자가 올린 게시글을 읽었을 때 피해자의 정보가 수정될 수 있도록 하거나 관리자의 권한을 얻도록 스크립트를 작성하는 것이 대표적인 예이다.




비밀번호를 바꾸는 페이지이다.

페이지 소스를 보면 다음과 같다.




html 소스는



새로운 php파일을 만들고 password_new 의 value가 admin이 되도록 바꿔준다. 


<form action="http://~~~~~~~~~~~~" method="GET">

New password:<br />

<input type="password" AUTOCOMPLETE="off" name="password_new" value='admin'><br />

Confirm new password:<br />

<input type="password" AUTOCOMPLETE="off" name="password_conf"><br />

<br />

<input type-"submit" value="change" name="Change">

</form>




아까의 패스워드 변경 페이지에 test값을 넣고 Change를 누르면 비밀번호가 변경된다.




5. 예방 방법

1. 단순히 Session Token만을 이용한 권한 부여를 금지한다.

2. REFERER가 정상적인지 확인한다.

3. XSS 취약점이 없는지 확인한다.

4. GET 방식과 POST방식을 구분해 준다.


'WEB > Web Hacking' 카테고리의 다른 글

Blind SQL Injection (이론편)  (0) 2017.05.14
파일 다운로드 취약점  (0) 2017.05.08
Drive-By-Download(DBD) 공격(이론편)  (0) 2017.04.24
파일업로드 취약점  (0) 2017.04.09
SQL injection  (0) 2017.03.25

이번에 소개할 기법은 "Drive-By-Download"입니다.

앞글자를 따서 "DBD 공격" 이라고 부르기도 합니다.


0.정의


Drive-By-Download를 네이버에서 찾아보면,

"웹이 갖고 있는 취약한 보안 상태를 활용해 악성코드를 심어놓은 방법이다" 라고 정의되어 있습니다.

하지만, 이 정의로는 무언가 부족합니다. 그 이유는 이름에 전반적인 행동이 나와있는데, 그것에 대해 설명이 되어 있지 않았기 때문입니다. 


이름에서 "Drive-by"(지나간다)" 와 "Download(다운로드 하다)"가 합쳐져있는 것을 볼 수 있습니다.


이것들을 모두 포함하면, "지나가면서 다운로드 하다"로 해석이 가능합니다.

이게무슨말인지?  이해가 가나요?  이해가 안되실 겁니다. 하지만 밑에 내용을 보게되면, 이해가 되실겁니다.


1.원리


그림을 통해 간단한 원리와 특징을 설명하겠습니다.



1.사용자가 취약점이 있는 웹사이트 또는  크래커가 만든 사이트를 들어가게 됩니다.

2. 취약점이 있는 웹사이트 또는 크래커가 만든 사이트에는 스크립트 코드 등을 이용하여 악성코드가 있는 웹으로 이동시킵니다.

이때 이 악성코드가 있는 웹이 있는곳을 안들키기 위해서, 여러가지 경유 사이트를 만들어 놓습니다.

3.악성코드가 있는 웹에서 자기도 모르게 다운로드를 받게 됩니다.



*주로 사용되어진 스크립트 코드

*페이지 자유 이동

<iframe>, <frame>, <javascript> 등을 사용하여 사용자 행위 없이 페이지 이동이 가능하도록 기존 웹페이지에 삽입


*악성코드 유포

<object>, <embed> 등의 태그를 이용하여 숨김 객체 삽입



2. 전파 방법


-과거


-현재


예전에는 전파 경로를 이메일을 주로 사용하였습니다.

하지만 이제 기술이 발전하여 요즘에는 웹사이트를 사용하여 대규모로 악성코드를 유포 시킬 수 있게 되었습니다.

이러한 방법을 통해 유행하고, 아직도 존재하는 대표적인 악성코드는 "랜섬웨어" 입니다.


3. 난독화


이 Drive-By-Download와 같이 사용되는 것은 "난독화" 입니다.

그 이유는 위의 원리를 보면, 페이지 이동 및 악성코드 유포에 대한 모든 것이 스크립트 코드를 통해 이루어지기 때문입니다.

그렇기 때문에 그 코드 등을 최대한 안보이게 또는 알기 어렵게 하기 위해 난독화를 진행합니다.

주로 hexadecimal obfuscation, Dean Edwards'Packer, jjencode, Gondad EK, CK VIP 등이 사용됩니다.



여기까지 Drive-By-Download 공격의 이론에 대해서만 설명하였습니다.

다음에는 Drive-By-Download공격의 실습에 대해서 올리도록 하겠습니다.


<Created by 서쿤>

'WEB > Web Hacking' 카테고리의 다른 글

파일 다운로드 취약점  (0) 2017.05.08
CSRF (Cross-site request forgery) 란  (0) 2017.04.28
파일업로드 취약점  (0) 2017.04.09
SQL injection  (0) 2017.03.25
자바스크립트(JavaScript) 난독화  (0) 2017.03.21

HTTP 란?



HTTP는 HyperText Transfer Protocol의 약자로, www(World Wide Web)에서 쓰이는 핵심 통신 프로토콜이다.


거의 모든 웹 애플리케이션에서 사용되고 있으며, 메시지 기반 모델로서 클라이언트가 요청 메시지(Request)를 보내면 서버에서 응답 메시지(Response)를 보내는 형태로 이루어져 있다.




즉, 사용자가 웹 페이지의 링크를 클릭했을 때 브라우저(클라이언트)는 HTTP의 형태로 메시지를 작성하여 웹 서버에 전송한다.


웹 서버에서는 받은 메시지에 대하여 HTTP의 응답 형태로 메시지를 작성 해 브라우저에 보내면, 브라우저는 이를 해석 해 화면에 보여주게 된다.



HTTP 구조


HTTP는 Header와 빈 공백, Body로 나누어 지며, Header에는 주소 정보 등이, Body에는 메시지 정보가 포함된다.


아래에서 HTTP Request와 HTTP Response에 대하여 자세하게 설명한다.


1. HTTP Request



위의 사진은 현재 블로그(4rgos.tistory.com)로 접속을 요청할 때의 HTTP Header이다.


한줄 씩 설명하면 다음과 같다.


GET / HTTP/1.1 - HTTP 전송 방법, 기본 페이지(/)와 프로토콜 버전. 일반적으로 웹서버로부터 자료를 가져오는 기능을 하는 GET 방식을 많이 사용한다. GET 방식의 경우, 별도의 메시지 Body를 사용하지 않는다. 따라서 Body 부분에는 공백이 존재한다.


Host : 4rgos.tistory.com - 요청한 서버의 Host.


Proxy-Connection: keep-alive - HTTP 1.1부터 지원하는 기능. 서버와 클라이언트가 서로 연결이 되어있는 상태에서 지정된 시간동안 서로 패킷의 교환이 없더라도 패킷 교환을 대기하는 구조이다. 즉, 지정된 시간 내에 패킷 교환이 이루어진다면 계속해서 연결된 상태를 유지한다. 이 경우, 웹 프록시 툴을 통해 Request 메시지를 전송 해 Proxy-Connection 이라고 표시되었지만, 브라우저가 웹서버에 직접 요청하는 경우 Connection이라고 표시된다.


Upgrade-Insecure-Requests : 1 - HTTPS : 1과 동일한 표현. HTTP 메시지 전송 시 보안을 적용한다.


User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) ~ - 사용자의 웹 브라우저 종류나 기타 클라이언트의 소프트웨어 정보를 보여준다. 위의 예시에선 클라이언트가 윈도우 10 64비트 환경에서 크롬 브라우저를 사용했다는 것을 알 수 있다.


Accept : text/html,application/xhtml+xml, ~ - 웹 서버로부터 수신되는 데이터 중 웹 브라우저가 처리할 수 있는 데이터 타입을 의미. text/html은 text, html 형태의 문서를 처리할 수 있다는 것이고, 끝 부분에 */*은 모든 문서를 처리할 수 있다는 의미이다.


Accept-Encoding : gzip, deflate, sdch - 전송할 수 있는 인코딩


Accept-Language : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4 - 전송할 수 있는 언어


Cookie : ~ - 클라이언트가 서버에게 추가 정보를 보낼 때 사용한다.


2. HTTP Response


다음은 위의 Request를 전송했을 때 웹 서버로부터 받은 HTTP Response의 모습이다.



HTTP/1.1 200 OK - 웹 프로토콜 버전 및 응답 코드 정보. 200 OK가 표시되면 요청이 성공적으로 이루어졌고 요청한 자료가 클라이언트에게 보내졌다는 것을 의미한다.


Date: Sun, 16 Apr 2017 07:43:13 GMT - Response를 전송 한 날짜 및 시간을 나타낸다.


Server : Apache - 웹 서버로 사용하고 있는 소프트웨어의 이름을 나타낸다.


X-UA-Compatible: IE-Edge - 호환성과 관련하여 사용중인 IE 브라우저의 최신 버전의 엔진을 사용해야 한다는 의미이다.


Expires: Thu, 19 Nov 1981 08:52:00 GMT - 예전에 응답한 내용이 만기 시 캐시에 저장되지 못하게 지시한다.


Cache-Control: ~ / Pragma: ~ - 두 Header 모드 브라우저로 하여금 요청 시 캐시된 문서를 사용하지 말고 매 번 서버로부터 새로운 문서를 다시 전송받아 사용하도록 하는 Header이다.


P3P: CP='ALL DSP COR MON LAW OUR LEG DEL' - 사용자들이 허용하는 정보만 웹 사이트가 수집할 수 있도록 하는 도구. 클라이언트에게 웹 사이트의 프라이버시 보호 정책을 전달한다. 세 개의 문자로 구성된 토큰을 사용한다. (참고 : https://www.w3.org/TR/P3P11/#compact_policies)


Access-Control-Allow-Origin: http://4rgos.tistory.com - 서버 리소스에 대한 접근을 제한하는 Header이다. 이 예시의 경우 리소스에 대한 접근을 http://4rgos.or.kr에게만 허용한다. 만약 * 일 경우에는 모든 도메인으로부터의 접근이 가능하다.


Set-Cookie: visited= ~ - 클라이언트에게 쿠키 정보를 알려준다. 이 경우, visited라는 쿠키가 생성 되었으며 이 값을 클라이언트에게 알려주기 위해 사용되었다.


Vary: Accept-Encoding - 응답에 영향을 줄 수 있는 헤더의 목록을 클라이언트에게 알려준다.


Content-Length: 117851 - Body의 길이를 나타낸다.


Content-Type: text/html; charset=utf-8 - body에 적혀있는 것이 어떤 종류의 문서인지를 나타낸다. 이 경우, Body에는 text/html 형태의 문서가 적혀있다.


공백 - Header와 Body를 구분짓는 공백이다.


<!DOCTYPE html> ~ - 서버가 클라이언트에게 전송하는 메시지의 본문(Body)이다.



Created by ccoma

'WEB > Web' 카테고리의 다른 글

페이지 이동 Loction.href  (0) 2017.11.20
base64  (0) 2017.11.06
자바스크립트 용어  (0) 2017.10.28
아스키 코드(ASCII)  (0) 2017.10.16
javascript indexOf 함수와 lastindexOf 함수  (0) 2017.09.25

+ Recent posts