SlideShare a Scribd company logo
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

PDF
フリーでやろうぜ!セキュリティチェック!
PDF
Twitterのsnowflakeについて
PDF
徳丸本ができるまで
PPTX
Nmapの真実(続)
PDF
SSRF workshop
PPTX
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
PDF
体系的に学ばないXSSの話
PDF
DVGA writeup
フリーでやろうぜ!セキュリティチェック!
Twitterのsnowflakeについて
徳丸本ができるまで
Nmapの真実(続)
SSRF workshop
ウェブ・セキュリティ基礎試験(徳丸基礎試験)の模擬試験問題
体系的に学ばないXSSの話
DVGA writeup

What's hot (20)

PPTX
CyberChefの使い方(HamaCTF2019 WriteUp編)
PPTX
フリーでできるWebセキュリティ(burp編)
PPTX
Guide to GraalVM (JJUG CCC 2019 Fall)
PPTX
ウェブセキュリティの常識
PDF
XSS再入門
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
PDF
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
PPTX
PenTesterが知っている危ないAWS環境の共通点
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
とある診断員とSQLインジェクション
PPTX
Cross Site Request Forgery (CSRF) Scripting Explained
PDF
Burp Suite 2.0触ってみた
PDF
Defending against Java Deserialization Vulnerabilities
PDF
ASP.NETの進化とASP.NET Core Blazorの凄さ
PDF
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
Proxy War
PDF
katagaitai CTF勉強会 #5 Crypto
PPTX
安全なWebアプリケーションの作り方2018
CyberChefの使い方(HamaCTF2019 WriteUp編)
フリーでできるWebセキュリティ(burp編)
Guide to GraalVM (JJUG CCC 2019 Fall)
ウェブセキュリティの常識
XSS再入門
SPAセキュリティ入門~PHP Conference Japan 2021
Amazon EKS上の開発体験を最大化するプレビュー環境の作り方
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
PenTesterが知っている危ないAWS環境の共通点
Spring Boot × Vue.jsでSPAを作る
とある診断員とSQLインジェクション
Cross Site Request Forgery (CSRF) Scripting Explained
Burp Suite 2.0触ってみた
Defending against Java Deserialization Vulnerabilities
ASP.NETの進化とASP.NET Core Blazorの凄さ
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
今日からできる!簡単 .NET 高速化 Tips
Proxy War
katagaitai CTF勉強会 #5 Crypto
安全なWebアプリケーションの作り方2018
Ad

Similar to SSRF基礎 (16)

PDF
クロスサイトリクエストフォージェリ(CSRF)とその対策
PPTX
Aws security ssrf
PPTX
Aws security ssrf_update
PPTX
XXE、SSRF、安全でないデシリアライゼーション入門
PDF
Web担当者が知っておくべきPHPとセキュリティ
PPTX
20161114 よくわかるcsrf
PDF
Azureの上におとりを置いて、世界中から攻撃される様子を観察した話
PPT
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
PPTX
Pythonを使った簡易診断スクリプトの作り方
PDF
WPSCanによるWordPressの脆弱性スキャン
PPTX
安全なPHPアプリケーションの作り方2014
PPTX
クラック・サイト改ざんが発覚!被害の実例・事後対処は?
PDF
Railsやるやる_セキュリティ小話
PDF
Cross-Origin Resource Sharing
PDF
CSRF脆弱性について
PDF
TAM 新人ディレクター システムスキルアップ プログラム第1回「サーバ概要」
クロスサイトリクエストフォージェリ(CSRF)とその対策
Aws security ssrf
Aws security ssrf_update
XXE、SSRF、安全でないデシリアライゼーション入門
Web担当者が知っておくべきPHPとセキュリティ
20161114 よくわかるcsrf
Azureの上におとりを置いて、世界中から攻撃される様子を観察した話
20090218 第5回「PhpによるWebアプリケーションのセキュリティ入門」
Pythonを使った簡易診断スクリプトの作り方
WPSCanによるWordPressの脆弱性スキャン
安全なPHPアプリケーションの作り方2014
クラック・サイト改ざんが発覚!被害の実例・事後対処は?
Railsやるやる_セキュリティ小話
Cross-Origin Resource Sharing
CSRF脆弱性について
TAM 新人ディレクター システムスキルアップ プログラム第1回「サーバ概要」
Ad

SSRF基礎