<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Sql-Injection on Eddie Mwangi | Security Research</title>
        <link>https://cybersecurity-portfolio-6pl.pages.dev/tags/sql-injection/</link>
        <description>Recent content in Sql-Injection on Eddie Mwangi | Security Research</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Mon, 22 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://cybersecurity-portfolio-6pl.pages.dev/tags/sql-injection/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>vAPI: Full OWASP API Top 10 Security Assessment</title>
        <link>https://cybersecurity-portfolio-6pl.pages.dev/posts/vapi/</link>
        <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
        
        <guid>https://cybersecurity-portfolio-6pl.pages.dev/posts/vapi/</guid>
        <description>&lt;h2 id=&#34;executive-summary&#34;&gt;Executive Summary
&lt;/h2&gt;&lt;p&gt;This document presents a technical security assessment of VAPI, a deliberately vulnerable API application designed to simulate the OWASP API Security Top 10 (2019). The assessment was conducted in a self-hosted lab environment with the objective of identifying, exploiting, and documenting each vulnerability class, as well as providing actionable remediation guidance for each.
Over the course of this assessment, all ten OWASP API vulnerability categories were successfully exploited, along with three additional Arena challenges covering JSON Web Token (JWT) manipulation, Server-Side Request Forgery (SSRF), and Cross-Site Scripting (XSS) injection. A total of thirteen distinct security findings were confirmed.
The findings range in severity from Critical to Low. The most severe vulnerabilities  Broken Object Level Authorization (API1), SQL Injection (API8), and Broken Authentication via credential stuffing (API2) represent attack vectors that, in a production environment, could result in full database compromise, complete account takeover, and mass unauthorized data disclosure. These three findings alone would constitute a critical risk posture for any organization operating an API with similar weaknesses.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;API Reference&lt;/th&gt;
          &lt;th&gt;Link&lt;/th&gt;
          &lt;th&gt;API vulnerability&lt;/th&gt;
          &lt;th&gt;Severity&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;API1&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API1&#34; &gt;API1&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Broken Object Level Authorization&lt;/td&gt;
          &lt;td&gt;Critical&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API2&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API2&#34; &gt;API2&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Broken Authentication&lt;/td&gt;
          &lt;td&gt;Critical&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API3&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API3&#34; &gt;API3&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Excessive Data Exposure&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API4&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API4&#34; &gt;API4&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Lack of Resources and Rate Limiting&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API5&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API5&#34; &gt;API5&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Broken Function Level Authorization&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API6&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API6&#34; &gt;API6&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Mass Assignment&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API7&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API7&#34; &gt;API7&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Security Misconfiguration&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API8&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API18&#34; &gt;API18&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Injection&lt;/td&gt;
          &lt;td&gt;Critical&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API9&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API9&#34; &gt;API9&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Improper Assets Management&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API10&lt;!-- raw HTML omitted --&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API10&#34; &gt;API10&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Insufficient Logging and Monitoring&lt;/td&gt;
          &lt;td&gt;Medium&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Arena- JWT&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#Just%20weak%20tokens%20%28JWT%29&#34; &gt;Just weak tokens (JWT)&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Just- Weak Tokens&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Arena - SSRF&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#ServerSurfer&#34; &gt;ServerSurfer&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Server-Side Forgery&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Arena - XSS&lt;/td&gt;
          &lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;Vapi.md#Sticky%20Notes&#34; &gt;Sticky Notes&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Cross-Site Scripting&lt;/td&gt;
          &lt;td&gt;High&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The assessment demonstrates that API security cannot be treated as an afterthought. Each vulnerability in this report represents a category of weakness consistently found in real-world production APIs. The remediation guidance provided for each finding reflects current industry best practice as defined by OWASP, NIST and established secure development standards.&lt;/p&gt;
&lt;h2 id=&#34;introduction-and-installation&#34;&gt;Introduction and Installation
&lt;/h2&gt;&lt;p&gt;This write-up focuses on  VAPI. It is a vulnerable adversely Programmed Interface which is a self-hostable API mimicking OWASP API Top 10 the 2019 version. It can  be found in  &lt;a class=&#34;link&#34; href=&#34;https://github.com/roottusk/vapi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/roottusk/vapi&lt;/a&gt; and the installation process since it will be self hosted:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/roottusk/vapi.git
cd &amp;lt;your-hosting-directory&amp;gt;
docker-compose up -d 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Setup.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Setup.png&#34;
	
	
&gt;When you open localhost:9000 on a browser you&amp;rsquo;ll get to see the VAPI documentation, showing a successful installation.
&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Vapi%20documentation.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Vapi documentation.png&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;setup&#34;&gt;Setup
&lt;/h3&gt;&lt;h4 id=&#34;postman&#34;&gt;Postman
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Since we will be working with APIs, we will use Postman since it is a good tool for building, testing, designing and managing APIs.&lt;/li&gt;
&lt;li&gt;Note that a collection and an environment has been copied to your device.&lt;/li&gt;
&lt;li&gt;Launch your postman and login/ sign up if you hadn&amp;rsquo;t and you&amp;rsquo;ll land on the postman dashboard.&lt;/li&gt;
&lt;li&gt;On the left there are 3 dots click on it and select the import button&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/importing.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;importing.png&#34;
	
	
&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/import2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;import2.png&#34;
	
	
&gt; Follow the steps as numbered in the image to import the collection and environment that are stored in postman. Note vapi is the name of my directory where vapi is hosted, so just change the name to the name of your directory&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522185213.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522185213.png&#34;
	
	
&gt; Import the 2.&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/import3.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;import3.png&#34;
	
	
&gt; Note a new collection is added and when you click on the collection part vapi (2) you&amp;rsquo;ll get to see a whole list of API and an environment. Go to the top right and set the environment to the new environment as shown in (4). The Vapi_env is important as it allows you to set variables on the whole collection as well as save authorization token allowing as to replay request&lt;/li&gt;
&lt;li&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522190843.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522190843.png&#34;
	
	
&gt; Currently only the host is set, however, I&amp;rsquo;d like you to change it so that we specify the port where the application is running on so it be &lt;strong&gt;localhost:9000&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;postman-and-burp&#34;&gt;Postman and Burp
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;This allows to traffic our request from postman to burp so we can see how the request and response looks like as it&amp;rsquo;s being sent and received.&lt;/li&gt;
&lt;li&gt;If you don&amp;rsquo;t need to proxy the traffic through burp you can skip this stage and go directly to Burp.&lt;a class=&#34;link&#34; href=&#34;Vapi.md#API1&#34; &gt;API1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We will have to proxy it so go to the settings then app settings and follow the following:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/postman%20settings.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;postman settings.png&#34;
	
	
&gt; On the settings page go to the proxy (2) and select use custom proxy (3) by default its off and set the following under proxy server as shown on (4,5,6). Note after you&amp;rsquo;ve finished working with postman you can now come and disable it&lt;/li&gt;
&lt;li&gt;The next step is to place burp certificate so that postman can trust the request:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Burp%20certificate.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Burp certificate.png&#34;
	
	
&gt; First we will need to export burp certificate, so open burp, go to settings(1), then to proxy (2) and follow the rest steps(3,4,5) ensure to choose the der format and name the certificate and save to a directory of your choice&lt;/li&gt;
&lt;li&gt;Now we will go to the postman and import the file we just exported it:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Postman%20certificate.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Postman certificate.png&#34;
	
	
&gt;Go back to postman settings and go to the certificates (2) and enable the CA certificates and choose the certificate we just exported and select it.&lt;/li&gt;
&lt;li&gt;Now we can confirm and see if the setup has succeded:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/burp-postman.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;burp-postman.png&#34;
	
	
&gt;Click on any request under the collections and just send the request just to see if the request goes and it is being channeled to burp and as we can see from above mine has succeeded.
We have now done all the configurations let&amp;rsquo;s now start working on them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;api1&#34;&gt;API1
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API1.png&#34;
	
	
&gt;Broken Object Level Authorization (BOLA) occurs where an Object (a user) is able to view other unauthorized user information by manipulating object identifiers such as id , Uid, name.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We will go to the first request and create a user &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/api1%20POST.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;api1 POST.png&#34;
	
	
&gt;In Postman, Click the Post request and go to the body and fill in the details as shown as in (3) and send the request. Note that an ID parameter is generated together with the details we submitted with.&lt;/li&gt;
&lt;li&gt;We can then see that the ID parameter is being used to get the information about the user specified in the second request as shown below:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API1%20GET.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API1 GET.png&#34;
	
	
&gt; Note the {{api_id}} is variable name and is set to the id parameter that was created, as can be seen on the burp side on the left side. The results we get is information about our user John.&lt;/li&gt;
&lt;li&gt;Since we see that the ID is being used to identify a user we can then try to manipulate by trying a different number to see if there is any measures to stop one seeing information about other users.&lt;/li&gt;
&lt;li&gt;Since we know the ID parameter is a number we can try and see if it auto increments or the id are generated by trying a number next to it that is 28 or 30 or any number&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/BOLA1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;BOLA1.png&#34;
	
	
&gt; As you can see by changing the ID parameter and placing other ID I can see other users information such as their name and course they are doing. This has serious implications as users information aren&amp;rsquo;t then confidential.&lt;/li&gt;
&lt;li&gt;We can use the capability of burp intruder to brute-force the ID parameter rather than manually changing the ID value. So send any of the requests that we have proxied and follow the following instructions:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API1%20intruder.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API1 intruder.png&#34;
	
	
&gt; Go to the intruder tab in burp and select attack type as in (1), Then Highlight where you want to bruteforce for our case it is the ID parameter so we highlight the value and after highlighting click on add so it looks something like (2,3). On the right side set the payload type to numbers as in (4) since we are dealing with numbers then set to sequential to iterate and set the range (5,6) and then start the attack.&lt;/li&gt;
&lt;li&gt;Once the attack is done you can go through the results and see other users.  One specific ID has a flag find it and note it. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API1%20Flagredacted.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API1 Flagredacted.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We can now go to the next Request which updates a user details we&amp;rsquo;ll try update ourselves first to get to understand how it works.&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522212212.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522212212.png&#34;
	
	
&gt;This works as expected since as a user i should be able to update my details with no issues.&lt;/li&gt;
&lt;li&gt;Then we will try update another user for this we will use ID 25&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API1%20ID25.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API1 ID25.png&#34;
	
	
&gt; The above shows the original account without any changes. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522213039.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522213039.png&#34;
	
	
&gt; After updating the body with different details one is able to update another user details information without their authorization. This is dangerous since the PUT method is used to update details and with so it can&amp;rsquo;t be reversed, this makes a legitimate user not access their account. This affects the Integrity and Availability of the account. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522213640.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522213640.png&#34;
	
	
&gt; We can see the details of the user has completely changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;**Severity: &lt;!-- raw HTML omitted --&gt;Critical&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;h4 id=&#34;impact&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Confidentiality is broken because any authenticated user can read any other user&amp;rsquo;s data.&lt;/li&gt;
&lt;li&gt;Integrity is broken because user records can be overwritten without authorization, and this action is irreversible given the destructive nature of PUT operations.&lt;/li&gt;
&lt;li&gt;Availability is broken because an attacker can lock legitimate users out of their own accounts by modifying their credentials.&lt;/li&gt;
&lt;li&gt;It has resulted to most significant data breaches as it requires no elevated privilege, no sophisticated tooling and no deep technical knowledge to exploit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Implement server-side authorization checks on every object-level request, verifying that the authenticated user owns or has explicit permission to access the requested resource.&lt;/li&gt;
&lt;li&gt;Hide the ID parameter or obfuscate it to reduce attack surface&lt;/li&gt;
&lt;li&gt;Replace sequential integer IDs with non-enumerable identifiers such as UUIDs.&lt;/li&gt;
&lt;li&gt;Apply the principle of least privilege to all API endpoints by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Broken Object Level Authorization is consistently ranked as the most prevalent and most damaging API vulnerability. It occurs when an API uses a predictable, user-controlled identifier such as a numeric ID  to retrieve or modify objects, without verifying that the requesting user has permission to access that specific object. In this assessment, the API1 endpoint accepted a numeric user ID parameter in both its GET and PUT requests. Upon creating a test account, the application returned an auto-incrementing integer ID. By systematically substituting this ID with adjacent integers using Burp Suite Intruder, it was possible to retrieve the full account details of every other user registered in the system. More critically, the PUT method accepted updates to any user record regardless of the authenticated user&amp;rsquo;s identity, allowing complete modification  and therefore takeover  of any account.&lt;/p&gt;
&lt;h3 id=&#34;api2&#34;&gt;API2
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2.png&#34;
	
	
&gt;
Authentication is the process of verifying the identity of a user. Broken authentication is where authentication controls implemented in a system can be bypassed through various ways. There are 2 ways for this, 1. lack of authentication mechanism or 2. Misimplementation of the authentication mechanisms.
There is a hint that has been given to us showing that there is a folder named Resources, we&amp;rsquo;ll navigate and look for it and see what it contains.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the terminal we will look at the contents of things in the Resources folder&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2%20resources.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2 resources.png&#34;
	
	
&gt; We note it seems to be a list of credentials probably usernames and passwords.&lt;/li&gt;
&lt;li&gt;Let&amp;rsquo;s see what it entails. It seems that one is required to enter an email and password as shown below, however to be authenticated one has to know the correct credentials.&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2%20Post.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2 Post.png&#34;
	
	
&gt; The 401 shows we have gotten the wrong credentials, we will have to guess the passwords. There are 2 ways to this either manually inputting each credential or brute-forcing it.&lt;/li&gt;
&lt;li&gt;Manually filling it will take time while brute-forcing also won&amp;rsquo;t work if there are any rate limiting or any other security measures are in place. We&amp;rsquo;ll try bruteforcing to rule out if its applicable or not.&lt;/li&gt;
&lt;li&gt;First we will need to separate the credentials.csv file to match email and password so that we can input it as a file.&lt;/li&gt;
&lt;li&gt;To separate the 2 we will use a cut command as shown below: &lt;code&gt;cut -d&#39;,&#39; -f1 creds.csv &amp;gt; ~/projects/writeups/Vapi/username.txt&lt;/code&gt;
&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2%20username.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2 username.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;And the same is done for the password part  &lt;code&gt;cut -d&#39;,&#39; -f2 creds.csv &amp;gt; ~/projects/writeups/Vapi/password.txt&lt;/code&gt; &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/password.txt.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;password.txt.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We will use burp to bruteforce the credentials for this you can also use ffuf  for this also&lt;/li&gt;
&lt;li&gt;Using burp, send the request to intruder &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260522232248.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260522232248.png&#34;
	
	
&gt; Highlight the email and then click (2), do the same for password, then select attack to pitchfork (3) then go to payload position and select payload type and load username.txt file and repeat for password (4,5,6) ensure payload encoding is disabled(7) then start attack(8).&lt;/li&gt;
&lt;li&gt;Once the attack is done, click the status code column and click it to see any difference with the codes. You&amp;rsquo;ll note there are 3 different status codes, showing we have a success. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2%20Redacted%20intruder.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2 Redacted intruder.png&#34;
	
	
&gt; Note i have hidden the payload2 Column so you can get the password.&lt;/li&gt;
&lt;li&gt;Another alternative is to use ffuf which is a web fuzzing tool if using burpsuite community which is heavily throttled. To use ffuf use this command on the terminal:  &lt;code&gt;ffuf -w username.txt:W1 -w password.txt:W2 -X POST -d &#39;{&amp;quot;email&amp;quot;:&amp;quot;W1&amp;quot;, &amp;quot;password&amp;quot;:&amp;quot;W2&amp;quot;}&#39; -u http://localhost:9000/vapi/api2/user/login -mode pitchfork -mc 200 &lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;the -w specifies the wordlist where W1 is for username.txt and w2 for password.txt. The username and passwords file are just the files we separated above in (5) and (6) respectively.&lt;/li&gt;
&lt;li&gt;The -X is used to specify the HTTP method to use for us its POST&lt;/li&gt;
&lt;li&gt;The -d is used to define the payload&lt;/li&gt;
&lt;li&gt;The -u is used to define the target URL&lt;/li&gt;
&lt;li&gt;The mode is used to specify the fuzzing mode  which for us is Pitchfork.&lt;/li&gt;
&lt;li&gt;The -mc Is used to only display responses that have status code 200 which we have specified.
The response is:
&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API2%20Ffuf%20redacted.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API2 Ffuf redacted.png&#34;
	
	
&gt; Similar to response from Burp I get 3 credentials, we can use all to try and see what each entails.
When you login you will get different token and one has a flag get it and store it / save it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**Severity: &lt;!-- raw HTML omitted --&gt;Critical&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;h4 id=&#34;impact-1&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Account takeover- An attacker is able to gain unauthorized access to an account of their choice since they have access to the credentials&lt;/li&gt;
&lt;li&gt;Resource overhaul and denial of service attack- A system can be brought down by excessive requests which the server can&amp;rsquo;t withstand making it not be accessible to legitimate  users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-1&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Implement rate limiting to all access endpoints. This will reduce the ability to bruteforce an account.&lt;/li&gt;
&lt;li&gt;Implement multi-factor authentication mechanism where not only one authentication is accepted but 2 or more.&lt;/li&gt;
&lt;li&gt;Implement account lockout preventing brute force on accounts after a defined number of failed attempts.&lt;/li&gt;
&lt;li&gt;Monitor for unusual authentication patterns using SIEM or other equivalent logging systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-1&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Authentication is the mechanism by which an API verifies that a user is who they claim to be. When this mechanism is absent, poorly implemented or unprotected against automated attacks, it becomes trivially bypassable. API2 covers both the complete absence of authentication and its misimplementation  in this case, the failure to implement any anti-brute-force protection on the login endpoint. The Resources folder provided with the lab contained a credential list in CSV format of leaked credentials from potentially a prior breach. Using the &lt;code&gt;cut&lt;/code&gt; command to separate usernames and passwords into individual wordlists, a credential stuffing attack was executed against the login endpoint using both Burp Suite Intruder (pitchfork mode) and ffuf. The absence of rate limiting, account lockout, or CAPTCHA meant the attack completed without interruption, successfully identifying three valid credential pairs from a list of one thousand entries in approximately one minute. Upon successful authentication, each valid session returned a unique token one of which contained a flag confirming privilege escalation. In a production context, this attack would grant an attacker the full session permissions of the compromised user, including access to all data and actions available to that account.&lt;/p&gt;
&lt;h3 id=&#34;api3&#34;&gt;API3
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3.png&#34;
	
	
&gt;
Excessive Data Exposure is where sensitive information is being returned to the user in the response and is visible on the web traffic by design. Sniffing the traffic an attacker can see thr sensitive data.
We are informed that there is an android app in the resource folder and it exposes excessive data.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Preriquisite for this is to have an android emulator such as android studio or genymotion where we will use virtual devices. There is also need to have knowledge of setting it up.
- For this I will be using genymotion as my choice of emulator
- Ensure the virtual android to be used is android 8 and above.
- Having setup the emulator and powering it up we can continue.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When we go to the resource folder we get an APK file: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20Resources.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 Resources.png&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Having known the path of the APK there are different ways to install the app,we can drag and drop the apk to install the app &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/AP13%20DRAG%20APK.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AP13 DRAG APK.png&#34;
	
	
&gt; Also we can use ADB to install it by using &lt;code&gt;adb install TheCommentApp.apk&lt;/code&gt; from where the APK is from as  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20ADB%20APK.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 ADB APK.png&#34;
	
	
&gt;                This both will lead to the same end of installing the APK as shown here by swiping up the homepage &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/AP13%20APPS.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;AP13 APPS.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We can now open the application where we are required to pick a base URL &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601193522.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601193522.png&#34;
	
	
&gt; However in the resources folder there is a readme file that tells us how to name the base url as shown: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601193831.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601193831.png&#34;
	
	
&gt; Therefore at the end of the baseurl add /vapi  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20BASE%20url%201.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 BASE url 1.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;Once we click the save button we are redirected to a login page, since we haven&amp;rsquo;t created an account we will register one by clicking the Create account: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20Login.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 Login.png&#34;
	
	
&gt; After successfully registering and logging in, we are directed to some comments. I had created 2 accounts for testing.&lt;/li&gt;
&lt;li&gt;When you open the get request containing the comments we get to see some information that can&amp;rsquo;t be seen on the app: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20Comments%20exposure.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 Comments exposure.png&#34;
	
	
&gt; When you look at the right hand side the only information being displayed is the comment and username however on the left we get to see deviceid, longitude and latitude. we also get to see a flag.&lt;/li&gt;
&lt;li&gt;We can add a comment to see how the app works: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20Comments.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 Comments&#34;
	
	
&gt; Ensure to allow the app permission to access location, write a comment and send it where a pop up message will be generated and in the emulator ensure that GPS is allowed as shown in (2)&lt;/li&gt;
&lt;li&gt;Once we allow the permissions, and send the comment we can look at the GET request where we see our comment is sent plus our latitude and longitude &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API3%20Comments%202.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API3 Comments 2.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/p&gt;
&lt;h4 id=&#34;impact-2&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Latitude and longitude data attached to user comments enables an attacker to map the physical locations from which users regularly post, constructing a detailed picture of a target&amp;rsquo;s daily movements and frequented locations.&lt;/li&gt;
&lt;li&gt;Device ID exposure enables device fingerprinting and tracking.&lt;/li&gt;
&lt;li&gt;Lawsuit since exposure of Personal identifiable information can lead to fines and lawsuits.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-2&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Apply a server-side response filter that returns only the fields explicitly required by the consuming application.&lt;/li&gt;
&lt;li&gt;Collect only the necessary information required by the application.&lt;/li&gt;
&lt;li&gt;Conduct regular API response audits to identify and remove unnecessary data exposure.&lt;/li&gt;
&lt;li&gt;Define a strict response schema for each endpoint and enforce it at the API layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-2&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Excessive Data Exposure occurs when an API returns more information in its response than is required by the client application, relying on the client to filter out sensitive fields before displaying them to the user. This is a fundamentally flawed design pattern because it assumes that the only consumer of the API is the intended front-end application  an assumption that any attacker with a proxy can immediately invalidate. This finding was demonstrated using a companion Android application (TheCommentApp.apk) deployed in  Genymotion, an android emulator and proxied through Burp Suite. The application&amp;rsquo;s User Interface displayed only two fields per comment: the comment text and the posting username. However, inspection of the underlying GET request response revealed that the API was returning four additional fields: a device ID, latitude, longitude, and a flag value. None of these fields were visible in the application interface, yet all were present in every API response.&lt;/p&gt;
&lt;h3 id=&#34;api4&#34;&gt;API4
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API4.png&#34;
	
	
&gt;
This is where multiple concurrent requests can be performed from a single device in a certain time-frame.
Based on the information there is no rate limiting so this is a chance for bruteforcing.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Initiate the OTP process by sending the number the OTP to be sent, I&amp;rsquo;ve gone for the default number but you can just change it. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4%20POST%20OTP.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API4 POST OTP.png&#34;
	
	
&gt; After sending the request an OTP is generated and we get an information such as it is a 4 digit.&lt;/li&gt;
&lt;li&gt;When we send a random OTP number to verify it we get to see how it responds: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4%20Verify%20OTP.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API4 Verify OTP.png&#34;
	
	
&gt; We get a status 403, and an invalid OTP message. We need to get the valid OTP to get a different status code and message.&lt;/li&gt;
&lt;li&gt;We can now bruteforce the OTP by sending the request to intruder and setting up the payloads in burp: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4%20OTP%20intruder.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API4 OTP intruder.png&#34;
	
	
&gt; Setting the OTP payload position, set the attack type(2), Setting the number range (3), placing for 4 digits since we know what OTP (4) and start the attack (5).&lt;/li&gt;
&lt;li&gt;After a successful bruteforce attack is completed we get a successful OTP and a status 200 ok &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4%20OTP%20Results.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;669&#34;
	
	
&gt; We get an OTP result. This is as seen in POSTMAN. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260524152114.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;669&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;When we go to the next request we get information about the user as well as a flag: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API4%20redacted%20flag.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API4 redacted flag.png&#34;
	
	
&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-3&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;It can lead to a denial of service (DOS) since it is overwhelmed by the requests.&lt;/li&gt;
&lt;li&gt;Legitimate and authenticated users can&amp;rsquo;t access the services hindering confidentiality.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-3&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Implement rate limiting on all authentication and verification endpoints.&lt;/li&gt;
&lt;li&gt;Limit a number of request a device can make in a specific duration of time.&lt;/li&gt;
&lt;li&gt;Implement a load balancer that distributes incoming traffic across multiple servers to avoid a single server to be overloaded.&lt;/li&gt;
&lt;li&gt;Implement account lockout or progressive delay after repeated failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-3&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Rate limiting governs how many requests a client can make to an API endpoint within a defined time window. Without it, an API is fully exposed to automated abuse including brute force attacks against authentication mechanisms, enumeration of identifiers, and resource exhaustion attacks that can deny service to legitimate users.The API4 endpoint presented a two-step OTP authentication flow. Initiating the process revealed that the OTP was a four-digit numeric code a search space of exactly 10,000 possible values. When a random incorrect OTP was submitted, the server responded with a 403 Forbidden status. Critically, there was no observable rate limiting, no lockout mechanism, and no expiry enforcement on the OTP. Using Burp Suite Intruder in Sniper mode with a sequential numeric payload from 0000 to 9999, the correct OTP was identified in under five minutes as the sole response returning a 200 OK status code.The follow-up GET request to retrieve user details, available once authenticated, returned both the user&amp;rsquo;s information and a flag, confirming complete authentication bypass.&lt;/p&gt;
&lt;h3 id=&#34;api5&#34;&gt;API5
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API5.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API5.png&#34;
	
	
&gt;  Broken Function Level Authorization is where an unauthorized user is able to perform functions that they are not allowed to don&amp;rsquo;t have the permissions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;For the first request we are going to create a user &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API5%20Post.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API5 Post.png&#34;
	
	
&gt; So a user has been created successfully.&lt;/li&gt;
&lt;li&gt;The second request is used to get information about the user that we have created as shown: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API5%20GET.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API5 GET.png&#34;
	
	
&gt; We can see that as a user the id is being used to identify the user.&lt;/li&gt;
&lt;li&gt;Look at the HTTP methods we can look at the OPTIONS to see which methods are allowed: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260524233414.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260524233414.png&#34;
	
	
&gt; Nothing much since only GET and HEAD are allowed so we can rule out using POST or PUT.&lt;/li&gt;
&lt;li&gt;We can try and work around the ID parameter by changing the values and see if there is a BOLA that we can work with. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260524234731.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260524234731.png&#34;
	
	
&gt; As we can see only the authorized ID give us a status 200. So with this we can&amp;rsquo;t rely on BOLA.&lt;/li&gt;
&lt;li&gt;We can try the other endpoint /user and try see if any success can be found by changing user to admin: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260524235925.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260524235925.png&#34;
	
	
&gt; No success since we get a status code 500 meaning the endpoint admin is non existent.&lt;/li&gt;
&lt;li&gt;we can try back endpoint user and try out various endpoints: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525000437.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525000437.png&#34;
	
	
&gt; By changing the endpoint to users, we get information about all users and get information on a flag as shown above.&lt;/li&gt;
&lt;li&gt;This however looks more of a BOLA since no function has been done.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-4&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Attacker can gain higher privilege access that can increase the severity of the attack.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-4&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Implementing least privilege access to all users by default. This will reduce the attack vector where a user is given the least amount permissions that are needed to do their work.&lt;/li&gt;
&lt;li&gt;Implement role-based access controls to resources where users are only allowed to interact with endpoints, resources that are needed to perform their hob functions.&lt;/li&gt;
&lt;li&gt;Deny all access by default and requiring explicit grants to specific roles to access every function.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-4&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;We were able to perform admin functions by listing all users in the system, however this feels more of BOLA since no specific function can be done after listing out the users.Broken Function Level Authorization differs from BOLA (API1) in its scope. While BOLA concerns unauthorized access to specific objects , Broken Function Level Authorization concerns unauthorized access to entire API functions particularly administrative functions that should be restricted to privileged roles. The API5 endpoint presented a standard user registration and retrieval flow. After creating a test user and confirming normal GET access using the assigned ID, attention was directed toward the endpoint structure itself. By modifying the endpoint path from &lt;code&gt;/user/{id}&lt;/code&gt; to &lt;code&gt;/users&lt;/code&gt;  a small but significant alteration  the API returned a complete listing of all registered users in the system, including an administrative account with a flag embedded in its address field. This exposure was possible because the application failed to apply any authorization check to the &lt;code&gt;/users&lt;/code&gt; endpoint, allowing any authenticated user to invoke what was effectively an administrative function.&lt;/p&gt;
&lt;h3 id=&#34;api6&#34;&gt;API6
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API6.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API6.png&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Mass assignment is where a user can manipulate the object parameters by giving out values of the properties from user input.
We get a hint on the credit management so we can target it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When we create a user we note that a new parameter id is generated no much on the credit parameter as seen: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API6%20POST.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API6 POST.png&#34;
	
	
&gt; Nothing much here&lt;/li&gt;
&lt;li&gt;on the second request we get to see the credit parameter: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API6%20GET.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API6 GET.png&#34;
	
	
&gt; We get to see the Credit is set to 0&lt;/li&gt;
&lt;li&gt;So in the previous POST request we can add the credits parameter in our body and set an amount for ourselves:  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API6%20POST2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API6 POST2.png&#34;
	
	
&gt; Add a new parameter credit and set an amount of your choice, note to place a comma before the new entry also place all into a double quotes &amp;quot;&amp;quot;&lt;/li&gt;
&lt;li&gt;We can now go and see if it was a success on the Get request: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API6%20GET2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API6 GET2.png&#34;
	
	
&gt; As we can see it was a success as the credit amount we had set is a success.&lt;/li&gt;
&lt;li&gt;We were able to manipulate the credit property by setting an amount for our self in the credit parameter.
&lt;strong&gt;Severity&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-5&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;It can lead to privilege escalation by changing functions from a normal user to an admin user.&lt;/li&gt;
&lt;li&gt;It tampers with the data as it is easy to change by giving user input values.&lt;/li&gt;
&lt;li&gt;Fraudulent purchases in an e-commerce context with no financial cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-5&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Whitelist only parameters that should be updated by client and blacklist the rest&lt;/li&gt;
&lt;li&gt;Use Data Transfer Objects (DTOs) or equivalent schema validation to define the exact shape of acceptable input for each endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-5&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Mass Assignment occurs when an API automatically binds user-supplied input to internal object properties without restricting which properties the user is permitted to modify. This vulnerability is particularly insidious because it often exists not due to an explicit error in the code, but due to the convenience of frameworks that automatically map request body parameters to data model attributes. The API6 endpoint simulated a retail store credit system. Upon creating a user account, a GET request to retrieve user details revealed a &lt;code&gt;credit&lt;/code&gt; field set to zero  a field that had not appeared in the original registration response and was clearly intended to be managed server-side. By re-submitting the POST registration request with an additional &lt;code&gt;credit&lt;/code&gt; parameter manually inserted into the request body and set to an arbitrary value, the application accepted the input without validation and persisted the attacker defined credit balance. A subsequent GET request confirmed the manipulation had succeeded.&lt;/p&gt;
&lt;h3 id=&#34;api7&#34;&gt;API7
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7.png&#34;
	
	
&gt;
It is commonly when the configurations in place are done poorly leaving room to expose vulnerabilities. An API is vulnerable to security misconfiguration if a cross-origin resource sharing (CORS) policy is missing or misconfigured.
Cross origin requests is a rule that blocks front end from making requests to a different origin unless that origin is explicitly allowed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;We will create a user using the first Post request. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7%20Post.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7 Post.png&#34;
	
	
&gt; A successful user is created.&lt;/li&gt;
&lt;li&gt;In the second request, there is a user login request &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7%20Login.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7 Login.png&#34;
	
	
&gt; It doesn&amp;rsquo;t take any parameters but logs you in.&lt;/li&gt;
&lt;li&gt;In the next request it fetches an authentication key: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7%20Key.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7 Key.png&#34;
	
	
&gt; However we get a valuable information on the HTTP headers where it allows any origin to access this request as well as credentialed cross origin requests.&lt;/li&gt;
&lt;li&gt;With that information we can make a request and add an origin header by sending the request to repeater on burp as: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7%20Key%20Flag.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7 Key Flag.png&#34;
	
	
&gt; When we add the origin header, we get a flag as the origin is accepted. note the value can be anything since it is accepting all, due to the * sign which means all.&lt;/li&gt;
&lt;li&gt;The last request just logs out a user: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API7%20Logout.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API7 Logout.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-6&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;It enables malicious websites to make authenticated API calls on behalf of any logged-in user who visits the attacker&amp;rsquo;s page, effectively turning the browser into an unwitting attack proxy&lt;/li&gt;
&lt;li&gt;It can expose sensitive user data&lt;/li&gt;
&lt;li&gt;It can lead to a full server  compromise&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-6&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Proper configuration of cross origin requests by properly specifying the origin header&lt;/li&gt;
&lt;li&gt;Should only allow trusted sites&lt;/li&gt;
&lt;li&gt;Avoid using wildcards as it can be accessed by external domains.&lt;/li&gt;
&lt;li&gt;Apply CORS policy validation as part of the deployment pipeline to prevent misconfiguration from reaching production.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-6&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Security misconfiguration represents a broad category of vulnerabilities arising not from flaws in application logic but from incorrect or missing security controls at the configuration level. One of the most common and consequential manifestations in APIs is the misconfiguration of Cross-Origin Resource Sharing (CORS) policy. CORS is a browser enforced mechanism that controls which external origins are permitted to make credentialed requests to an API. When properly configured, it restricts API access to trusted domains. When misconfigured particularly when the &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header is set to a wildcard value of &lt;code&gt;*&lt;/code&gt; in combination with &lt;code&gt;Access-Control-Allow-Credentials: true&lt;/code&gt; the protection is entirely nullified. Inspection of the API7 response headers after fetching the authentication key endpoint revealed exactly this misconfiguration. The server was accepting requests from any origin and allowing credentialed cross-origin requests. By forwarding the request to Burp Repeater and adding an arbitrary &lt;code&gt;Origin: http://attacker.com&lt;/code&gt; header, the server reflected the attacker supplied origin in its response and returned a flag embedded in the authentication key response confirming that any external domain could make credentialed requests to this API.&lt;/p&gt;
&lt;h3 id=&#34;api8&#34;&gt;API8
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API8.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;697&#34;
	
	
&gt; The API seem to be vulnerable to an injection. An injection attack is where malicious user input is used by the system and is taken as a command, query, interpreter.
Injection include: SQLI, NOSQL, XSS, OS Commands.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the first request we will enter any credential and see how the API behaves when the credentials are wrong.  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API8%20POST1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API8 POST1.png&#34;
	
	
&gt; As we can see it requires to know the correct credentials.&lt;/li&gt;
&lt;li&gt;We will now try out some injection payloads to try and see how the API behaves: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API8%20Injection1.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API8 Injection1.png&#34;
	
	
&gt; By adding &amp;rsquo; on username we get a verbose error message that tells us this is a SQL database so we can test with SQLI payloads.&lt;/li&gt;
&lt;li&gt;Trying out some manual payloads we get some errors and status code 500, as shown: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525140039.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525140039.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We will have to use a tool called SQLMAP which is great for SQL injection &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525141115.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525141115.png&#34;
	
	
&gt; You can use the -h to familiarize yourself with the flags being used.&lt;/li&gt;
&lt;li&gt;We will have to specify the target URL ,  the data and the parameter we are planning to target as shown below: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525142947.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525142947.png&#34;
	
	
&gt; &lt;code&gt;sqlmap -u &amp;quot;http://localhost:9000/vapi/api8/user/login&amp;quot; --data=&amp;quot;username=john&amp;amp;password=Test&amp;quot; -p username --dbs --proxy=&amp;quot;http://127.0.0.1:8080&amp;quot; &lt;/code&gt;  The above command gives a list of database present by the use of the -dbs flag. The proxy is used to proxy this through Burp to help understand what is being sent&lt;/li&gt;
&lt;li&gt;Since we know the name of an interesting table we will then view its contents. Looking at the SQLMAP help we can see that the flag for listing columns in a table is &lt;strong&gt;&amp;ndash;columns&lt;/strong&gt; and specify the database using this command sqlmap -u &amp;ldquo;http://localhost:9000/vapi/api8/user/login&amp;rdquo; &amp;ndash;data=&amp;ldquo;username=john&amp;amp;password=Test&amp;rdquo; -p username &amp;ndash;dbs &amp;ndash;proxy=&amp;ldquo;http://127.0.0.1:8080&amp;rdquo; -D vapi &amp;ndash;columns : &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525144107.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525144107.png&#34;
	
	
&gt; We can see there are various columns  and one that interest us is the a_p_i8_users as it matches with the current API we are working on.&lt;/li&gt;
&lt;li&gt;We can see that column and what it contains by just scrolling to that column: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525145528.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525145528.png&#34;
	
	
&gt; we can see there are columns like username and password that are needed to login.&lt;/li&gt;
&lt;li&gt;We can try to output the contents of the column by specifying the columcs we want to enumerate and the flag for this is  -C and dump the contents using &amp;ndash;dump &lt;code&gt;sqlmap -u &amp;quot;http://localhost:9000/vapi/api8/user/login&amp;quot; --data=&amp;quot;username=john&amp;amp;password=Test&amp;quot; -p username --dbs --proxy=&amp;quot;http://127.0.0.1:8080&amp;quot; -D vapi -T a_p_i8_users -C password,secret,username --dump&lt;/code&gt;   :&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525150510.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525150510.png&#34;
	
	
&gt; We can see we get a username and password that we can now use in the POST request as our credentials.&lt;/li&gt;
&lt;li&gt;Using the credentials we found we get a successful login: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API8%20POST%20200.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API8 POST 200.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;The next request gives us the same flag that we got in the sqlmap results.&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API8%20GET.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API8 GET.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We have been able to use SQLI to be able to retrieve information from the database, the username and password.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Severity:&lt;/strong&gt; Critical&lt;/p&gt;
&lt;h4 id=&#34;impact-7&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Data manipulation, deletion or retrieval from database. This leads to loss of confidentiality, Integrity and Availability of the data.&lt;/li&gt;
&lt;li&gt;It may also lead to Denial of Service(DoS), or complete host takeover.&lt;/li&gt;
&lt;li&gt;Information disclosure by getting information stored in the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-7&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Use parameterized queries or prepared statements for all database interactions&lt;/li&gt;
&lt;li&gt;Special characters should be escaped using specific syntax.&lt;/li&gt;
&lt;li&gt;Suppress verbose error message by returning generic error responses rather than specific error messages.&lt;/li&gt;
&lt;li&gt;Apply  the principle of least privilege to the database user account used by application.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-7&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;We were able to perform a successful SQL injection using SQLMAP to get the flag that was stored on the database. We could list all the tables and the content in the database and view it. This included sensitive information such as password that were stored by the application. This would be safeguarded by implementing input sanitization where input is validated before it is implemented.&lt;/p&gt;
&lt;p&gt;Injection vulnerabilities occur when user supplied input is incorporated into a query, command, or interpreter without adequate sanitization allowing the input to be interpreted as code rather than data. SQL injection remains one of the most documented and consequential vulnerability classes in application security, and its presence in an API is no less severe than in a traditional web application. The API8 login endpoint provided no credentials and challenged the tester to authenticate. Submitting a single apostrophe character in the username field produced a verbose MySQL error message, confirming that user input was being directly interpolated into a SQL query and that error output was being returned to the client a compounding issue that substantially assists an attacker in crafting effective payloads. SQLMap was used to automate exploitation. An initial scan enumerated all available databases, identifying the &lt;code&gt;vapi&lt;/code&gt; database as the target of interest. A subsequent column enumeration query against the &lt;code&gt;vapi&lt;/code&gt; database identified the &lt;code&gt;a_p_i8_users&lt;/code&gt; table, which contained &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, and &lt;code&gt;secret&lt;/code&gt; columns. Dumping the table contents returned a single administrative credential set in plaintext, along with a flag value stored in the &lt;code&gt;secret&lt;/code&gt; column. Using these credentials to authenticate via the standard login endpoint produced a successful session.&lt;/p&gt;
&lt;h3 id=&#34;api9&#34;&gt;API9
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API9.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API9.png&#34;
	
	
&gt; This involves looking for old API that aren&amp;rsquo;t retired or unpatched. The current version may have robust security mechanisms however, previous versions and are online act as an easy gateway since security measures aren&amp;rsquo;t updated when others are being implemented&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When we run the first request we get to see the version being used is a v2 also some information in the header: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API9%20POST%20V2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API9 POST V2.png&#34;
	
	
&gt; Their is a X-RateLimit which shows their is a rate limit and after sending a request we get a reduction of the one&amp;rsquo;s remaining.&lt;/li&gt;
&lt;li&gt;However, when we change the version to v1 the ratelimit isn&amp;rsquo;t implemented as shown here: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API9%20POST2.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API9 POST2.png&#34;
	
	
&gt; We saw that their is no rate limit so we can bruteforce it.&lt;/li&gt;
&lt;li&gt;We can send the request to intruder and set up the payloads. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525224252.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525224252.png&#34;
	
	
&gt; Change the version to v1 and set the payload as in (2), and place the payload in numbers and number range as in (3,4,5) and start the attack.&lt;/li&gt;
&lt;li&gt;After a successful attack, the results we get a different length showing there is a difference showing a successful attack: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API9%20Results.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API9 Results.png&#34;
	
	
&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-8&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Attackers may gain access to sensitive information]&lt;/li&gt;
&lt;li&gt;Easy attack vector for attackers to takeover the server through use of old or unpatched versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-8&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Having an up-to date inventory of all assets that are owned or used by the organization.&lt;/li&gt;
&lt;li&gt;Well documentation of all assets/ api being used and the requests and responses by each&lt;/li&gt;
&lt;li&gt;Updating all versions when doing updates and upgrades.&lt;/li&gt;
&lt;li&gt;Retiring old or unused assets by taking them offline and refusing any connections made to them.&lt;/li&gt;
&lt;li&gt;Establish a formal API lifecycle policy that defines when versions are deprecated and retired.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-8&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Improper Assets Management describes the risk that arises when organizations fail to maintain an accurate, current inventory of their API surface. As APIs evolve, new versions are released and old versions are deprecated  but deprecation in policy does not always mean retirement in practice. Legacy API versions that remain accessible often lack the security controls implemented in their successors, creating a lower resistance attack path that bypasses the protections an organization believes are in place. The API9 endpoint operated on version v2, which correctly implemented an &lt;code&gt;X-RateLimit&lt;/code&gt; header limiting authentication attempts per session. By inspecting the response headers and noting the version path in the URL, the assessment tested whether the previous version v1 remained accessible. It did. More significantly, the v1 endpoint returned responses with no rate limit headers at all, confirming that the rate limiting control had been implemented in v2 but never retrofitted to the older version. Using Burp Suite Intruder against the v1 endpoint with a sequential four-digit numeric payload targeting the PIN field, the correct PIN was identified within the full 0000–9999 search space. The authenticated response returned the user&amp;rsquo;s account balance along with a flag data that the v2 rate limit was specifically designed to protect.&lt;/p&gt;
&lt;h3 id=&#34;api10&#34;&gt;API10
&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/API10.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;API10.png&#34;
	
	
&gt;&lt;br&gt;
This is where attacker take advantage of lack of logging and monitoring to abuse systems and go unnoticed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This is much easier since we get sent the flag by just sending the request: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260525232035.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260525232035.png&#34;
	
	
&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; Medium&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-9&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;With no visibility an attacker has unlimited time to fully compromise a system&lt;/li&gt;
&lt;li&gt;Won&amp;rsquo;t know the point of compromise, the extent of access and duration of the compromise the attacker uses so hard to fix it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-9&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Log all failed authentication mechanism, denied access.&lt;/li&gt;
&lt;li&gt;Logs should include enough details that can be used to identify an attacker such as timestamps, source IP, endpoint accessed, request size.&lt;/li&gt;
&lt;li&gt;Configure a monitoring system to continuously monitor the systems&lt;/li&gt;
&lt;li&gt;Implement a Security Information and Event Management system(SIEM) to manage all logs being generated and can raise alerts based on the rules set.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-9&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Insufficient logging and monitoring is unique among the OWASP API Top 10 in that it is not a vulnerability that enables direct exploitation  rather, it is the absence of the defensive capability that would detect and limit the impact of every other vulnerability on this list. An attacker who has exploited any of the preceding findings in a system with adequate logging would trigger alerts, generate audit trails, and potentially initiate an incident response. In a system without logging, that same attacker operates in complete darkness, with unlimited time and no detection risk. The API10 endpoint demonstrated this condition directly: sending a simple GET request to the flag endpoint returned a response that explicitly acknowledged the absence of logging the flag was delivered freely, with a message confirming that no requests had been recorded.&lt;/p&gt;
&lt;h3 id=&#34;arena&#34;&gt;Arena
&lt;/h3&gt;&lt;h3 id=&#34;just-weak-tokens-jwt&#34;&gt;Just weak tokens (JWT)
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the post request when we create a user as shown below a token is generated for us: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20POST%20request.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT POST request.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;In the second request when we send it we are authenticated as that user we created showing the token is being used to authenticate: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20GET%20user.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT GET user.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;A good thing to note the token is a jwt token as it can be seen by the first 3 letters the eyj also by the heading of the folder.&lt;/li&gt;
&lt;li&gt;We will use a tool called jwt_tool which is good for jwt tokens testing. We will need to know what the token consists of by: &lt;code&gt;jwt_tool &amp;quot;authorization token&amp;quot;&lt;/code&gt; &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20token.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT token.png&#34;
	
	
&gt; Few things to note here: the algorithm being used here is HS256, the role assigned to us is a user and the token expires by 30 minutes.&lt;/li&gt;
&lt;li&gt;We will now try and remove the algorithm by &lt;code&gt;jwt_tool &amp;quot;token&amp;quot; -X a&lt;/code&gt; : &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260527120406.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260527120406.png&#34;
	
	
&gt; The above removes the algorithm , so copy any of the generated JWT tokens but ensure to copy till the .&lt;/li&gt;
&lt;li&gt;The above can be proved by:  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260527121245.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260527121245.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We will now try to edit the contents / tamper with the JWT  by changing the role from a user to an admin, note we will be using the JWT we generated above that has no algorithm by using &lt;code&gt;jwt_tool &amp;quot;JWT&amp;quot; -T&lt;/code&gt;: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20Tamper.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT Tamper.png&#34;
	
	
&gt; Ensure to use the JWT with the . at the end, also change the role to admin as shown in (2) and copy the token that is generated as shown in (3)&lt;/li&gt;
&lt;li&gt;Go back to burp and send the request with the JWT that is provided to us from the beginning without changing anything: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20Burp.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT Burp.png&#34;
	
	
&gt; Note how the API responds as shown above.&lt;/li&gt;
&lt;li&gt;However, going back and sending this request to repeater and change the authorization token to what we generated in 7 we get to see this:  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20Burp%20tamper.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;669&#34;
	
	
&gt; This can also be achieved in postman by changing the value of the Authorization-Token to the one was  tampered with &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/JWT%20POSTMAN.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;JWT POSTMAN.png&#34;
	
	
&gt; Go to headers as in (1), go to the authorization-token header and change the value to the one we generated (3) and send the request , where we will get the flag (5).
&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-10&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Privilege escalation by creating valid tokens&lt;/li&gt;
&lt;li&gt;Impersonation of other users&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-10&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Performing and implementing a robust signature verification of any JWTs&lt;/li&gt;
&lt;li&gt;Enforce the signing algorithm on the server side.&lt;/li&gt;
&lt;li&gt;Never allowing JWT that are have no algorithm.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-10&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;JSON Web Tokens are a widely adopted mechanism for stateless API authentication. A JWT consists of three base64-encoded segments  a header declaring the algorithm, a payload containing claims, and a signature verifying integrity. The security of the entire mechanism depends on the server validating the signature using the expected algorithm and a secret key. If either the algorithm check or the signature verification is bypassed, the token can be forged. The Arena JWT challenge exposed two weaknesses simultaneously. First, the token&amp;rsquo;s role claim was set to &lt;code&gt;user&lt;/code&gt; a field that controls authorization level and should be server-authoritative. Second, the server accepted tokens using the &lt;code&gt;none&lt;/code&gt; algorithm  a value that explicitly signals the absence of a cryptographic signature. This is a known vulnerability in JWT implementations that trust the algorithm specified in the token&amp;rsquo;s own header rather than enforcing a server-configured algorithm.
Using jwt_tool, the original token was first analyzed to confirm the algorithm (HS256), role (user), and expiry (30 minutes). The &lt;code&gt;-X a&lt;/code&gt; flag was then used to generate algorithm-stripped variants with &lt;code&gt;alg: none&lt;/code&gt;. The tamper flag (&lt;code&gt;-T&lt;/code&gt;) was used to modify the role claim from &lt;code&gt;user&lt;/code&gt; to &lt;code&gt;admin&lt;/code&gt;. When the modified token was submitted in the Authorization-Token header, the server accepted it and returned a flag  confirming that it had trusted the token&amp;rsquo;s self-declared algorithm and role without independent verification.&lt;/p&gt;
&lt;h3 id=&#34;serversurfer&#34;&gt;ServerSurfer
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the GET request a specific URL is being requested to and we get an encoded data as shown here:  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260527144948.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260527144948.png&#34;
	
	
&gt; We get a random string as the data results output and when I highlight it we see that it has been encoded and when you click the Inspector you can actually see the context of the content.&lt;/li&gt;
&lt;li&gt;We will send a request to a server that we can control and see the contents, so we will use webhook.site for this: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Webhook.site.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Webhook.site.png&#34;
	
	
&gt; We will also add content of what is to be displayed when someone interacts with the server. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/webhook.site%20content.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;webhook.site content.png&#34;
	
	
&gt; You can copy the unique url and replace it to our url and send the request&lt;/li&gt;
&lt;li&gt;When you send the request we get to see the message that we initially set above when decoded &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260527151819.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260527151819.png&#34;
	
	
&gt; After we decode we get to see information about the content we added&lt;/li&gt;
&lt;li&gt;Looking at the homepage of the webhooksite, we get to see that after every target to the server it logs the details of the request as shown below:  &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260527153702.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260527153702.png&#34;
	
	
&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;remediation-11&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Validate and sanitize all user supplied URLs before use.&lt;/li&gt;
&lt;li&gt;Implementing an allow list of permitted domains and reject the rest.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-11&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Server-Side Request Forgery is a vulnerability that allows an attacker to induce the server to make HTTP requests to an attacker specified destination. This is particularly dangerous in cloud environments, where the server&amp;rsquo;s internal network may include metadata services (such as AWS  at 169.254.169.254) that expose instance credentials and configuration data to any process that can reach them from within the cloud network. The ServerSurfer endpoint accepted a &lt;code&gt;url&lt;/code&gt; parameter in its GET request, which the server used to fetch and return the content of the specified URL. Substituting the default roottusk.com value with a webhook.site URL  a service that captures and logs incoming HTTP requests  the server dutifully fetched the attacker-controlled page and returned its content. The webhook.site dashboard logged the server&amp;rsquo;s IP address, request headers, and request metadata, confirming the SSRF was active and that the server was making outbound requests using its own network identity. By configuring the webhook response to include custom content, the server reflected that content in its API response  demonstrating that the vulnerability enables both outbound SSRF (the server fetching attacker content) and response reflection.&lt;/p&gt;
&lt;h3 id=&#34;sticky-notes&#34;&gt;Sticky Notes
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;In the sticky notes the POST request; &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601151938.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601151938.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;On the second request we get the information we just posted in the previous request as seen here: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601153821.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601153821.png&#34;
	
	
&gt; We can see that one is able to change the format of how the details can be displayed as by changing as seen in the highlighted part.&lt;/li&gt;
&lt;li&gt;We will try and see if there is a stored cross site scripting(xss) by placing an alert message that is reflected once a user interacts with the page. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601154357.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601154357.png&#34;
	
	
&gt; Note that there is need for this \ since it bypasses the safeguard in place since when you don&amp;rsquo;t place them we get a 500 status error code. &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601154642.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601154642.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;When you get that request, we get to have a flag as well as an alert message: &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601160319.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601160319.png&#34;
	
	
&gt;&lt;/li&gt;
&lt;li&gt;We can confirm if the XSS was successful by opening our response in our browser: On the request right click and you&amp;rsquo;ll see an option of open response in browser and click it which will lead you to this &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601161033.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601161033.png&#34;
	
	
&gt; Click it and copy the URL and open it in any choice of your browser, preferably where the proxy is set up in.&lt;/li&gt;
&lt;li&gt;Once you open the response we get, &lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601161355.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601161355.png&#34;
	
	
&gt; This shows that our XSS was successful. Click the OK button which will lead us to the flag message.&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601161549.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601161549.png&#34;
	
	
&gt; Once we reload the page the alert message pops up again:&lt;img src=&#34;https://cybersecurity-portfolio-6pl.pages.dev/static/images/Pasted%20image%2020260601161657.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Pasted image 20260601161657.png&#34;
	
	
&gt; This shows the script is being run every time a user interacts with the page.
&lt;strong&gt;Severity:&lt;/strong&gt; High&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;impact-11&#34;&gt;Impact
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;This would enable session hijacking, credential theft via phishing overlays, keylogging, and forced redirection to malicious domains.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;remediation-12&#34;&gt;Remediation
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Sanitize all user supplied input before storage.&lt;/li&gt;
&lt;li&gt;Implement a strong Content Security Policy header that restricts script execution to trusted sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;summary-12&#34;&gt;Summary
&lt;/h4&gt;&lt;p&gt;Cross-Site Scripting is an injection vulnerability in which an attacker causes a victim&amp;rsquo;s browser to execute attacker supplied JavaScript. In its stored variant  the most severe form the malicious payload is persisted in the application&amp;rsquo;s database and executed for every user who subsequently views the affected content, without any interaction beyond loading the page. The Sticky Notes endpoint accepted notes via POST and offered multiple output formats via a &lt;code&gt;format&lt;/code&gt; query parameter (JSON, XML, HTML). When the HTML format was requested, the API returned raw HTML to the browser without sanitizing the stored content. By submitting a note containing a JavaScript alert payload using escape characters to bypass a naive input filter that rejected unescaped script tags the payload was accepted and stored. A subsequent GET request with &lt;code&gt;format=html&lt;/code&gt; returned the stored XSS payload in an HTML response. Opening this response in a proxied browser triggered an alert dialog, confirming successful JavaScript execution. The XML format response additionally revealed a flag in a &lt;code&gt;&amp;lt;flag&amp;gt;&lt;/code&gt; element, confirming the intended finding.
The persistence of the payload was confirmed by reloading the page the alert fired on every page load, demonstrating that the script would execute for every user who viewed the notes, not only the attacker.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h3&gt;&lt;p&gt;This assessment demonstrates in practical terms what OWASP has documented as statistical reality: API security vulnerabilities are widespread, consistently exploited, and entirely preventable. Every finding in this report was confirmed through systematic, methodical testing using tools and techniques that are freely available and well documented. None of the exploits required novel research or advanced capability they required only an understanding of how APIs work and what can go wrong when they are built without security as a design principle.
Several observations stand out from this assessment as lessons beyond the technical findings themselves.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Defense in depth is non-negotiable.&lt;/strong&gt; Multiple findings in this report were exploitable precisely because a single missing control  rate limiting, output encoding, authorization checking was the only thing standing between an attacker and a successful compromise. Real-world APIs require layered controls, where the failure of any one mechanism is caught by another.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication is not authorization.&lt;/strong&gt; The distinction between API1, API2, and API5 makes this concrete. Knowing who a user is (authentication) does not determine what they are permitted to do (authorization). Many of the most impactful findings in this report involved authenticated users accessing data and functions they had no business accessing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Old assets are attack surface.&lt;/strong&gt; API9 demonstrated that an organization&amp;rsquo;s effective security posture is determined not by its best-secured endpoint but by its least-secured one. Legacy versions, forgotten endpoints, and undocumented routes are consistently among the most productive targets in real engagements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logging is a security control, not an operational nicety.&lt;/strong&gt; API10 is often underweighted in severity assessments because it does not enable direct exploitation. This is the wrong frame. In every confirmed breach in this report, adequate logging would have generated an alert. The absence of logging converts every other vulnerability from a recoverable incident into a silent, sustained compromise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The OWASP API Top 10 is a baseline, not a ceiling.&lt;/strong&gt; The vulnerabilities documented in this report represent the most common, well-understood categories of API weakness. Real-world APIs present combinations of these vulnerabilities alongside application-specific logic flaws, infrastructure misconfigurations, and third-party integration risks that extend well beyond any standardized list.
The discipline required to produce secure APIs threat modeling, secure design, input validation, access control, logging, and ongoing testing  is not separate from the discipline required to build good software. It is the same discipline, applied with security as an explicit and non-negotiable requirement from the first line of code to the final deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This report represents a complete traversal of the OWASP API Top 10 (2019) attack surface. The skills and methodologies demonstrated here  proxy-based traffic analysis, credential stuffing, brute force via Intruder and ffuf, SQL injection automation, JWT manipulation, SSRF exploitation, and XSS injection form the core technical vocabulary of API penetration testing.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
