@@ -1691,6 +1691,143 @@ def check(self, module_test, events):
16911691 assert padding_oracle_detected , "Padding oracle vulnerability was not detected"
16921692
16931693
1694+ class Test_Lightfuzz_PaddingOracleDetection_Reflecting (Test_Lightfuzz_PaddingOracleDetection ):
1695+ """Padding oracle test where the server reflects the submitted value in the response body.
1696+ Without reflection-stripping logic, every probe body differs and detection always fails."""
1697+
1698+ def request_handler (self , request ):
1699+ encrypted_value = quote (
1700+ "dplyorsu8VUriMW/8DqVDU6kRwL/FDk3Q+4GXVGZbo0CTh9YX1YvzZZJrYe4cHxvAICyliYtp1im4fWoOa54Zg=="
1701+ )
1702+ default_html_response = f"""
1703+ <html>
1704+ <body>
1705+ <form action="/decrypt" method="post">
1706+ <input type="hidden" name="encrypted_data" value="{ encrypted_value } " />
1707+ <button type="submit">Decrypt</button>
1708+ </form>
1709+ </body>
1710+ </html>
1711+ """
1712+
1713+ if "/decrypt" in request .url and request .method == "POST" :
1714+ if request .form and request .form ["encrypted_data" ]:
1715+ encrypted_data = request .form ["encrypted_data" ]
1716+ if "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAgLKWJi2nWKbh9ag5rnhm" in encrypted_data :
1717+ response_content = f"Padding error detected. Input: { encrypted_data } "
1718+ elif "4GXVGZbo0DTh9YX1YvzZZJrYe4cHxvAICyliYtp1im4fWoOa54Zg" in encrypted_data :
1719+ response_content = f"DIFFERENT CRYPTOGRAPHIC ERROR. Input: { encrypted_data } "
1720+ elif "AAAAAAA" in encrypted_data :
1721+ response_content = f"YET DIFFERENT CRYPTOGRAPHIC ERROR. Input: { encrypted_data } "
1722+ else :
1723+ response_content = f"Decryption failed. Input: { encrypted_data } "
1724+
1725+ return Response (response_content , status = 200 )
1726+ else :
1727+ return Response (default_html_response , status = 200 )
1728+
1729+ def check (self , module_test , events ):
1730+ web_parameter_extracted = False
1731+ cryptographic_parameter_finding = False
1732+ padding_oracle_detected = False
1733+ for e in events :
1734+ if e .type == "WEB_PARAMETER" :
1735+ if "HTTP Extracted Parameter [encrypted_data] (POST Form" in e .data ["description" ]:
1736+ web_parameter_extracted = True
1737+ if e .type == "FINDING" :
1738+ if (
1739+ "Probable Cryptographic Parameter." in e .data ["description" ]
1740+ and "encrypted_data" in e .data ["description" ]
1741+ ):
1742+ cryptographic_parameter_finding = True
1743+
1744+ if e .type == "VULNERABILITY" :
1745+ if (
1746+ "Padding Oracle Vulnerability. Block size: [16]" in e .data ["description" ]
1747+ and "encrypted_data" in e .data ["description" ]
1748+ ):
1749+ padding_oracle_detected = True
1750+
1751+ assert web_parameter_extracted , "Web parameter was not extracted"
1752+ assert cryptographic_parameter_finding , "Cryptographic parameter not detected"
1753+ assert padding_oracle_detected , "Padding oracle vulnerability was not detected"
1754+
1755+
1756+ class Test_Lightfuzz_PaddingOracleDetection_Noisy (Test_Lightfuzz_PaddingOracleDetection ):
1757+ """Padding oracle negative test: the server returns different responses for ~30 byte values,
1758+ which exceeds any valid block size. This should NOT produce a VULNERABILITY."""
1759+
1760+ def request_handler (self , request ):
1761+ encrypted_value = quote (
1762+ "dplyorsu8VUriMW/8DqVDU6kRwL/FDk3Q+4GXVGZbo0CTh9YX1YvzZZJrYe4cHxvAICyliYtp1im4fWoOa54Zg=="
1763+ )
1764+ default_html_response = f"""
1765+ <html>
1766+ <body>
1767+ <form action="/decrypt" method="post">
1768+ <input type="hidden" name="encrypted_data" value="{ encrypted_value } " />
1769+ <button type="submit">Decrypt</button>
1770+ </form>
1771+ </body>
1772+ </html>
1773+ """
1774+
1775+ if "/decrypt" in request .url and request .method == "POST" :
1776+ if request .form and request .form ["encrypted_data" ]:
1777+ encrypted_data = request .form ["encrypted_data" ]
1778+ # Check for the data block from the original ciphertext (mutate/truncate probes)
1779+ if "4GXVGZbo0DTh9YX1YvzZZJrYe4cHxvAICyliYtp1im4fWoOa54Zg" in encrypted_data :
1780+ response_content = "DIFFERENT CRYPTOGRAPHIC ERROR"
1781+ # Padding oracle probes: null IV + padding blocks produce long runs of A's in base64
1782+ elif encrypted_data .startswith ("AAAAAAAAAAAAAAAA" ):
1783+ try :
1784+ decoded = base64 .b64decode (encrypted_data )
1785+ if len (decoded ) >= 32 :
1786+ varying_byte = decoded [31 ]
1787+ # 30 byte values produce a different response - way over any block size
1788+ if 100 <= varying_byte <= 129 :
1789+ response_content = "Noisy error type A"
1790+ else :
1791+ response_content = "Decryption failed"
1792+ else :
1793+ response_content = "Decryption failed"
1794+ except Exception :
1795+ response_content = "Decryption failed"
1796+ # Arbitrary probe
1797+ elif "AAAAAAA" in encrypted_data :
1798+ response_content = "YET DIFFERENT CRYPTOGRAPHIC ERROR"
1799+ else :
1800+ response_content = "Decryption failed"
1801+
1802+ return Response (response_content , status = 200 )
1803+ else :
1804+ return Response (default_html_response , status = 200 )
1805+
1806+ def check (self , module_test , events ):
1807+ web_parameter_extracted = False
1808+ cryptographic_parameter_finding = False
1809+ padding_oracle_detected = False
1810+ for e in events :
1811+ if e .type == "WEB_PARAMETER" :
1812+ if "HTTP Extracted Parameter [encrypted_data] (POST Form" in e .data ["description" ]:
1813+ web_parameter_extracted = True
1814+ if e .type == "FINDING" :
1815+ if (
1816+ "Probable Cryptographic Parameter." in e .data ["description" ]
1817+ and "encrypted_data" in e .data ["description" ]
1818+ ):
1819+ cryptographic_parameter_finding = True
1820+ if e .type == "VULNERABILITY" :
1821+ if "Padding Oracle" in e .data ["description" ]:
1822+ padding_oracle_detected = True
1823+
1824+ assert web_parameter_extracted , "Web parameter was not extracted"
1825+ assert cryptographic_parameter_finding , "Cryptographic parameter not detected"
1826+ assert not padding_oracle_detected , (
1827+ "Padding oracle should NOT be detected when 30 probes differ (exceeds block size)"
1828+ )
1829+
1830+
16941831class Test_Lightfuzz_XSS_jsquotecontext (ModuleTestBase ):
16951832 targets = ["http://127.0.0.1:8888" ]
16961833 modules_overrides = ["httpx" , "lightfuzz" , "excavate" , "paramminer_getparams" ]
@@ -1911,3 +2048,15 @@ class Test_Lightfuzz_envelope_isolation_paddingoracle(Test_Lightfuzz_PaddingOrac
19112048 }
19122049 },
19132050 }
2051+
2052+
2053+ # Envelope state isolation: reflecting padding oracle detection with all submodules enabled.
2054+ class Test_Lightfuzz_envelope_isolation_paddingoracle_reflecting (Test_Lightfuzz_PaddingOracleDetection_Reflecting ):
2055+ config_overrides = {
2056+ "interactsh_disable" : True ,
2057+ "modules" : {
2058+ "lightfuzz" : {
2059+ "enabled_submodules" : ["sqli" , "cmdi" , "xss" , "path" , "ssti" , "crypto" , "serial" , "esi" ],
2060+ }
2061+ },
2062+ }
0 commit comments