본문으로 건너뛰기

SSRF with curl URL globbing

Security Web Ssrf Curl
thumbnail

SSRF 취약점이 발견된 곳에서 입력 값을 curl 명령어에 이용하고 있다면 한가지 시도해볼만한 기법이 있습니다.


curl URL globbing
#

curl에서는 URL globbing을 제공하고 있어 URL 상에서 리스트 또는 범위를 지정할 수 있는데요,

이를 이용해 WAF나 여러 방어 로직을 우회할 수 있습니다.

  • “{}”를 이용해서 리스트를 지정해줄 경우, 차례대로 요청하게됩니다.
    $ curl http://skitttles.me/flag\{1,3,5\} -v
    > GET /flag1 HTTP/1.1
    > Host: skitttles.me
    ...
    > GET /flag3 HTTP/1.1
    > Host: skitttles.me
    ...
    > GET /flag5 HTTP/1.1
    > Host: skitttles.me
    ...
    
  • “[]”를 이용해서 범위를 지정해줄 경우, 해당 범위 내 값을 적용하여 요청하게 됩니다.
    $ curl http://skitttles.me/flag\[1-3\] -v
    > GET /flag1 HTTP/1.1
    > Host: skitttles.me
    ...
    > GET /flag2 HTTP/1.1
    > Host: skitttles.me
    ...
    > GET /flag3 HTTP/1.1
    > Host: skitttles.me
    ...
    

Attack technique
#

URL 입력 란에서 사용자의 입력 값을 서버 측에서 필터링하는 경우, 아래와 같은 기법을 이용해 우회할 수 있습니다.

필터링 대상 문자열에 {} 또는 []를 사용하여 동일한 URL을 만들 수 있습니다.

  • ..{.}. 또는 .{.}
  • /secret/s{e}cret 등 문자에 중괄호({}) 처리
  • e.g.
    # http://skitttles.me/secret 에 접근 시도
    # http://skitttles.me/my/ 가 반드시 들어가야 함
    #  .. 문자열을 필터링
    # secert 문자열을 필터링
    
    http://skitttles.me/my/{.}./sec{r}et
    

Mitigation
#

curl 명령어에 -g, --globoff 옵션을 포함해야 합니다.

가능하다면 입력되야하는 URL을 화이트리스트로 관리합니다.

URL에서 사용되지 않는 문자를 필터링합니다.


✨ Payloads
#

http://skitttles.me/my/{.}./sec{r}et

References
#