Post

Unsafe redirect

Unsafe/Unvalidated/Open Redirect

  • 해당 도메인 이외의 phishing site 등 malicious site로 이동할 수 있다는 건데… 사실 이 자체로 취약점이라고 하긴 좀 그렇긴 함…
  • 하지만 OWASP에서 말하길 trusted site에서 이동하는거라 눈치채지 못하는 유저도 있다. 고 하네
  • 그리고 scheme을 http로 제한하지 않는 경우 location에 javascript:alert(1); 넣는 식으로 XSS가 가능하기도 하고.
1
2
?url=http://external.malisious.site

1
2
3
// PHP
header('Location: '.$\_GET['url']);

1
2
3
// java
response.sendRedirect(request.getParameter("url"));

1
2
3
// C# .NET
Response.Redirect(request.QueryString["url"]);

user input으로 넘어온 redirection target url도 필터링을 거치게 되는데, 이 때 보통 regex로 처리하기 때문에 실수가 나오기 쉽다. e.g., 다음과 같은 코드는 http://asdf$domain같이 적어도 통과할 수 있다.

1
2
3
4
$url = $\_GET['url'];
$domain = $\_SERVER['SERVER\_NAME'];
if (!preg\_match("/http:\/\/.\*?$domain\//", $url))  exit();

Redirect VS Forward VS SSRF

Redirect

Client 측 웹 브라우저에 HTTP 301 || 302를 보내 다른 URL로 이동하도록 명령한다. 웹 브라우저는 주소를 해당 URL로 변경하며 이동한다. 이 때 이동할 수 있는 페이지에 제한이 없기 때문에, external page로 이동할 수 있다. JSP : 새로운 페이지에서 request와 response 객체가 새롭게 생성된다.

Forward

web container 단위에서의 페이지 이동만 가능하다. 웹 브라우저가 다른 페이지로 이동했는지 아닌지를 알 수 없다. 따라서 웹 브라우저의 주소창에 표시되는 URL은 그대로다. JSP : 새로운 페이지로 Forward할 때 request와 response 객체를 전달한다.

SSRF ( 필터링 우회 )

2017/09/19 - [Web/Hack] - SSRF

http://my-server.com/run.php source

1
2
3
4
<?php
header("Location: http://127.0.0.1:[port]");
?>

  1. ?url=http://my-server.com/run.php를 SSRF 등으로 victim에서 include하도록 함.
  2. victim은 my-server로 run.php를 요청
  3. run.php는 my-server에서 실행되는게 아니라, victim에서 실행됨
  4. victim에서 실행한 run.php 결과 반환

따라서 victim의 loopback에서 돌아가는 비공개 서비스에도 접근할 수 있다. URL schema를 gopher://등으로 변경해야 하는 경우, 데이터를 가공해야 하는 경우 일단 내 서버로 요청하게 한 다음 내 서버에서 요청을 적당히 처리해 반환하도록 구성할 수 있다.

This post is licensed under CC BY 4.0 by the author.