Unsafe redirect
Unsafe/Unvalidated/Open Redirect
- 해당 도메인 이외의 phishing site 등 malicious site로 이동할 수 있다는 건데… 사실 이 자체로 취약점이라고 하긴 좀 그렇긴 함…
- 하지만 OWASP에서 말하길 trusted site에서 이동하는거라 눈치채지 못하는 유저도 있다. 고 하네
- 그리고 scheme을 http로 제한하지 않는 경우 location에
javascript:alert(1);
넣는 식으로 XSS가 가능하기도 하고.
1
?url=http://external.malisious.site
1
2
// PHP
header('Location: '.$\_GET['url']);
1
2
// java
response.sendRedirect(request.getParameter("url"));
1
2
// C# .NET
Response.Redirect(request.QueryString["url"]);
user input으로 넘어온 redirection target url도 필터링을 거치게 되는데, 이 때 보통 regex로 처리하기 때문에 실수가 나오기 쉽다. e.g., 다음과 같은 코드는 http://asdf$domain
같이 적어도 통과할 수 있다.
1
2
3
$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
<?php
header("Location: http://127.0.0.1:[port]");
?>
?url=http://my-server.com/run.php
를 SSRF 등으로 victim에서include
하도록 함.- victim은 my-server로
run.php
를 요청 run.php
는 my-server에서 실행되는게 아니라, victim에서 실행됨- victim에서 실행한
run.php
결과 반환
따라서 victim의 loopback에서 돌아가는 비공개 서비스에도 접근할 수 있다. URL schema를 gopher://
등으로 변경해야 하는 경우, 데이터를 가공해야 하는 경우 일단 내 서버로 요청하게 한 다음 내 서버에서 요청을 적당히 처리해 반환하도록 구성할 수 있다.
This post is licensed under CC BY 4.0 by the author.