Click jacking
Click jacking이란 사용자가 사이트의 콘텐츠를 클릭(Click)할 때,
악성 사이트의 콘텐츠를 클릭하도록 하는 인터페이스 기반의 공격이다.
jacking이 어떤 것을 도둑질하다, 훔치다 그런 느낌인데 예를 들면 세션 하이재킹과 같이
중간에서 어떤 것을 탈취하거나 의도하지 않게 동작하도록 만드는 것이다.
Click jacking은 iframe 내 버튼이나 링크가 포함된 웹 사이트의 기능에 따라 공격이 달라진다.
Click jacking vs CSRF
CSRF 공격의 경우에는 사용자의 input 없이 전체의 요청을 위조하는 특징을 가지고 있지만,
Click jacking 공격의 경우에는 사용자의 input이 있어야 공격이 가능하다.
<iframe src="target_site"></iframe>
주로 iframe을 통해 PoC 코드를 구성하게 되는데,
iframe의 스타일을 조작하여 자신이 원하는 위치에 마우스 포인팅을 하는 등의 행위를 하게 된다.
Click jacking 대응방안
1. X-Frame-Options
X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/
X-Frame-Options는 HTTP Response Header로 iframe, frame 등의 태그를 이용한
렌더링에 대한 헤더 정책인데, 해당 정책의 옵션을 설정하여 의도하지 않은 frame을 방어할 수 있다.
- deny : 어떠한 사이트에서도 frame 상 보여질 수 없다.
- sameorigin : 동일한 사이트의 frame 에서만 보여진다.
- allow-from : 특정 uri의 frame 에서만 보여진다.
2. User Interaction
사용자와의 상호작용 측면에서 발생하는 공격이기 때문에 위의 사진과 같이
Captcha와 같은 보안성이 강조되는 User Interaction 적용을 통해 방어할 수 있다.
3. CSP
Content-Security-Policy: frame-ancestors 'self';
Content-Security-Policy: frame-ancestors normal-website.com;
CSP(Content-Security-Policy) 헤더를 통해서 방어할 수 있다.
frame을 허용할 범위를 지정해 무분별한 frame을 차단할 수 있게 된다.
Open Redirect
Open Redirect는 서버가 사용자로부터 입력되는 값을 외부 사이트 주소로 사용해 자동으로 연결하도록 할 때,
피싱 공격 등에 노출되는 취약점으로 이어질 수 있는 공격이다.
위의 사진과 같이 신뢰하는 사이트에서 발생하는 Open Redirect 공격을 통해 취약하거나 악성 사이트로
리다이렉션하여 사용자의 정보를 탈취하거나 공격을 수행하는 등의 공격을 진행한다.
Open Redirect 공격 방식
1. 공격자가 URL 주소를 변조하여 배포한다.
2. 다른 사용자가 사이트를 접속한다.
3. 사용자는 변조된 피싱 사이트 혹은 악성 다운로드 페이지로 자동 연결된다.
해당 공격의 안전하지 않은 코드를 확인하여 방식을 이해해보자.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String query = request.getQueryString();
if(query.contains("url")) {
String url = request.getParameter("url");
response.sendRedirect(url);
}
}
사용자가 파라미터로 전달한 URL로 바로 리다이렉트가 되고 있는 모습이다.
예를 들어, 공격자가 < www.example.com/?url=피싱사이트주소 > 와 같이 보내게 된다면,
사용자는 해당 피싱사이트 주소로 아무런 검증없이 바로 리다이렉트가 되어 이동하게 될 것이다.
Open Redirect 대응 방안
1. 자동으로 연결할 외부 사이트의 URL과 도메인은 화이트 리스트로 관리한다. (허용된 주소)
2. 사용자의 입력 값을 자동 연결할 사이트 주소로 사용하는 경우에는 입력된 값이 허용된 주소인지 검증한다.
화이트 리스트로 관리하면서 검증하는 코드의 예시는 다음과 같다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String allowURL[] = {"http://url1.com", "http://url2.com", "http://url3.com"};
String url = Request.getParameter("url");
int n = Integer.parseInt(url);
try{
if (n >= 0 && n < 3) {
response.sendRedirect(allowURL[n]);
}
}catch (NumberFormatException nfe){
// 에러 출력
}
}
앞선 안전하지 않은 코드와 다르게 허용할 주소를 미리 만들어놓고 화이트 리스트처럼 사용하거나,
try-catch 및 조건문을 통해 검증하여 Open Redirect를 방어할 수 있다.
앞선 두 공격은 Reflected XSS 와 같은 공격을 수행할 때 함께 사용될 수 있다.
이를 검증할 수 있는 코드를 작성하거나 정책을 설정하여 방어할 수 있도록 해야할 것이다.
참고
1) https://www.hahwul.com/cullinan/click-jacking/
2) https://hackingis.art/9
'보안 > Web' 카테고리의 다른 글
[Web] CSP (Content Security Policy) (0) | 2024.04.25 |
---|---|
[Web] XSS 그리고 공격 구문 (0) | 2024.04.24 |