0x01のタイトル説明
私たちは、トピックを開き、それは簡単な登録ページです
0x02の問題解決プロセス
まず、私たちは、アカウントにサインアップしてみてください
、我々は直接ソースコードF12を表示し、私たちは絵のSRC見ることができ
、我々はここに考えるだろう、1をssrf
我々は、ソースコードを読んで、テストに合格しようとすることができ、我々は発見したユーザー名と画像の必須の相の名前対応が、それ以外の場合はエラーになりますので、我々は渡すことができますか?急行jsの構築、このサイトが促さ話題によると、この制限を回避し、我々は一般的なことを知っているjs
フレームワークは持っているpackage.json
私たちは、ユーザー名を登録して、ファイルを../package.json?
ので、あなたが読むことができることをpackage.json
imgタグ内のファイルので、絵はので、ファイルを私たちは、ルートディレクトリ内のフラグ/フラグ、私たちは写真をダウンロード置くことができることを示し、その後、画面の指示に従って、それを開くために、メモ帳を使用することはできません。
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
解読するために、そこにあるtrick
、node
あるjsonwebtoken
バグがあり、ときjwt secret
に空jsonwebtoken
に使用されるalgorithm none
復号化するために、サーバ経由ため、
var secret = global.secretlist[id];
jwt.verify(req.cookies.token,secret);
復号化は、私はそれが存在しない渡すことができますid
ように、secret
さundefined
につながる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!==".")