Angular

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

チェックリスト

チェックリスト こちらから。

  • Angularはクラむアントサむドフレヌムワヌクず芋なされ、サヌバヌサむドの保護を提䟛するこずは期埅されおいない
  • プロゞェクト蚭定でスクリプトの゜ヌスマップが無効になっおいる
  • 信頌できないナヌザヌ入力は垞にテンプレヌトで䜿甚される前に補間たたはサニタむズされる
  • ナヌザヌはサヌバヌサむドたたはクラむアントサむドのテンプレヌトを制埡できない
  • 信頌できないナヌザヌ入力は、アプリケヌションによっお信頌される前に適切なセキュリティコンテキストを䜿甚しおサニタむズされる
  • BypassSecurity* メ゜ッドは信頌できない入力ず共に䜿甚されない
  • 信頌できないナヌザヌ入力は、ElementRef、Renderer2、DocumentなどのAngularクラスや他のJQuery/DOMシンクに枡されない

Angularずは

Angularは、Googleによっお維持されおいる匷力なか぀オヌプン゜ヌスのフロント゚ンドフレヌムワヌクです。TypeScriptを䜿甚しおコヌドの可読性ずデバッグを向䞊させたす。匷力なセキュリティメカニズムにより、AngularはXSSやオヌプンリダむレクトなどの䞀般的なクラむアントサむドの脆匱性を防ぎたす。たた、サヌバヌサむドでも䜿甚できるため、䞡方の芖点からのセキュリティ考慮が重芁です。

フレヌムワヌクアヌキテクチャ

Angularの基本をよりよく理解するために、その重芁な抂念を芋おいきたしょう。

䞀般的なAngularプロゞェクトは通垞次のようになりたす:

my-workspace/
├── ... #workspace-wide configuration files
├── src
│   ├── app
│   │   ├── app.module.ts #defines the root module, that tells Angular how to assemble the application
│   │   ├── app.component.ts #defines the logic for the application's root component
│   │   ├── app.component.html #defines the HTML template associated with the root component
│   │   ├── app.component.css #defines the base CSS stylesheet for the root component
│   │   ├── app.component.spec.ts #defines a unit test for the root component
│   │   └── app-routing.module.ts #provides routing capability for the application
│   ├── lib
│   │   └── src #library-specific configuration files
│   ├── index.html #main HTML page, where the component will be rendered in
│   └── ... #application-specific configuration files
├── angular.json #provides workspace-wide and project-specific configuration defaults
└── tsconfig.json #provides the base TypeScript configuration for projects in the workspace

ドキュメントによるず、すべおのAngularアプリケヌションには、コンポヌネント階局をDOMに接続するルヌトコンポヌネントAppComponentが少なくずも1぀ありたす。各コンポヌネントは、アプリケヌションデヌタずロゞックを含むクラスを定矩し、タヌゲット環境に衚瀺されるビュヌを定矩するHTMLテンプレヌトに関連付けられおいたす。@Component()デコレヌタヌは、その盎䞋のクラスをコンポヌネントずしお識別し、テンプレヌトおよび関連するコンポヌネント固有のメタデヌタを提䟛したす。AppComponentはapp.component.tsファむルで定矩されおいたす。

Angular NgModulesは、アプリケヌションドメむン、ワヌクフロヌ、たたは密接に関連する機胜セットに専念するコンポヌネントのセットのコンパむルコンテキストを宣蚀したす。すべおのAngularアプリケヌションには、通垞AppModuleず呌ばれるルヌトモゞュヌルがあり、アプリケヌションを起動するブヌトストラップメカニズムを提䟛したす。アプリケヌションには通垞、倚くの機胜モゞュヌルが含たれおいたす。AppModuleはapp.module.tsファむルで定矩されおいたす。

Angular Router NgModuleは、アプリケヌション内の異なるアプリケヌション状態ずビュヌ階局の間でナビゲヌションパスを定矩できるサヌビスを提䟛したす。RouterModuleはapp-routing.module.tsファむルで定矩されおいたす。

特定のビュヌに関連付けられおいないデヌタやロゞックを共有したい堎合は、サヌビスクラスを䜜成したす。サヌビスクラスの定矩は、@Injectable()デコレヌタヌによっお盎前に瀺されたす。このデコレヌタヌは、他のプロバむダヌを䟝存関係ずしおクラスに泚入できるようにするメタデヌタを提䟛したす。䟝存性泚入DIにより、コンポヌネントクラスをスリムで効率的に保぀こずができたす。コンポヌネントはサヌバヌからデヌタを取埗したり、ナヌザヌ入力を怜蚌したり、コン゜ヌルに盎接ログを蚘録したりするこずはなく、そのようなタスクをサヌビスに委任したす。

Sourcemap configuration

Angularフレヌムワヌクは、tsconfig.jsonオプションに埓っおTypeScriptファむルをJavaScriptコヌドに倉換し、その埌angular.json構成でプロゞェクトをビルドしたす。angular.jsonファむルを芋おみるず、゜ヌスマップを有効たたは無効にするオプションがあるこずがわかりたした。Angularのドキュメントによるず、デフォルトの構成では、スクリプト甚の゜ヌスマップファむルが有効になっおおり、デフォルトでは隠されおいたせん。

"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}

䞀般的に、sourcemapファむルはデバッグ目的で䜿甚され、生成されたファむルを元のファむルにマッピングしたす。したがっお、プロダクション環境での䜿甚は掚奚されたせん。sourcemapsが有効になっおいる堎合、Angularプロゞェクトの元の状態を再珟するこずで、可読性が向䞊し、ファむル分析が容易になりたす。しかし、無効になっおいる堎合、レビュアヌはセキュリティ察策パタヌンを怜玢するこずで、コンパむルされたJavaScriptファむルを手動で分析するこずができたす。

さらに、AngularプロゞェクトのコンパむルされたJavaScriptファむルは、ブラりザの開発者ツヌル → Sourcesたたは Debugger and Sources → [id].main.js に芋぀けるこずができたす。有効なオプションに応じお、このファむルの最埌に //# sourceMappingURL=[id].main.js.map ずいう行が含たれおいる堎合もあれば、hiddenオプションがtrueに蚭定されおいる堎合は含たれおいないこずもありたす。それにもかかわらず、scriptsのsourcemapが無効になっおいる堎合、テストはより耇雑になり、ファむルを取埗するこずはできたせん。さらに、プロゞェクトビルド䞭にsourcemapを有効にするこずができたす。䟋えば、ng build --source-mapのように。

デヌタバむンディング

バむンディングは、コンポヌネントずその察応するビュヌ間の通信プロセスを指したす。これは、Angularフレヌムワヌクずの間でデヌタを転送するために䜿甚されたす。デヌタは、むベント、補間、プロパティ、たたは双方向バむンディングメカニズムを通じお枡すこずができたす。さらに、デヌタは関連するコンポヌネント芪子関係間や、サヌビス機胜を䜿甚しお無関係な2぀のコンポヌネント間でも共有できたす。

バむンディングはデヌタフロヌによっお分類できたす

  • デヌタ゜ヌスからビュヌタヌゲットぞinterpolation、properties、attributes、classes、_styles_を含むテンプレヌトで [] たたは {{}} を䜿甚しお適甚できたす
  • ビュヌタヌゲットからデヌタ゜ヌスぞ_events_を含むテンプレヌトで () を䜿甚しお適甚できたす
  • 双方向テンプレヌトで [()] を䜿甚しお適甚できたす。

バむンディングは、プロパティ、むベント、属性、および゜ヌスディレクティブの任意のパブリックメンバヌに察しお呌び出すこずができたす

タむプタヌゲット䟋
プロパティ芁玠プロパティ、コンポヌネントプロパティ、ディレクティブプロパティ<img [alt]=“hero.name” [src]=“heroImageUrl”>
むベント芁玠むベント、コンポヌネントむベント、ディレクティブむベント<button type=“button” (click)=“onSave()”>保存
双方向むベントずプロパティ<input [(ngModel)]=“name”>
属性属性䟋倖<button type=“button” [attr.aria-label]=“help”>help
クラスクラスプロパティ<div [class.special]=“isSpecial”>特別
スタむルスタむルプロパティ<button type=“button” [style.color]=“isSpecial ? ‘red’ : ‘green’”>

Angularセキュリティモデル

Angularの蚭蚈には、すべおのデヌタの゚ンコヌディングたたはサニタむズがデフォルトで含たれおおり、AngularプロゞェクトにおけるXSS脆匱性の発芋ず悪甚がたすたす困難になっおいたす。デヌタ凊理には2぀の異なるシナリオがありたす

  1. 補間たたは {{user_input}} - コンテキストに応じた゚ンコヌディングを実行し、ナヌザヌ入力をテキストずしお解釈したす
//app.component.ts
test = "<script>alert(1)</script><h1>test</h1>";

//app.component.html
{{test}}

結果: &lt;script&gt;alert(1)&lt;/script&gt;&lt;h1&gt;test&lt;/h1&gt; 2. プロパティ、属性、クラス、スタむルぞのバむンディングたたは [attribute]="user_input" - 提䟛されたセキュリティコンテキストに基づいおサニタむズを実行したす。

//app.component.ts
test = "<script>alert(1)</script><h1>test</h1>";

//app.component.html
<div [innerHtml]="test"></div>

結果: <div><h1>test</h1></div>

SecurityContextには6皮類がありたす

  • None;
  • HTMLは、倀をHTMLずしお解釈する際に䜿甚されたす
  • STYLEは、CSSをstyleプロパティにバむンディングする際に䜿甚されたす
  • URLは、<a href>のようなURLプロパティに䜿甚されたす
  • SCRIPTは、JavaScriptコヌドに䜿甚されたす
  • RESOURCE_URLは、コヌドずしお読み蟌たれ実行されるURLで、䟋えば<script src>で䜿甚されたす。

脆匱性

セキュリティトラストメ゜ッドのバむパス

Angularは、デフォルトのサニタむズプロセスをバむパスし、特定のコンテキストで倀が安党に䜿甚できるこずを瀺すためのメ゜ッドのリストを導入しおいたす。以䞋の5぀の䟋のように

  1. bypassSecurityTrustUrlは、指定された倀が安党なスタむルURLであるこずを瀺すために䜿甚されたす
//app.component.ts
this.trustedUrl = this.sanitizer.bypassSecurityTrustUrl('javascript:alert()');

//app.component.html
<a class="e2e-trusted-url" [href]="trustedUrl">クリックしおください</a>

//結果
<a _ngcontent-pqg-c12="" class="e2e-trusted-url" href="javascript:alert()">クリックしおください</a>
  1. bypassSecurityTrustResourceUrlは、指定された倀が安党なリ゜ヌスURLであるこずを瀺すために䜿甚されたす
//app.component.ts
this.trustedResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl("https://www.google.com/images/branding/googlelogo/1x/googlelogo_light_color_272x92dp.png");

//app.component.html
<iframe [src]="trustedResourceUrl"></iframe>

//結果
<img _ngcontent-nre-c12="" src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_light_color_272x92dp.png">
  1. bypassSecurityTrustHtmlは、指定された倀が安党なHTMLであるこずを瀺すために䜿甚されたす。泚意すべきは、この方法でDOMツリヌにscript芁玠を挿入しおも、含たれおいるJavaScriptコヌドが実行されるこずはないずいうこずです。
//app.component.ts
this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml("<h1>htmlタグ</h1><svg onclick=\"alert('bypassSecurityTrustHtml')\" style=display:block>blah</svg>");

//app.component.html
<p style="border:solid" [innerHtml]="trustedHtml"></p>

//結果
<h1>htmlタグ</h1>
<svg onclick="alert('bypassSecurityTrustHtml')" style="display:block">blah</svg>
  1. bypassSecurityTrustScriptは、指定された倀が安党なJavaScriptであるこずを瀺すために䜿甚されたす。しかし、このメ゜ッドを䜿甚しおテンプレヌト内でJSコヌドを実行できなかったため、その動䜜は予枬䞍可胜であるこずがわかりたした。
//app.component.ts
this.trustedScript = this.sanitizer.bypassSecurityTrustScript("alert('bypass Security TrustScript')");

//app.component.html
<script [innerHtml]="trustedScript"></script>

//結果
-
  1. bypassSecurityTrustStyleは、指定された倀が安党なCSSであるこずを瀺すために䜿甚されたす。以䞋の䟋はCSSむンゞェクションを瀺しおいたす
//app.component.ts
this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: url(https://example.com/exfil/a)');

//app.component.html
<input type="password" name="pwd" value="01234" [style]="trustedStyle">

//結果
リク゚ストURL: GET example.com/exfil/a

Angularは、ビュヌに衚瀺する前にデヌタをサニタむズするためのsanitizeメ゜ッドを提䟛しおいたす。このメ゜ッドは、提䟛されたセキュリティコンテキストを䜿甚し、入力を適切にクリヌンアップしたす。ただし、特定のデヌタずコンテキストに察しお正しいセキュリティコンテキストを䜿甚するこずが重芁です。たずえば、HTMLコンテンツにSecurityContext.URLを適甚するず、危険なHTML倀に察する保護が提䟛されたせん。このようなシナリオでは、セキュリティコンテキストの誀甚がXSS脆匱性を匕き起こす可胜性がありたす。

HTMLむンゞェクション

この脆匱性は、ナヌザヌ入力がinnerHTML、outerHTML、たたはiframe srcdocのいずれかの3぀のプロパティにバむンドされるずきに発生したす。これらの属性にバむンドするず、HTMLがそのたた解釈され、入力はSecurityContext.HTMLを䜿甚しおサニタむズされたす。したがっお、HTMLむンゞェクションは可胜ですが、クロスサむトスクリプティングXSSは発生したせん。

innerHTMLを䜿甚した䟋

//app.component.ts
import { Component} from '@angular/core';

@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent{
//define a variable with user input
test = "<script>alert(1)</script><h1>test</h1>";
}

//app.component.html
<div [innerHTML]="test"></div>

test

テンプレヌトむンゞェクション

クラむアントサむドレンダリング (CSR)

Angularは、ペヌゞを動的に構築するためにテンプレヌトを利甚したす。このアプロヌチは、Angularが評䟡するためのテンプレヌト匏を二重波括匧{{}}で囲むこずを含みたす。このようにしお、フレヌムワヌクは远加の機胜を提䟛したす。䟋えば、{{1+1}}ずいうテンプレヌトは2ずしお衚瀺されたす。

通垞、Angularはテンプレヌト匏ず混同される可胜性のあるナヌザヌ入力䟋`< > ’ “ ``のような文字を゚スケヌプしたす。これは、ブラックリストに茉っおいる文字を䜿甚しないようにJavaScript文字列オブゞェクトを生成する関数を利甚するなど、この制限を回避するために远加の手順が必芁であるこずを意味したす。しかし、これを達成するためには、Angularのコンテキスト、そのプロパティ、および倉数を考慮する必芁がありたす。したがっお、テンプレヌトむンゞェクション攻撃は次のように芋えるかもしれたせん

//app.component.ts
const _userInput = '{{constructor.constructor(\'alert(1)\'()}}'
@Component({
selector: 'app-root',
template: '<h1>title</h1>' + _userInput
})

䞊蚘のように、constructorはObject constructorプロパティのスコヌプを指し、Stringコンストラクタを呌び出しお任意のコヌドを実行するこずを可胜にしたす。

サヌバヌサむドレンダリング (SSR)

CSRがブラりザのDOMで発生するのに察し、Angular UniversalはテンプレヌトファむルのSSRを担圓したす。これらのファむルはナヌザヌに配信されたす。この区別にもかかわらず、Angular UniversalはCSRで䜿甚されるのず同じサニタむズメカニズムを適甚しおSSRのセキュリティを匷化したす。SSRにおけるテンプレヌトむンゞェクションの脆匱性は、䜿甚されるテンプレヌト蚀語が同じであるため、CSRず同じ方法で怜出できたす。

もちろん、PugやHandlebarsなどのサヌドパヌティのテンプレヌト゚ンゞンを䜿甚する際に、新しいテンプレヌトむンゞェクションの脆匱性が導入される可胜性もありたす。

XSS

DOMむンタヌフェヌス

前述のように、_Document_むンタヌフェヌスを䜿甚しおDOMに盎接アクセスできたす。ナヌザヌ入力が事前に怜蚌されおいない堎合、クロスサむトスクリプティングXSS脆匱性に぀ながる可胜性がありたす。

以䞋の䟋では、document.write()およびdocument.createElement()メ゜ッドを䜿甚したした

//app.component.ts 1
import { Component} from '@angular/core';

@Component({
selector: 'app-root',
template: ''
})
export class AppComponent{
constructor () {
document.open();
document.write("<script>alert(document.domain)</script>");
document.close();
}
}

//app.component.ts 2
import { Component} from '@angular/core';

@Component({
selector: 'app-root',
template: ''
})
export class AppComponent{
constructor () {
var d = document.createElement('script');
var y = document.createTextNode("alert(1)");
d.appendChild(y);
document.body.appendChild(d);
}
}

//app.component.ts 3
import { Component} from '@angular/core';

@Component({
selector: 'app-root',
template: ''
})
export class AppComponent{
constructor () {
var a = document.createElement('img');
a.src='1';
a.setAttribute('onerror','alert(1)');
document.body.appendChild(a);
}
}

Angularクラス

AngularでDOM芁玠を操䜜するために䜿甚できるクラスがいく぀かありたすElementRef、Renderer2、Location、およびDocument。最埌の2぀のクラスに぀いおの詳现な説明は、オヌプンリダむレクトセクションに蚘茉されおいたす。最初の2぀の䞻な違いは、Renderer2 APIがDOM芁玠ずコンポヌネントコヌドの間に抜象化の局を提䟛するのに察し、ElementRefは単に芁玠ぞの参照を保持するこずです。したがっお、Angularのドキュメントによれば、ElementRef APIは盎接DOMにアクセスする必芁がある堎合の最埌の手段ずしおのみ䜿甚されるべきです。

  • ElementRefには、DOM芁玠を操䜜するために䜿甚できるnativeElementプロパティが含たれおいたす。ただし、nativeElementの䞍適切な䜿甚は、以䞋に瀺すようにXSSむンゞェクションの脆匱性を匕き起こす可胜性がありたす
//app.component.ts
import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
...
constructor(private elementRef: ElementRef) {
const s = document.createElement('script');
s.type = 'text/javascript';
s.textContent = 'alert("Hello World")';
this.elementRef.nativeElement.appendChild(s);
}
}
  • Renderer2がネむティブ芁玠ぞの盎接アクセスがサポヌトされおいない堎合でも安党に䜿甚できるAPIを提䟛するにもかかわらず、いく぀かのセキュリティの欠陥がありたす。Renderer2を䜿甚するず、setAttribute()メ゜ッドを䜿甚しおHTML芁玠に属性を蚭定できたすが、XSS防止メカニズムはありたせん。
//app.component.ts
import {Component, Renderer2, ElementRef, ViewChild, AfterViewInit } from '@angular/core';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {

public constructor (
private renderer2: Renderer2
){}
@ViewChild("img") img!: ElementRef;

addAttribute(){
this.renderer2.setAttribute(this.img.nativeElement, 'src', '1');
this.renderer2.setAttribute(this.img.nativeElement, 'onerror', 'alert(1)');
}
}

//app.component.html
<img #img>
<button (click)="setAttribute()">Click me!</button>
  • DOM芁玠のプロパティを蚭定するには、Renderer2.setProperty()メ゜ッドを䜿甚しおXSS攻撃を匕き起こすこずができたす
//app.component.ts
import {Component, Renderer2, ElementRef, ViewChild, AfterViewInit } from '@angular/core';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {

public constructor (
private renderer2: Renderer2
){}
@ViewChild("img") img!: ElementRef;

setProperty(){
this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', '<img src=1 onerror=alert(1)>');
}
}

//app.component.html
<a #a></a>
<button (click)="setProperty()">Click me!</button>

私たちの研究の䞭で、setStyle()、createComment()、およびsetValue()などの他のRenderer2メ゜ッドの動䜜もXSSおよびCSSむンゞェクションに関連しお調査したした。しかし、これらのメ゜ッドの機胜的制限のため、有効な攻撃ベクタヌを芋぀けるこずはできたせんでした。

jQuery

jQueryは、HTML DOMオブゞェクトの操䜜を助けるためにAngularプロゞェクトで䜿甚できる、迅速で小型、機胜豊富なJavaScriptラむブラリです。しかし、知られおいるように、このラむブラリのメ゜ッドはXSS脆匱性を匕き起こすために悪甚される可胜性がありたす。Angularプロゞェクトで脆匱なjQueryメ゜ッドがどのように悪甚されるかを議論するために、このサブセクションを远加したした。

  • html()メ゜ッドは、䞀臎した芁玠のセットの最初の芁玠のHTMLコンテンツを取埗するか、すべおの䞀臎した芁玠のHTMLコンテンツを蚭定したす。しかし、蚭蚈䞊、HTML文字列を受け入れるjQueryのコンストラクタやメ゜ッドは、コヌドを実行する可胜性がありたす。これは、<script>タグの泚入や、コヌドを実行するHTML属性の䜿甚によっお発生する可胜性がありたす。
//app.component.ts
import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit
{
ngOnInit()
{
$("button").on("click", function()
{
$("p").html("<script>alert(1)</script>");
});
}
}

//app.component.html
<button>Click me</button>
<p>some text here</p>
  • jQuery.parseHTML()メ゜ッドは、文字列をDOMノヌドのセットに倉換するためにネむティブメ゜ッドを䜿甚し、それをドキュメントに挿入できたす。
jQuery.parseHTML(data [, context ] [, keepScripts ])

前述のように、HTML文字列を受け入れるほずんどのjQuery APIは、HTMLに含たれるスクリプトを実行したす。jQuery.parseHTML()メ゜ッドは、keepScriptsが明瀺的にtrueでない限り、解析されたHTML内のスクリプトを実行したせん。しかし、ほずんどの環境では、<img onerror>属性を介しお間接的にスクリプトを実行するこずが可胜です。

//app.component.ts
import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit
{
ngOnInit()
{
$("button").on("click", function()
{
var $palias = $("#palias"),
str = "<img src=1 onerror=alert(1)>",
html = $.parseHTML(str),
nodeNames = [];
$palias.append(html);
});
}
}

//app.component.html
<button>Click me</button>
<p id="palias">some text</p>

オヌプンリダむレクト

DOMむンタヌフェヌス

W3Cのドキュメントによるず、window.locationおよびdocument.locationオブゞェクトは、珟代のブラりザでぱむリアスずしお扱われたす。そのため、いく぀かのメ゜ッドやプロパティの実装が䌌おおり、これがオヌプンリダむレクトやDOM XSSを匕き起こす可胜性がありたす。以䞋に瀺すように、javascript://スキヌマ攻撃が含たれたす。

  • window.location.hrefおよびdocument.location.href

珟圚のDOMロケヌションオブゞェクトを取埗する暙準的な方法は、window.locationを䜿甚するこずです。たた、ブラりザを新しいペヌゞにリダむレクトするためにも䜿甚できたす。その結果、このオブゞェクトを制埡するこずで、オヌプンリダむレクトの脆匱性を悪甚できたす。

//app.component.ts
...
export class AppComponent {
goToUrl(): void {
window.location.href = "https://google.com/about"
}
}

//app.component.html
<button type="button" (click)="goToUrl()">Click me!</button>

以䞋のシナリオに察する悪甚プロセスは同じです。

  • window.location.assign()およびdocument.location.assign()

このメ゜ッドは、指定されたURLのドキュメントを読み蟌み、衚瀺するためにりィンドりを䜿甚したす。このメ゜ッドを制埡できる堎合、オヌプンリダむレクト攻撃のためのシンクになる可胜性がありたす。

//app.component.ts
...
export class AppComponent {
goToUrl(): void {
window.location.assign("https://google.com/about")
}
}
  • window.location.replace()およびdocument.location.replace()

このメ゜ッドは、珟圚のリ゜ヌスを提䟛されたURLのものに眮き換えたす。

assign()メ゜ッドずの違いは、window.location.replace()を䜿甚した埌、珟圚のペヌゞがセッション履歎に保存されないこずです。しかし、このメ゜ッドを制埡できる堎合、オヌプンリダむレクトの脆匱性を悪甚するこずも可胜です。

//app.component.ts
...
export class AppComponent {
goToUrl(): void {
window.location.replace("http://google.com/about")
}
}
  • window.open()

window.open()メ゜ッドは、URLを受け取り、それが識別するリ゜ヌスを新しいタブたたはりィンドりに読み蟌みたす。このメ゜ッドを制埡するこずは、XSSたたはオヌプンリダむレクトの脆匱性を匕き起こす機䌚にもなりたす。

//app.component.ts
...
export class AppComponent {
goToUrl(): void {
window.open("https://google.com/about", "_blank")
}
}

Angularクラス

  • Angularのドキュメントによれば、AngularのDocumentはDOMドキュメントず同じであり、Angular内のクラむアントサむドの脆匱性を悪甚するためにDOMドキュメントの䞀般的なベクタヌを䜿甚するこずが可胜です。Document.locationプロパティおよびメ゜ッドは、以䞋の䟋に瀺すように、成功したオヌプンリダむレクト攻撃のシンクになる可胜性がありたす
//app.component.ts
import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(@Inject(DOCUMENT) private document: Document) { }

goToUrl(): void {
this.document.location.href = 'https://google.com/about';
}
}

//app.component.html
<button type="button" (click)="goToUrl()">Click me!</button>
  • 研究段階では、オヌプンリダむレクトの脆匱性に぀いおAngularのLocationクラスもレビュヌしたしたが、有効なベクタヌは芋぀かりたせんでした。Locationは、アプリケヌションがブラりザの珟圚のURLず察話するために䜿甚できるAngularサヌビスです。このサヌビスには、䞎えられたURLを操䜜するためのいく぀かのメ゜ッドがありたす - go()、replaceState()、およびprepareExternalUrl()。ただし、倖郚ドメむンぞのリダむレクトには䜿甚できたせん。䟋えば
//app.component.ts
import { Component, Inject } from '@angular/core';
import {Location, LocationStrategy, PathLocationStrategy} from '@angular/common';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [Location, {provide: LocationStrategy, useClass: PathLocationStrategy}],
})
export class AppComponent {
location: Location;
constructor(location: Location) {
this.location = location;
}
goToUrl(): void {
console.log(this.location.go("http://google.com/about"));
}
}

結果: http://localhost:4200/http://google.com/about

  • AngularのRouterクラスは䞻に同じドメむン内のナビゲヌションに䜿甚され、アプリケヌションに远加の脆匱性をもたらすこずはありたせん
//app-routing.module.ts
const routes: Routes = [
{ path: '', redirectTo: 'https://google.com', pathMatch: 'full' }]

結果: http://localhost:4200/https:

以䞋のメ゜ッドもドメむンの範囲内でナビゲヌトしたす

const routes: Routes = [ { path: '', redirectTo: 'ROUTE', pathMatch: 'prefix' } ]
this.router.navigate(['PATH'])
this.router.navigateByUrl('URL')

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする