SlideShare a Scribd company logo
1 of 26
Download to read offline
SSRF 基礎
2020/11/4 (社内公開)
2021/5/24 (外部公開)
iwama
目次
● はじめに
● SSRFとは
● SSRFの脅威
● SSRFの対策
● ハンズオン (CTF)
2
はじめに
この資料で取り扱うのはSSRFの基礎です。
業務的観点、AWS以外のクラウド、WAFバイパスには触れませ
ん。
ハンズオンにはDocker+Burp(or Fiddler)が必要です。
是非TRYしてみてね!
3
SSRFとは
Server-Side-Request-Forgery(SSRF)とは、
標的サーバから、攻撃者の指定した宛先にリクエスト
を送信させることを可能にする脆弱性。
4
OWASP Night SSRF基礎より
https://speakerdeck.com/hasegawayosuke/ssrfji-chu?slide=6 5
OWASP Night SSRF基礎より
https://speakerdeck.com/hasegawayosuke/ssrfji-chu?slide=7 6
SSRFの脅威
● 本来外部からアクセスできない内部ネットワークに
対するアクセス
● 内部ネットワークに存在するサーバやクライアント
への攻撃
● (環境がクラウドにある場合)クラウドインスタンス
への不正ログイン
7
クラウドメタデータが特に狙われる
8
OWASP Night SSRF基礎より
https://speakerdeck.com/hasegawayosuke/ssrfji-chu?slide=7
SSRFの攻撃事例(多数あり)
Capital One 個人情報漏えい
- https://piyolog.hatenadiary.jp/entry/2019/08/06/062154
WYSIWYG型エディタのビデオ挿入でSSRF
- https://hackerone.com/reports/643622
oEmbedの機能からSSRF
- https://hackerone.com/reports/793704
shopify SSRFからインスタンスのルート取得
- https://hackerone.com/reports/341876
米国国防総省 ポートスキャニング
- https://hackerone.com/reports/326040
shopify 細工したSVGで内部サーバに保存されている画像ファイルをリーク
- https://hackerone.com/reports/223203
9
SSRFに発展する主な脆弱性
● LFI,RFI
○ 外部ファイルをインクルード出来る場合、SSRFの脆弱性がある。
● パストラバーサル
○ ファイルパスだけでなくURLもパース出来る場合、SSRFに発展する。
● XXE
○ 外部実体参照を利用してSSRFに発展する。
10
コラム: RFIとSSRFの違い
● RFIは外部ファイルをプログラムコードとしてインクルー
ドできてしまう。
● RFIはSSRFの脆弱性を悪用した結果だが、SSRFがRFIになる
わけではない。
● SSRFはサーバにリクエストを送信させることが可能だが、
リクエストによってコード実行させるという意味ではな
い。
11
脆弱なコード例(PHP)
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET[“url”]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);
curl_close($ch);
$doc = new DOMDocument();
$doc->loadHTML($res);
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $anchor) {
echo "[-] ".$anchor->nodeValue, PHP_EOL;
}
?>
12
脆弱なコード例(PHP)
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET[“url”]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);
curl_close($ch);
$doc = new DOMDocument();
$doc->loadHTML($res);
$anchors = $doc->getElementsByTagName('a');
foreach($anchors as $anchor) {
echo "[-] ".$anchor->nodeValue, PHP_EOL;
}
?>
13
URLを外部から受け取っている。
url=http://127.0.0.1を送信する
とサーバ自身にリクエストを送
る。
※ 後続のloadHTML関数により
HTMLコンテンツを返さない場合は
エラーになる
脆弱なコード例(Python)
14
import urllib3
from lxml import etree
from flask import Flask, request
# 省略
@app.route("/", methods=["GET"])
def index():
url = request.args.get("url", type=str) or None
if url:
http = urllib3.PoolManager()
res = http.request('GET', url)
root = etree.HTML(res.data)
anchors = root.findall(".//a")
for anchor in anchors:
print("[-] %s" % anchor.text)
脆弱なコード例(Python)
15
import urllib3
from lxml import etree
from flask import Flask, request
# 省略
@app.route("/", methods=["GET"])
def index():
url = request.args.get("url", type=str) or None
if url:
http = urllib3.PoolManager()
res = http.request('GET', url)
root = etree.HTML(res.data)
anchors = root.findall(".//a")
for anchor in anchors:
print("[-] %s" % anchor.text)
PHPと同じ
SSRFの間違った対策
<?php
function validate_url($url) {
$parse_url = parse_url($url);
if ($parse_url["host"] !== '169.254.169.254') {
print("pass");
return $url;
} else {
print("block");
}
}
$url = validate_url($_GET["url"]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
#...
16
内部IPアドレスをブロックリス
トに指定する
SSRFの間違った対策
<?php
function validate_url($url) {
$parse_url = parse_url($url);
if ($parse_url["host"] !== '169.254.169.254') {
print("pass");
return $url;
} else {
print("block");
}
}
$url = validate_url($_GET["url"]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
#...
17
簡単に回避される
# validate_url("http://169.254.169.254");
# block
# validate_url("http://2852039166");
# pass
SSRFの間違った対策
<?php
function validate_url($url) {
$parse_url = parse_url($url);
if ($parse_url["host"] !== '169.254.169.254') {
print("pass");
return $url;
} else {
print("block");
}
}
$url = validate_url($_GET["url"]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
#...
18
ワイルドカードDNSサービス
nip.io など
#
validate_url("http://magic-169-254-169-254.
nip.io");
# pass
SSRFの間違った対策
<?php
function validate_url($url) {
$parse_url = parse_url($url);
if ($parse_url["host"] !== '169.254.169.254') {
print("pass");
return $url;
} else {
print("block");
}
}
$url = validate_url($_GET["url"]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
#...
19
リダイレクトさせる
※ リダイレクト追従する場合のみ
# validate_url("https://evil.example.com");
# pass
HTTP/2 302
…
location: http://169.254.169.254
他にもDNS Rebindingなどがある
SSRFの対策
● (SSRFに限った話じゃないけど・・・)SSRFに発展する脆
弱性はちゃんと対策する
○ XXE, パストラ―バサル, LFI, RFIなど
● 外部からURLを受け取らない
○ URLに対応するIDの組み合わせをサーバ側にて保持し、パラメー
タに渡される値はIDのみを受け付けるようにする
20
任意のURLを受け取る場合
根本的な対策は難しい。以下の方法が緩和策
● (ネットワークレベルで)ネットワーク保護
○ 内部ネットワークやホストは参照できないようにする
● AWSならIMDSv2を利用する
○ https://dev.classmethod.jp/articles/ec2-imdsv2-release/
○ 任意のHTTPヘッダーやリクエストメソッドが送れる状況では根本的
対策にはならない。
■ gopher プロトコル使ったバイパス
■ https://speakerdeck.com/hasegawayosuke/ssrfji-chu?slide=
18
21
SSRFの対策はなぜ難しい?
● URLのパースは難しい。
○ 過去にバイパスできるケースが報告されている。
○ A New Era of SSRF - Exploiting URL Parser in Trending
Programming Languages!
○ https://gist.github.com/mala/f86a849d15b2d60d7119e05f33b4
b885
22
もっとSSRFを知る
● AWS以外のクラウドメタデータの取得方法を知る
● blind SSRFの手法を知る
● フィルターバイパスの手法を知る
● URLやファイルパスなどのパス構造やパス解析処理
(パーサー)を知る
23
参考リンク
● payload チートシート
○ https://github.com/swisskyrepo/PayloadsAllTheThings/
tree/master/Server%20Side%20Request%20Forgery
● Cloud metadata URL リスト
○ https://gist.github.com/mrtc0/60ca6ba0fdfb4be0ba499c
65932ab42e
24
ハンズオン環境を用意しました
https://github.com/wild0ni0n/ssrf-practice
25
必要環境
● Docker
● docker-compose
動かし方
$ git clone https://github.com/wild0ni0n/ssrf-practice.git
$ cd ssrf-practice
$ docker-compose up -d
ハンズオン F&Q
Q なにするの?
A Aboutを見てください。FLAGを5つ探してください。
Q FLAGが分からない・・・。
A Hintを用意してます
Q クラウドメタデータを窃取してもいいの?
A コンテナ内に同じ構成を作ってるだけだから問題ないです!
26

More Related Content

What's hot

そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
 

What's hot (20)

Burpsuite 101
Burpsuite 101Burpsuite 101
Burpsuite 101
 
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
 
Containers and workload security an overview
Containers and workload security an overview Containers and workload security an overview
Containers and workload security an overview
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
 
Burp Suite 2.0触ってみた
Burp Suite 2.0触ってみたBurp Suite 2.0触ってみた
Burp Suite 2.0触ってみた
 
フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編
 
Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】Apiドキュメンテーションツールを使いこなす【api blueprint編】
Apiドキュメンテーションツールを使いこなす【api blueprint編】
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
GKE で始める Private Cluster
GKE で始めるPrivate ClusterGKE で始めるPrivate Cluster
GKE で始める Private Cluster
 
Kubernetes超入門 with java
Kubernetes超入門 with javaKubernetes超入門 with java
Kubernetes超入門 with java
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
 
kube-system落としてみました
kube-system落としてみましたkube-system落としてみました
kube-system落としてみました
 
RESTfulとは
RESTfulとはRESTfulとは
RESTfulとは
 
MongoDBの脆弱性診断 - smarttechgeeks
MongoDBの脆弱性診断 - smarttechgeeksMongoDBの脆弱性診断 - smarttechgeeks
MongoDBの脆弱性診断 - smarttechgeeks
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
Circuit Breaker.pptx
Circuit Breaker.pptxCircuit Breaker.pptx
Circuit Breaker.pptx
 

Similar to SSRF基礎

20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
Hiromu Shioya
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
Akihiro Kuwano
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
hiboma
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
kjwtnb
 

Similar to SSRF基礎 (20)

20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築
 
WordPressと外部APIとの連携
WordPressと外部APIとの連携WordPressと外部APIとの連携
WordPressと外部APIとの連携
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Survey and Analysis of ICS Vulnerabilities (Japanese)
Survey and Analysis of ICS Vulnerabilities (Japanese)Survey and Analysis of ICS Vulnerabilities (Japanese)
Survey and Analysis of ICS Vulnerabilities (Japanese)
 
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
 
RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~RでつくるWebアプリ~rApache編~
RでつくるWebアプリ~rApache編~
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
Spiderストレージエンジンのご紹介
Spiderストレージエンジンのご紹介Spiderストレージエンジンのご紹介
Spiderストレージエンジンのご紹介
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
 
PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合PaaSの作り方 Sqaleの場合
PaaSの作り方 Sqaleの場合
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせphpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ
 
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
 
test
testtest
test
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム
はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲームはじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム
はじめてのモバイルウェブアプリ 3 SPARQLハンズオン オープンデータ水位ゲーム
 

Recently uploaded

Recently uploaded (11)

論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

SSRF基礎