unctf ARBI(SSRF&特性用途を発現します)

0x01のタイトル説明

私たちは、トピックを開き、それは簡単な登録ページです
ここに画像を挿入説明

0x02の問題解決プロセス

まず、私たちは、アカウントにサインアップしてみてください
ここに画像を挿入説明、我々は直接ソースコードF12を表示し、私たちは絵のSRC見ることができ
ここに画像を挿入説明


、我々はここに考えるだろう、1をssrf我々は、ソースコードを読んで、テストに合格しようとすることができ、我々は発見したユーザー名と画像の必須の相の名前対応が、それ以外の場合はエラーになりますので、我々は渡すことができますか?急行jsの構築、このサイトが促さ話題によると、この制限を回避し、我々は一般的なことを知っているjsフレームワークは持っているpackage.json私たちは、ユーザー名を登録して、ファイルを../package.json?ので、あなたが読むことができることをpackage.jsonimgタグ内のファイルので、絵はので、ファイルを私たちは、ルートディレクトリ内のフラグ/フラグ、私たちは写真をダウンロード置くことができることを示し、その後、画面の指示に従って、それを開くために、メモ帳を使用することはできません。



2、package.jsonメインエントランスを表示するmainapp.jsので、レジスタの読み続けるmainapp.js/routers/index.jsがある見ることができます読んで、ルートが/routers/index.jsファイルを読み込むし続けて見つけ、ファイルをVerYs3cretWwWb4ck4p33441122.zipルート直接webソースをダウンロードするためのアクセスがコード。次は、監査コードです。



3、その後、ホワイトボックス監査を見つけることができますされて登録ログイン機能を使用してjwt認証を、誰もが自分自身の独立を持っているjwt secretし、サーバリストに存在し、異なるユーザの秘密のリストは、対応idに保存されているjwt途中、から直接上陸しますjwt token読みidして、リストを介して取得secret解読するために、そこにあるtricknodeあるjsonwebtokenバグがあり、ときjwt secretに空jsonwebtokenに使用されるalgorithm none復号化するために、サーバ経由ため、

 var secret = global.secretlist[id];
 jwt.verify(req.cookies.token,secret);

復号化は、私はそれが存在しない渡すことができますidように、secretundefinedにつながるalgorithmされnone、その後、あなたは偽のできjwtになるためにadmin

import jwt
token = jwt.encode({"id":-1,"username":"admin","password":"123456"},algorithm="none",key="").decode(encoding='utf-8')
print(token)


なるための4、admin後で、あなたがアクセスできるadmin23333_interfaceインターフェイスは、ファイルの読み取りに、ここで使用されるインタフェースである、監査で見つけることができexpress渡すときに、プロパティを?a[b]=1時間の、変数はa自動的に対象となりa = {"b":1}、それは渡すことができnameないようにするには、オブジェクトとしてオープン?入力したif第一層の迂回判断を
if(!/^key$/im.test(req.query.name.filename))return res.sendStatus(500);
フィルタは、第2の判定があるホワイトリストフィルタfilenameを超えることはできません3人がフィルタリングされるかどうか、.そして/、読みながらflagあなたはルートディレクトリにディレクトリを横断する必要があると../の三個の文字を占めているが、プラス上flag確かに多く、この時間制限は、思考の変化する以上のlength文字列の長さはまた、配列の長さをとることが取ることができるだけでなく、filenameフィルタをバイパスして、完璧なまでセット配列し、次のサイクルexpressの意志、それは同じ名前の二つの変数に来るときの時間をこの変数は、例えばアレイに設定されてa=123&a=456解析されa = [123,456]、これに最終組成物

/admin23333_interface?name[filename]=../&name[filename]=f&name[filename]=l&name[filename]=a&name[filename]=g

この時点でname={"filename":["../", "f", "l", "a", "g"]}
完全にバイパスif(c !== "/" && c!==".")



0x03の参照リンク

リンク

公開された47元の記事 ウォンの賞賛2 ビュー3131

おすすめ

転載: blog.csdn.net/a3320315/article/details/103092073