{"id":664,"date":"2016-06-24T10:15:44","date_gmt":"2016-06-24T08:15:44","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=664"},"modified":"2023-06-07T11:46:24","modified_gmt":"2023-06-07T09:46:24","slug":"web-app-file-upload-vulnerabilities","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/06\/24\/web-app-file-upload-vulnerabilities\/","title":{"rendered":"Web App \u2013 File Upload Vulnerabilities"},"content":{"rendered":"<div class=\"page\" title=\"Page 1\">Today we will discuss file upload vulnerabilities; a topic that is widely underestimated by developers. First, we will imagine a website in which it is possible to upload images with the format .jpg, .png, .gif and so on.&nbsp;<span class=\"s1\">If<\/span><span class=\"s2\"> an application <\/span><span class=\"s1\">does not have<\/span><span class=\"s2\"> proper form validation for file uploads, an attacker is able to gain control over the system.<\/span>&nbsp;This is especially true for file extensions like .php and .asp, since these are automatically interpreted by webservers. I\u2019ll elaborate on how this works, and on which defense strategy will be effective depending on each specific case.<\/div>\n<p><!--more--><\/p>\n<blockquote><p>File upload vulnerabilities are a devastating category of web application vulnerabilities. Without secure coding and configuration an attacker can quickly compromise an affected system.<\/p><\/blockquote>\n<p>The quotation from Matt Koch in 2015 highlights the importance of file upload vulnerabilities in these days. File upload vulnerabilities have been identified in a study of 1600 WordPress pages as third most common vulnerability. As of January 2016th.<\/p>\n<p>In the simplest case, there are no restrictions on the type of the file, therefore&nbsp;an attacker can easily upload malicious code. This looks naive, but is still common.<\/p>\n<p><strong>HOW HTTP FILE UPLOAD WORKS<\/strong><\/p>\n<pre class=\"prettyprint lang-html\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n    &lt;body&gt;\n        &lt;form action=\"upload.php\" method=\"post\" enctype=\"multipart\/form-data\"&gt;\n            Select image to upload:\n            &lt;input type=\"file\" name=\"uploadedfile\" id=\"uploadedfile\"&gt;\n            &lt;input type=\"submit\" value=\"Upload Image\" name=\"submit\"&gt;\n        &lt;\/form&gt;\n    &lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<p class=\"p1\"><span class=\"s1\">Above<\/span><span class=\"s2\"> is a simple HTML code for an HTTP file upload in which the encryption type specifies the method of encoding.<\/span>&nbsp;If&nbsp;this is set multipart, no character is encoded, but the user agent is adding some information to the request body or payload.<\/p>\n<p>Getting a POST request with the encoding type <code class=\"\" data-line=\"\">multipart \/ form-data<\/code>&nbsp;PHP first generates a temporary file with a random name in a temporary directory (example: <code class=\"\" data-line=\"\">\/var\/tmp\/php6yXOVs<\/code>).<\/p>\n<p>Next up a gloable $_FILES array for the file is created that contains information about the uploaded files:<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;?php \n    $_FILES['uploadedfile']['name']     \n    $_FILES['uploadedfile']['type'] \n    $_FILES['uploadedfile']['size']     \n    $_FILES['uploadedfile']['tmp_name']\n?&gt;<\/pre>\n<ul>\n<li><strong>&lt;name&gt;<\/strong> specifies the original name of the file given by the user,<\/li>\n<li><strong>&lt;type&gt;<\/strong> describes the MIME type,<\/li>\n<li><strong>&lt;size&gt;<\/strong> is self explanatory and<\/li>\n<li><strong>&lt;tmp_name&gt;<\/strong> is the temporary name given by PHP.<\/li>\n<\/ul>\n<p>Now we will have a quick look into the PHP code, written&nbsp;<span class=\"s1\">to utilize<\/span>&nbsp;the upload form on the server.<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;?php\n    $target_file = getcwd().\"\/uploads\/\".basename($_FILES[\"fileToUpload\"][\"name\"]);\n    \n    if (move_uploaded_file($_FILES[\"fileToUpload\"][\"tmp_name\"], $target_file)) {   \n        echo \"The file has been uploaded.\";\n    } \n    else  {\n        echo \"Sorry, there was an error uploading your file.\";\n    }\n?&gt;<\/pre>\n<p>The function <code class=\"\" data-line=\"\">move_uploaded_file()<\/code>&nbsp;moves the temporary file to the location, which is passed as second argument into the function call. What might an attacker do&nbsp;here? Because there is no mechanism for validation, an attacker can easily upload malicious code to the server, determine the directory of upload and execute the&nbsp;<span class=\"s1\">mailicious<\/span>&nbsp;code. Examples of&nbsp;the single chapters can be downloaded in the corresponding <a href=\"https:\/\/github.com\/tderleth\/file-upload-vulnerabilities\">git repository.<\/a><\/p>\n<p><strong>EXCURSION &#8211; EXPLOIT<\/strong><\/p>\n<p>What code can an attacker upload and what can he exploit? To provide a quick overview, we will discuss exploit opportunities in a nutshell. An exploit is a way to make use of a programmatic vulnerability.&nbsp;<span class=\"s1\">Comparable with a <\/span><span class=\"s2\">burglar with a crowbar<\/span><span class=\"s1\">, <\/span><span class=\"s2\">an attacker obtains<\/span><span class=\"s1\"> access to<\/span><span class=\"s2\"> without permission.&nbsp;<\/span><span class=\"s1\">They exploit using<\/span>&nbsp;<strong>web shells \/ backdoor shells.<\/strong><\/p>\n<p>A backdoor shell is a piece of malicious code that can be uploaded onto a server&nbsp;<span class=\"s1\">allowing access to the server\u2019s file system.<\/span> Once uploaded, the attacker can execute any&nbsp;actions on the infected server. There are a variety of open source webshells available online. One of the best known is the WSO. You can get a quick look at&nbsp;it in the following <a href=\"http:\/\/pastebin.com\/iqNjQfRW\">pastebin<\/a>. Many webservers are running with root privileges.&nbsp;<span class=\"s1\">In these cases<\/span><span class=\"s2\">, t<\/span>he attacker then has captured the whole domain.<\/p>\n<p><strong>MIME TYPE VALIDATION<\/strong><\/p>\n<p class=\"p1\"><span class=\"s1\">What can we do to protect <\/span><span class=\"s2\">ourselves against <\/span><span class=\"s1\">these attacks? <\/span>One option is to validate the MIME type of the file:<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;?php \n   $valid_mime_types = array(\n        \"image\/gif\",\n        \"image\/png\",\n        \"image\/jpeg\",\n        \"image\/jpg\",\n    );\n    \n    if (in_array($_FILES[\"fileToUpload\"][\"type\"], $valid_mime_types)) {\n        moveFile($_FILES, $target_file);\n    }\n    else{\n        echo \"MIME Type not supported\";\n    }\n?&gt;<\/pre>\n<p>We create an array of allowable MIME types and compare these with the type that was uploaded. If the MIME types matches, a file is stored.<\/p>\n<p>Why is this not a good&nbsp;<span class=\"s1\">tactic<\/span>? The answer lies in the PHP documentation of global PHP file arrays:<strong> \u201cThis value is completely under the control of the client and not checked on the PHP side\u201d<\/strong>. An attacker could manipulate the MIME type. There are many extensions like <a href=\"https:\/\/addons.mozilla.org\/de\/firefox\/addon\/tamper-data\/\">Tamper Data<\/a> that can create fake MIME types. An implementation in PHP is available in my&nbsp;following <a href=\"https:\/\/gist.github.com\/tderleth\/c6899bb62f040329b91899127d50d0ae\">Gist<\/a>.<\/p>\n<p><strong>BLOCK DANGEROUS EXTENSIONS<\/strong><\/p>\n<p class=\"p1\"><span class=\"s1\">Which is the right solution?<\/span>&nbsp;Black lists of suspicious file extensions?<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;?php\n\n    $non_valid_file_extensions = array(\".php\", \".asp\");\n    $file_extension = strrchr($_FILES[\"fileToUpload\"][\"name\"], \".\");\n    \n    if (!in_array($file_extension, $non_valid_file_extensions)) {\n        moveFile($_FILES, $target_file);\n    }\n    else{\n        echo \"MIME Type not supported\";\n    }\n    \n?&gt;<\/pre>\n<p>Many webservers allow doubled File Extensions. Since the code only recognizes the last extension, an attacker can upload a file with a double extension (PHPINFO.php.123). The upload should work, but the execution does not work necessarily. However, there is a further bypass: <strong>.htaccess<\/strong><\/p>\n<p><strong>.htaccess<\/strong> is a configuration file where directory-based rules can be set up.<\/p>\n<p>An attacker first uploads malicious PHP code with the file extension .mp3 (phpinfo.mp3). He then uploads a .htaccess with the following content:<\/p>\n<pre class=\"prettyprint lang-tex\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">AddType application\/x-httpd-php .mp3<\/pre>\n<p>This line ensures that .mp3-files that are stored in the same directory as the .htaccess-file, are interpreted as PHP code.<\/p>\n<p><strong>VALIDATE IMAGE TYPE USING HEADER<\/strong><\/p>\n<p>Many developers use the function getimagesize to validate an image:<\/p>\n<pre class=\"prettyprint lang-php\" data-start-line=\"1\" data-visibility=\"visible\" data-highlight=\"\" data-caption=\"\">&lt;?php\n\n    $target_file = getcwd().\"\/uploads\/\".basename($_FILES[\"fileToUpload\"][\"name\"]);\n    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);\n    $check = getimagesize($_FILES[\"fileToUpload\"][\"tmp_name\"]);\n    if($check !== false) {\n        moveFile($_FILES, $target_file);\n    } else {\n        echo \"MIME Type not supported\";\n    }\n?&gt;<\/pre>\n<p>By calling this function the size of the image will be returned. If the image is not valid, the function returns the boolean false. Therefore, developers check whether a Boolean is set or not.<\/p>\n<p>When the attacker embeds simple PHP code in an image this function will return false. Even here, we can use&nbsp;a simple bypass: The image can be opened in an image editor such as GIMP or Photoshop, and the malicious code can be covert within meta information of the image. Thus the image still has valid header informations and the function will not return the boolean anymore.<\/p>\n<p><strong>CONCLUSION<\/strong><\/p>\n<p>As we have seen, there are many ways an attacker can bypass the security mechanisms of file uploads.&nbsp;<span class=\"s1\">A combination of several bypasses that were shown, <\/span><span class=\"s2\">are also conceivable<\/span><span class=\"s1\">.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">If<\/span><span class=\"s2\"> the attacker not only uploads a <\/span><code class=\"\" data-line=\"\">phpinfo()<\/code>-function<span class=\"s1\">,<\/span><span class=\"s2\"> but a whole webshell, he has shell access <\/span><span class=\"s1\">even <\/span><span class=\"s2\">to the whole system.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">At this point I <\/span><span class=\"s2\">would like to<\/span><span class=\"s1\"> to offer you some comments on how to protect yourself against these attacks. <\/span><span class=\"s2\">The best tactic is to set up basic security <\/span><span class=\"s1\">mechanisms<\/span><span class=\"s2\">:<\/span><\/p>\n<p><strong>1. to prevent the upload of malicious code:<\/strong><br \/>\n&#8211; Create a whitelist of valid MIME types. Never blacklist things.<br \/>\n&#8211; Check the file extension.<br \/>\n&#8211; Check for a real image.<\/p>\n<p><strong>2. to prevent the execution of malicious code:<br \/>\n<\/strong>&#8211; Generate a random filename, so the attacker can not find the URL to execute the script.<br \/>\n&#8211; Set up a .htaccess in the parent directory which only grants access to files with valid extension.<br \/>\n&#8211; Use the principle of least privilege for your webserver-user! Never run a webserver as root! This is the most important advice anyway!<br \/>\n&#8211; You could even think about uploading images to a dedicated storage where no compiler is installed.<\/p>\n<p><strong>WHAT IF I DO NOT PROGRAM BY MYSELF? WHAT ABOUT CMS?<\/strong><\/p>\n<p>If you do not write the web app yourself, but you rely on a content management system such as WordPress, Drupal or else, there are a lot of available tools online that indicate you file upload vulnerabilities. For WordPress you can use the Command Line Interface <a href=\"http:\/\/wpscan.org\/\">wpscan<\/a>.<\/p>\n<p><strong>Future Research<\/strong><\/p>\n<p>Many developers do not have a sense for security topics. So how can vulnerabilites of a system in terms of file uploads be avoided without a developer dealing with it? Can these problems be solved by a system administrator or even a service?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today we will discuss file upload vulnerabilities; a topic that is widely underestimated by developers. First, we will imagine a website in which it is possible to upload images with the format .jpg, .png, .gif and so on.&nbsp;If an application does not have proper form validation for file uploads, an attacker is able to gain [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[649,262,26,651],"tags":[],"ppma_author":[692],"class_list":["post-664","post","type-post","status-publish","format-standard","hentry","category-interactive-media","category-rich-media-systems","category-secure-systems","category-system-designs"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":10939,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/09\/11\/how-are-vulnerabilities-exploited-to-compromise-a-system\/","url_meta":{"origin":664,"position":0},"title":"How are vulnerabilities exploited to compromise a system?","author":"Joel Beiter","date":"11. September 2020","format":false,"excerpt":"This article is a recap of the \"Live Hack\" presentation, held in the lecture \"Sichere Systeme\" in SS 2020. It will introduce different vulnerabilities like XSS and SQL-Injection and shows how passwords can be cracked under certain circumstances. The last step explains how a SUID binary was exploited to gain\u2026","rel":"","context":"In &quot;Secure Systems&quot;","block_context":{"text":"Secure Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/secure-systems\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":20850,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/08\/30\/hafnium-exchange-server-attacks-what-happened-and-how-to-protect-yourself\/","url_meta":{"origin":664,"position":1},"title":"HAFNIUM EXCHANGE SERVER ATTACKS &#8211; What happened and how to protect yourself","author":"Jannik Smidt","date":"30. August 2021","format":false,"excerpt":"an article by Carina Szkudlarek, Niklas Schildhauer and Jannik Smidt This post is going to review the zero day exploit of the Microsoft Exchange Servers starting in January 2021.It will look into the methods of SSRF and the exploitation of mistakes in the deserialization of input values to procure privileged\u2026","rel":"","context":"In &quot;Secure Systems&quot;","block_context":{"text":"Secure Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/secure-systems\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/08\/5.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/08\/5.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/08\/5.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/08\/5.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":902,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/07\/22\/defense-in-depth-a-present-time-example\/","url_meta":{"origin":664,"position":2},"title":"Defense in Depth: a present time example","author":"Benjamin Binder","date":"22. July 2016","format":false,"excerpt":"In this post, we want to take a look on the concept of defense in depth. Therefore we are going to examine Chrome OS, the niche operation system for web users.","rel":"","context":"In &quot;Secure Systems&quot;","block_context":{"text":"Secure Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/secure-systems\/"},"img":{"alt_text":"Dark castle walls reaching in the sky","src":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg","width":350,"height":200,"srcset":"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg 1x, https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg 1.5x, https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg 2x, https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg 3x, https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/32\/Caernarfon_Castle_Walls.jpg 4x"},"classes":[]},{"id":28282,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/22\/building-a-cloud-native-web-application-for-case-based-file-sharing-on-aws\/","url_meta":{"origin":664,"position":3},"title":"Developing a cloud-native web application for case-based file sharing on AWS","author":"Philipp Treupel","date":"22. February 2026","format":false,"excerpt":"Motivation Professional file sharing is a significant challenge in sectors such as healthcare, insurance, and consulting. Practitioners routinely need to exchange sensitive documents with clients, yet existing solutions such as Google Drive and OneDrive can quickly become disorganized when managing multiple cases. Users struggle with scattered links, having to manually\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/user-journey-essencis-en.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":3084,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/09\/05\/cloud-security-part-2-the-vulnerabilities-and-threats-of-the-cloud-current-scientific-work-on-cloud-security-conclusion-and-outlook\/","url_meta":{"origin":664,"position":4},"title":"Cloud Security \u2013 Part 2: The vulnerabilities and threats of the cloud, current scientific work on cloud security, conclusion and outlook","author":"Andreas Fliehr","date":"5. September 2017","format":false,"excerpt":"The second of two blog posts about cloud security. This post covers the vulnerabilities and threats of the cloud, the current scientific work on cloud security and a conclusion and an outlook.","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Structure-of-Nexen.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Structure-of-Nexen.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/09\/Structure-of-Nexen.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":20309,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/08\/14\/unsafe-programming-languages\/","url_meta":{"origin":664,"position":5},"title":"Unsafe Languages, Inadequate Defense Mechanisms and Our Dangerous Addiction to Legacy Code","author":"Jan-Niklas Tille","date":"14. August 2021","format":false,"excerpt":"Over the last 20 years, developing secure software has become increasingly important. To this day, we write a significant amount of code in languages with manual memory management. However, the Peter Parker principle states that \u201cgreat power comes with great responsibility\u201d. Many scoring systems classify, enumerate and rank prevalence of\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":692,"user_id":12,"is_guest":0,"slug":"td036","display_name":"Thomas Derleth","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/96baa052482491040e7a411673fb99628fa7dab61246ae854471e24ad43feb81?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=664"}],"version-history":[{"count":16,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/664\/revisions"}],"predecessor-version":[{"id":24671,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/664\/revisions\/24671"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=664"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}