SSRF
Server Side Request Forgery
웹 어플리케이션이 외부로 request를 보낼 대상을 설정할 때, 뿐만 아니라 외부로 request를 보낼 수 있는 함수를 사용할 때 인자에 user input이 들어간다면 발생할 수 있다.
PHP는 http:// Wrapper를 지원하기 때문에, ``php fopen()``, ``php include/require``, cURL등에 인자로 `` http://url`` 형태를 넘겨 외부 도메인에 있는 리소스를 가져올 수 있다.
- `` http://`` 이외에도 다양한 Wrapper를 사용할 수 있다.
- 위 함수들 뿐만 아니라, user input을 참고해 외부 request를 보내는 상황이면 어디든 발생할 수 있다.
외부 도메인 뿐만 아니라 방화벽 뒤에 위치한 internal network 같은, 클라이언트에서 직접 접근할 수 없는 리소스도 접근할 수 있다.
또한, 해당 서버의 loopback에서 돌아가고 있는 서비스에 접근이 가능하기 때문에, 이를 이용해 ①포트 스캐닝으로 동작 중인 서비스를 알아내고, ②이 서비스에 접근할 수 있다.
Note ) 그러나 반드시 `` http://``를 붙여주어야 한다. 묵시적으로 지정된 기본 스트림 래퍼는 `` file://``이다.
- 상위 디렉토리 우회 : `` ../``로 루트로 이동
( 이 때 웹서버 루트가 아니라 파일시스템 루트까지 가능하다. ) - 확장자 우회 : `` %00 / ? / #``
localhost services access
file system access
- `` dict://``
- `` gopher://``
- `` ldap://``
include → execute
input validation bypass #1
testing
URL black list
http://doesn'tmatter@www.pc-help.org/obscure.htm
`` @``앞에 오는 것은 무시된다. 원래는 `` id:pw@url``형식으로 사용하도록 되어 있으니까.
Note ) 근데 user-agent에 보면 이것도 같이 들어가있다.
IP를 이용한 방법
http://3468664375/obscure.htm - summed decimal
http://0316.0277.0236.067/obscure.htm - octal
http://0xCE.0xBF.0x9E.0x37/obscure.htm - hex
http://0xCeBF9e37/obscure.htm - hex
wildcard DNS ( xip.io )
input validation bypass #2
Open redirect
2017/09/21 - [Web/Hack] - Unsafe redirect
`` localhost`` 등을 넘기다 필터링 당하는 경우나 URL schema를 `` gopher://``등으로 변경해야 하는 경우, 데이터를 가공해야 하는 경우에는
Open redirect 취약점이 존재한다면 이를 이용해 일단 내 서버로 요청하게 한 다음 내 서버에서 요청을 적당히 처리해 반환하도록 구성할 수 있다.
DNS pinning ( + race condition )
PHP fsockopen() url parsing trick
Retrieving data check bypass
SSRF를 이용해 서버가 어떤 데이터를 수신했을 때, 그 데이터가 적절한 형태인지(e.g., 이미지인지, XML인지)를 체크한다면 형식을 맞춰주어야 한다.
보통 Forged request를 보내는 타겟이 내 서버가 되기 때문에 서버에서 형식을 맞춰서 보내주는 것은 별로 어렵지 않은데, 문제는 victim으로 보내야 하는 데이터가 php source같이 실행되어야 하는 경우에는 형식을 맞춰주면 그냥 데이터가 돼버려서 실행되지 않는다. 따라서 이를 우회할 방법이 필요하다.
HTTP/0.9
curl command concatenation
3.php
```xml
]]><....
```
mitigation
- whitelist 방식으로 필터링한다.
- ``php ctype_alpha()`` 말고도 ``php basename()``와 정규표현식을 활용할 수 있다.
- ``php fopen()`` 대신 ``php file()``을 사용하는 것을 고려해본다.
- 원격 리소스를 가져오는 기능이 필요하지 않다면 `` php.ini``에서 `` allow_url_fopen``과 `` allow_url_include``를 비활성화한다.
참고
'Security > WebHacking' 카테고리의 다른 글
[PHP] hack (0) | 2017.09.21 |
---|---|
Unsafe redirect (1) | 2017.09.21 |
XSS / CSRF (0) | 2017.09.19 |
SQL Filtering Substitution Pattern (0) | 2017.09.19 |
SQLMap (0) | 2017.09.05 |