mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/nodejs-proto-prototype-p
This commit is contained in:
parent
8411de79e5
commit
d1fec0d1de
@ -13,7 +13,7 @@ console.log(Object.create(null)) // This will output an empty object.
|
|||||||
|
|
||||||
### JavaScript में फ़ंक्शन और क्लासेस
|
### JavaScript में फ़ंक्शन और क्लासेस
|
||||||
|
|
||||||
JavaScript में, क्लासेस और फ़ंक्शंस निकटता से जुड़े होते हैं, जहाँ फ़ंक्शंस अक्सर क्लासेस के लिए कंस्ट्रक्टर्स के रूप में कार्य करते हैं। JavaScript में मूलभूत क्लास समर्थन की कमी के बावजूद, कंस्ट्रक्टर्स क्लास व्यवहार का अनुकरण कर सकते हैं।
|
JavaScript में, क्लासेस और फ़ंक्शंस निकटता से जुड़े होते हैं, जहाँ फ़ंक्शंस अक्सर क्लासेस के लिए कंस्ट्रक्टर्स के रूप में कार्य करते हैं। JavaScript में मूलभूत क्लास समर्थन की कमी के बावजूद, कंस्ट्रक्टर्स क्लास व्यवहार की नकल कर सकते हैं।
|
||||||
```javascript
|
```javascript
|
||||||
// Run this in the developers tools console
|
// Run this in the developers tools console
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ JavaScript रनटाइम पर प्रोटोटाइप विशे
|
|||||||
|
|
||||||
प्रोटोटाइप-आधारित प्रोग्रामिंग में, गुण/विधियाँ वस्तुओं द्वारा वर्गों से विरासत में ली जाती हैं। ये वर्ग अन्य वर्ग के एक उदाहरण या एक खाली वस्तु में गुण/विधियाँ जोड़कर बनाए जाते हैं।
|
प्रोटोटाइप-आधारित प्रोग्रामिंग में, गुण/विधियाँ वस्तुओं द्वारा वर्गों से विरासत में ली जाती हैं। ये वर्ग अन्य वर्ग के एक उदाहरण या एक खाली वस्तु में गुण/विधियाँ जोड़कर बनाए जाते हैं।
|
||||||
|
|
||||||
यह ध्यान रखना चाहिए कि जब एक गुण को एक वस्तु में जोड़ा जाता है जो अन्य वस्तुओं के लिए प्रोटोटाइप के रूप में कार्य करती है (जैसे `myPersonObj`), तो विरासत में ली गई वस्तुओं को इस नए गुण तक पहुँच मिलती है। हालाँकि, यह गुण स्वचालित रूप से प्रदर्शित नहीं होता जब तक कि इसे स्पष्ट रूप से नहीं बुलाया जाता।
|
यह ध्यान दिया जाना चाहिए कि जब एक गुण को एक वस्तु में जोड़ा जाता है जो अन्य वस्तुओं के लिए प्रोटोटाइप के रूप में कार्य करती है (जैसे `myPersonObj`), तो विरासत में ली गई वस्तुओं को इस नए गुण तक पहुँच प्राप्त होती है। हालाँकि, यह गुण स्वचालित रूप से प्रदर्शित नहीं होता जब तक कि इसे स्पष्ट रूप से नहीं बुलाया जाता।
|
||||||
|
|
||||||
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
|
## \_\_proto\_\_ pollution <a href="#id-0d0a" id="id-0d0a"></a>
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ var car1 = new Vehicle("Tesla Model S")
|
|||||||
car1.__proto__.__proto__
|
car1.__proto__.__proto__
|
||||||
Vehicle.__proto__.__proto__
|
Vehicle.__proto__.__proto__
|
||||||
```
|
```
|
||||||
Object प्रोटोटाइप में गुण जोड़कर, हर JavaScript ऑब्जेक्ट इन नए गुणों को विरासत में प्राप्त करेगा:
|
Object प्रोटोटाइप में गुण जोड़ने से, हर JavaScript ऑब्जेक्ट इन नए गुणों को विरासत में प्राप्त करेगा:
|
||||||
```javascript
|
```javascript
|
||||||
function Vehicle(model) {
|
function Vehicle(model) {
|
||||||
this.model = model
|
this.model = model
|
||||||
@ -102,13 +102,13 @@ car1.constructor.prototype.isElectric = true
|
|||||||
|
|
||||||
प्रोटोटाइप प्रदूषण के माध्यम से JavaScript ऑब्जेक्ट्स को वैश्विक रूप से प्रभावित करने के दो तरीके हैं:
|
प्रोटोटाइप प्रदूषण के माध्यम से JavaScript ऑब्जेक्ट्स को वैश्विक रूप से प्रभावित करने के दो तरीके हैं:
|
||||||
|
|
||||||
1. `Object.prototype` को सीधे प्रदूषित करना:
|
1. सीधे `Object.prototype` को प्रदूषित करना:
|
||||||
```javascript
|
```javascript
|
||||||
Object.prototype.goodbye = function () {
|
Object.prototype.goodbye = function () {
|
||||||
console.log("Goodbye!")
|
console.log("Goodbye!")
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
2. सामान्य रूप से उपयोग किए जाने वाले ढांचे के लिए एक कंस्ट्रक्टर के प्रोटोटाइप को प्रदूषित करना:
|
2. एक सामान्य रूप से उपयोग किए जाने वाले संरचना के लिए कंस्ट्रक्टर के प्रोटोटाइप को प्रदूषित करना:
|
||||||
```javascript
|
```javascript
|
||||||
var example = { key: "value" }
|
var example = { key: "value" }
|
||||||
example.constructor.prototype.greet = function () {
|
example.constructor.prototype.greet = function () {
|
||||||
@ -121,7 +121,7 @@ console.log("Hello!")
|
|||||||
|
|
||||||
### एक क्लास से Object.prototype तक
|
### एक क्लास से Object.prototype तक
|
||||||
|
|
||||||
एक परिदृश्य में जहाँ आप **एक विशिष्ट ऑब्जेक्ट को प्रदूषित** कर सकते हैं और आपको **`Object.prototype` तक पहुँचने** की आवश्यकता है, आप इसके लिए निम्नलिखित कोड की तरह कुछ खोज सकते हैं:
|
एक परिदृश्य में जहाँ आप **एक विशिष्ट ऑब्जेक्ट को प्रदूषित** कर सकते हैं और आपको **`Object.prototype` तक पहुँचने** की आवश्यकता है, आप इसके लिए निम्नलिखित कोड जैसे कुछ खोज सकते हैं:
|
||||||
```javascript
|
```javascript
|
||||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ console.log(key1 + "." + key2)
|
|||||||
```
|
```
|
||||||
### Array elements pollution
|
### Array elements pollution
|
||||||
|
|
||||||
ध्यान दें कि जैसे आप JS में ऑब्जेक्ट्स के गुणों को प्रदूषित कर सकते हैं, यदि आपके पास एक एरे को प्रदूषित करने की पहुंच है, तो आप **एरे के मानों को भी प्रदूषित कर सकते हैं** जो **इंडेक्स द्वारा उपलब्ध हैं** (ध्यान दें कि आप मानों को ओवरराइट नहीं कर सकते, इसलिए आपको उन इंडेक्स को प्रदूषित करना होगा जो किसी न किसी तरह से उपयोग किए जाते हैं लेकिन लिखे नहीं जाते)।
|
ध्यान दें कि जैसे आप JS में ऑब्जेक्ट्स के गुणों को प्रदूषित कर सकते हैं, यदि आपके पास एक एरे को प्रदूषित करने की पहुंच है, तो आप **एरे के मानों को भी प्रदूषित कर सकते हैं** जो **इंडेक्स द्वारा सुलभ हैं** (ध्यान दें कि आप मानों को ओवरराइट नहीं कर सकते, इसलिए आपको उन इंडेक्स को प्रदूषित करना होगा जो किसी न किसी तरह से उपयोग किए जाते हैं लेकिन लिखे नहीं जाते)।
|
||||||
```javascript
|
```javascript
|
||||||
c = [1, 2]
|
c = [1, 2]
|
||||||
a = []
|
a = []
|
||||||
@ -154,7 +154,7 @@ b[0] //undefined
|
|||||||
b[1] //"yolo"
|
b[1] //"yolo"
|
||||||
c[1] // 2 -- not
|
c[1] // 2 -- not
|
||||||
```
|
```
|
||||||
### Html तत्वों का प्रदूषण
|
### Html elements pollution
|
||||||
|
|
||||||
जब JS के माध्यम से एक HTML तत्व उत्पन्न किया जाता है, तो **`innerHTML`** विशेषता को **ओवरराइट** करना संभव है ताकि यह **मनमाने HTML कोड** को लिख सके। [इस लेख से विचार और उदाहरण](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)।
|
जब JS के माध्यम से एक HTML तत्व उत्पन्न किया जाता है, तो **`innerHTML`** विशेषता को **ओवरराइट** करना संभव है ताकि यह **मनमाने HTML कोड** को लिख सके। [इस लेख से विचार और उदाहरण](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/)।
|
||||||
```javascript
|
```javascript
|
||||||
@ -177,7 +177,7 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||||||
```javascript
|
```javascript
|
||||||
if (user.admin) {
|
if (user.admin) {
|
||||||
```
|
```
|
||||||
यदि विशेषता **`admin` अपरिभाषित है** तो एक PP का दुरुपयोग करना संभव है और इसे True पर सेट करना संभव है जैसे:
|
यदि विशेषता **`admin` अपरिभाषित है** तो एक PP का दुरुपयोग करना संभव है और इसे कुछ इस तरह से True पर सेट किया जा सकता है:
|
||||||
```javascript
|
```javascript
|
||||||
Object.prototype.isAdmin = true
|
Object.prototype.isAdmin = true
|
||||||
let user = {}
|
let user = {}
|
||||||
@ -213,12 +213,12 @@ client-side-prototype-pollution.md
|
|||||||
|
|
||||||
### CVE-2019–11358: Prototype pollution attack through jQuery $ .extend
|
### CVE-2019–11358: Prototype pollution attack through jQuery $ .extend
|
||||||
|
|
||||||
[For further details check this article](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery में, `$ .extend` फ़ंक्शन प्रोटोटाइप प्रदूषण का कारण बन सकता है यदि गहरे कॉपी फ़ीचर का गलत उपयोग किया जाए। यह फ़ंक्शन आमतौर पर ऑब्जेक्ट्स को क्लोन करने या एक डिफ़ॉल्ट ऑब्जेक्ट से प्रॉपर्टीज़ को मर्ज करने के लिए उपयोग किया जाता है। हालाँकि, जब गलत कॉन्फ़िगर किया जाता है, तो नए ऑब्जेक्ट के लिए निर्धारित प्रॉपर्टीज़ को प्रोटोटाइप में असाइन किया जा सकता है। उदाहरण के लिए:
|
[For further details check this article](https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7) jQuery में, `$ .extend` फ़ंक्शन प्रोटोटाइप प्रदूषण का कारण बन सकता है यदि गहरे कॉपी फीचर का गलत उपयोग किया जाए। यह फ़ंक्शन आमतौर पर ऑब्जेक्ट्स को क्लोन करने या डिफ़ॉल्ट ऑब्जेक्ट से प्रॉपर्टीज़ को मर्ज करने के लिए उपयोग किया जाता है। हालाँकि, जब गलत कॉन्फ़िगर किया जाता है, तो नए ऑब्जेक्ट के लिए निर्धारित प्रॉपर्टीज़ प्रोटोटाइप को असाइन की जा सकती हैं। उदाहरण के लिए:
|
||||||
```javascript
|
```javascript
|
||||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||||
console.log({}.devMode) // Outputs: true
|
console.log({}.devMode) // Outputs: true
|
||||||
```
|
```
|
||||||
यह कमजोरियों, जिसे CVE-2019–11358 के रूप में पहचाना गया है, यह दर्शाता है कि कैसे एक गहरी कॉपी अनजाने में प्रोटोटाइप को संशोधित कर सकती है, जिससे संभावित सुरक्षा जोखिम उत्पन्न होते हैं, जैसे कि यदि `isAdmin` जैसी प्रॉपर्टीज़ को उचित अस्तित्व सत्यापन के बिना जांचा जाता है तो अनधिकृत व्यवस्थापक पहुंच।
|
यह कमजोरियों, जिसे CVE-2019–11358 के रूप में पहचाना गया है, यह दर्शाता है कि कैसे एक गहरी कॉपी अनजाने में प्रोटोटाइप को संशोधित कर सकती है, जिससे संभावित सुरक्षा जोखिम उत्पन्न होते हैं, जैसे कि यदि `isAdmin` जैसी प्रॉपर्टीज़ को उचित अस्तित्व सत्यापन के बिना जांचा जाए तो अनधिकृत व्यवस्थापक पहुंच।
|
||||||
|
|
||||||
### CVE-2018–3721, CVE-2019–10744: lodash के माध्यम से प्रोटोटाइप प्रदूषण हमला
|
### CVE-2018–3721, CVE-2019–10744: lodash के माध्यम से प्रोटोटाइप प्रदूषण हमला
|
||||||
|
|
||||||
@ -228,9 +228,9 @@ console.log({}.devMode) // Outputs: true
|
|||||||
|
|
||||||
### CVEs के साथ एक और ट्यूटोरियल
|
### CVEs के साथ एक और ट्यूटोरियल
|
||||||
|
|
||||||
{{#ref}}
|
|
||||||
https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2
|
- [https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2](https://infosecwriteups.com/javascript-prototype-pollution-practice-of-finding-and-exploitation-f97284333b2)
|
||||||
{{#endref}}
|
|
||||||
|
|
||||||
### प्रोटोटाइप प्रदूषण का पता लगाने के लिए उपकरण
|
### प्रोटोटाइप प्रदूषण का पता लगाने के लिए उपकरण
|
||||||
|
|
||||||
@ -250,10 +250,10 @@ Handlebars टेम्पलेट इंजन प्रोटोटाइप
|
|||||||
शोषण Handlebars द्वारा उत्पन्न AST (एब्स्ट्रैक्ट सिंटैक्स ट्री) का लाभ उठाता है, निम्नलिखित चरणों का पालन करते हुए:
|
शोषण Handlebars द्वारा उत्पन्न AST (एब्स्ट्रैक्ट सिंटैक्स ट्री) का लाभ उठाता है, निम्नलिखित चरणों का पालन करते हुए:
|
||||||
|
|
||||||
1. **पार्सर का हेरफेर**: प्रारंभ में, पार्सर, `NumberLiteral` नोड के माध्यम से, यह सुनिश्चित करता है कि मान संख्यात्मक हैं। प्रोटोटाइप प्रदूषण इसे दरकिनार कर सकता है, जिससे गैर-संख्यात्मक स्ट्रिंग्स को सम्मिलित करना संभव हो जाता है।
|
1. **पार्सर का हेरफेर**: प्रारंभ में, पार्सर, `NumberLiteral` नोड के माध्यम से, यह सुनिश्चित करता है कि मान संख्यात्मक हैं। प्रोटोटाइप प्रदूषण इसे दरकिनार कर सकता है, जिससे गैर-संख्यात्मक स्ट्रिंग्स को सम्मिलित करना संभव हो जाता है।
|
||||||
2. **कंपाइलर द्वारा हैंडलिंग**: कंपाइलर एक AST ऑब्जेक्ट या एक स्ट्रिंग टेम्पलेट को संसाधित कर सकता है। यदि `input.type` `Program` के बराबर है, तो इनपुट को पूर्व-विश्लेषित के रूप में माना जाता है, जिसका लाभ उठाया जा सकता है।
|
2. **कंपाइलर द्वारा हैंडलिंग**: कंपाइलर एक AST ऑब्जेक्ट या एक स्ट्रिंग टेम्पलेट को संसाधित कर सकता है। यदि `input.type` `Program` के बराबर है, तो इनपुट को पूर्व-विश्लेषित के रूप में माना जाता है, जिसका शोषण किया जा सकता है।
|
||||||
3. **कोड का इंजेक्शन**: `Object.prototype` के हेरफेर के माध्यम से, कोई भी टेम्पलेट फ़ंक्शन में मनमाना कोड इंजेक्ट कर सकता है, जो दूरस्थ कोड निष्पादन की ओर ले जा सकता है।
|
3. **कोड का इंजेक्शन**: `Object.prototype` के हेरफेर के माध्यम से, कोई भी टेम्पलेट फ़ंक्शन में मनमाना कोड इंजेक्ट कर सकता है, जो दूरस्थ कोड निष्पादन की ओर ले जा सकता है।
|
||||||
|
|
||||||
Handlebars की कमजोरी के शोषण को प्रदर्शित करने वाला एक उदाहरण:
|
Handlebars की कमजोरी के शोषण का एक उदाहरण:
|
||||||
```javascript
|
```javascript
|
||||||
const Handlebars = require("handlebars")
|
const Handlebars = require("handlebars")
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ const template = Handlebars.precompile(source)
|
|||||||
|
|
||||||
console.log(eval("(" + template + ")")["main"].toString())
|
console.log(eval("(" + template + ")")["main"].toString())
|
||||||
```
|
```
|
||||||
यह कोड दिखाता है कि एक हमलावर कैसे एक हैंडलबार टेम्पलेट में मनमाना कोड इंजेक्ट कर सकता है।
|
यह कोड दिखाता है कि एक हमलावर कैसे Handlebars टेम्पलेट में मनमाना कोड इंजेक्ट कर सकता है।
|
||||||
|
|
||||||
**बाहरी संदर्भ**: 'flat' पुस्तकालय में प्रोटोटाइप प्रदूषण से संबंधित एक समस्या पाई गई, जैसा कि यहाँ विस्तृत किया गया है: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
**बाहरी संदर्भ**: 'flat' पुस्तकालय में प्रोटोटाइप प्रदूषण से संबंधित एक समस्या पाई गई, जैसा कि यहाँ विस्तृत किया गया है: [Issue on GitHub](https://github.com/hughsk/flat/issues/105).
|
||||||
|
|
||||||
@ -340,14 +340,14 @@ requests.get(TARGET_URL)
|
|||||||
|
|
||||||
1. **ऑब्जेक्ट अपरिवर्तनीयता**: `Object.prototype` को `Object.freeze` लागू करके अपरिवर्तनीय बनाया जा सकता है।
|
1. **ऑब्जेक्ट अपरिवर्तनीयता**: `Object.prototype` को `Object.freeze` लागू करके अपरिवर्तनीय बनाया जा सकता है।
|
||||||
2. **इनपुट मान्यता**: JSON इनपुट को एप्लिकेशन के स्कीमा के खिलाफ सख्ती से मान्य किया जाना चाहिए।
|
2. **इनपुट मान्यता**: JSON इनपुट को एप्लिकेशन के स्कीमा के खिलाफ सख्ती से मान्य किया जाना चाहिए।
|
||||||
3. **सुरक्षित मर्ज फ़ंक्शन**: पुनरावर्ती मर्ज फ़ंक्शनों का असुरक्षित उपयोग से बचना चाहिए।
|
3. **सुरक्षित मर्ज फ़ंक्शन**: पुनरावर्ती मर्ज फ़ंक्शंस का असुरक्षित उपयोग से बचना चाहिए।
|
||||||
4. **प्रोटोटाइप-रहित ऑब्जेक्ट**: प्रोटोटाइप गुणों के बिना ऑब्जेक्ट `Object.create(null)` का उपयोग करके बनाए जा सकते हैं।
|
4. **प्रोटोटाइप-रहित ऑब्जेक्ट**: प्रोटोटाइप गुणों के बिना ऑब्जेक्ट `Object.create(null)` का उपयोग करके बनाए जा सकते हैं।
|
||||||
5. **मैप का उपयोग**: कुंजी-मूल्य जोड़ों को संग्रहीत करने के लिए `Object` के बजाय `Map` का उपयोग किया जाना चाहिए।
|
5. **मैप का उपयोग**: कुंजी-मूल्य जोड़ों को संग्रहीत करने के लिए `Object` के बजाय `Map` का उपयोग किया जाना चाहिए।
|
||||||
6. **लाइब्रेरी अपडेट**: नियमित रूप से लाइब्रेरी को अपडेट करके सुरक्षा पैच को शामिल किया जा सकता है।
|
6. **लाइब्रेरी अपडेट**: नियमित रूप से लाइब्रेरी को अपडेट करके सुरक्षा पैच को शामिल किया जा सकता है।
|
||||||
7. **लिंटर और स्थैतिक विश्लेषण उपकरण**: प्रोटोटाइप प्रदूषण कमजोरियों का पता लगाने और रोकने के लिए उपयुक्त प्लगइन्स के साथ ESLint जैसे उपकरणों का उपयोग करें।
|
7. **लिंटर और स्थैतिक विश्लेषण उपकरण**: प्रोटोटाइप प्रदूषण कमजोरियों का पता लगाने और रोकने के लिए उपयुक्त प्लगइन्स के साथ ESLint जैसे उपकरणों का उपयोग करें।
|
||||||
8. **कोड समीक्षाएँ**: प्रोटोटाइप प्रदूषण से संबंधित संभावित जोखिमों की पहचान और सुधार के लिए गहन कोड समीक्षाओं को लागू करें।
|
8. **कोड समीक्षाएँ**: प्रोटोटाइप प्रदूषण से संबंधित संभावित जोखिमों की पहचान और सुधार के लिए गहन कोड समीक्षाओं को लागू करें।
|
||||||
9. **सुरक्षा प्रशिक्षण**: डेवलपर्स को प्रोटोटाइप प्रदूषण के जोखिमों और सुरक्षित कोड लिखने के सर्वोत्तम प्रथाओं के बारे में शिक्षित करें।
|
9. **सुरक्षा प्रशिक्षण**: डेवलपर्स को प्रोटोटाइप प्रदूषण के जोखिमों और सुरक्षित कोड लिखने के सर्वोत्तम प्रथाओं के बारे में शिक्षित करें।
|
||||||
10. **लाइब्रेरी का सावधानी से उपयोग**: तृतीय-पक्ष लाइब्रेरी का उपयोग करते समय सावधानी बरतें। उनकी सुरक्षा स्थिति का आकलन करें और उनके कोड की समीक्षा करें, विशेष रूप से जो ऑब्जेक्ट को संशोधित करते हैं।
|
10. **लाइब्रेरी का सावधानी से उपयोग**: तीसरे पक्ष की लाइब्रेरी का उपयोग करते समय सावधान रहें। उनकी सुरक्षा स्थिति का आकलन करें और उनके कोड की समीक्षा करें, विशेष रूप से जो ऑब्जेक्ट को संशोधित करते हैं।
|
||||||
11. **रनटाइम सुरक्षा**: प्रोटोटाइप प्रदूषण हमलों का पता लगाने और रोकने के लिए सुरक्षा-केंद्रित npm पैकेज का उपयोग करके रनटाइम सुरक्षा तंत्र लागू करें।
|
11. **रनटाइम सुरक्षा**: प्रोटोटाइप प्रदूषण हमलों का पता लगाने और रोकने के लिए सुरक्षा-केंद्रित npm पैकेज का उपयोग करके रनटाइम सुरक्षा तंत्र लागू करें।
|
||||||
|
|
||||||
## संदर्भ
|
## संदर्भ
|
||||||
|
Loading…
x
Reference in New Issue
Block a user