Skip to main content
6 min read Intermediate Source Code

Java Code Analysis Basics for Pentesters

1. User Input Sources (Taint Sources)​

These are attacker-controlled inputs entering the application. During code review, first identify where untrusted data comes from.

SourceExampleRisk
HTTP Parameterrequest.getParameter("id")User-controlled input
HTTP Headerrequest.getHeader("Auth")Header manipulation
Cookiesrequest.getCookies()Session tampering
Request Bodyrequest.getInputStream()JSON/XML injection
File UploadMultipartFile.getBytes()Malicious files
File InputFileInputStream()Local file abuse
Socket Inputsocket.getInputStream()Network-based attacks
Environment VariablesSystem.getenv()Secret leakage
Database DataresultSet.getString()Stored XSS
DeserializationreadObject()RCE risk
JWT Claimsjwt.getClaims()Auth bypass if unsigned
Android IntentgetIntent().getStringExtra()Mobile attack surface

Example​

String user = request.getParameter("user");

User fully controls user.


2. Taint Flow Concept

The most important concept in secure code review:

User Input (Source)
↓
Application Logic
↓
Dangerous Function (Sink)
↓
Vulnerability

Example:

String cmd = request.getParameter("host");

Runtime.getRuntime().exec("ping " + cmd);

Flow:

getParameter()
↓
String concatenation
↓
Runtime.exec()
↓
Command Injection

3. Dangerous Sinks

A sink is a dangerous function where attacker-controlled data becomes exploitable.

VulnerabilityDangerous Sink
SQL InjectionexecuteQuery()
Command InjectionRuntime.exec()
XSSprint(), println()
SSRFnew URL()
Path Traversalnew File()
LDAP Injectionsearch()
XPath Injectionevaluate()
Template InjectionTemplate.process()
Open RedirectsendRedirect()
DeserializationreadObject()

4. SQL Injection (SQLi)

Vulnerable​

String id = request.getParameter("id");

String q =
"SELECT * FROM users WHERE id=" + id;

stmt.executeQuery(q);

Why Vulnerable?​

User input directly modifies SQL query structure.

Attack:

1 OR 1=1

Resulting query:

SELECT * FROM users WHERE id=1 OR 1=1

Secure​

PreparedStatement ps =
conn.prepareStatement(
"SELECT * FROM users WHERE id=?"
);

ps.setInt(1, Integer.parseInt(id));

What to Look For​

Search keywords:

executeQuery(
execute(
createStatement(

Check whether:

  • String concatenation is used
  • Prepared statements are missing
  • Input validation is absent

5. Command Injection

Vulnerable​

String ip = request.getParameter("ip");

Runtime.getRuntime().exec("ping " + ip);

Attack​

127.0.0.1 && whoami

Linux execution:

ping 127.0.0.1 && whoami

Risk​

Possible impacts:

  • Remote Code Execution (RCE)
  • Server compromise
  • Reverse shell
  • Data theft

Secure​

ProcessBuilder pb =
new ProcessBuilder("ping", ip);

Also validate input using allowlists.


Dangerous APIs​

APIRisk
Runtime.exec()Command Injection
ProcessBuilder()Command Injection
ScriptEngine.eval()Code Execution

6. Path Traversal

Vulnerable​

String file =
request.getParameter("file");

File f =
new File("/app/data/" + file);

Attack​

../../../etc/passwd

Result:

/app/data/../../../etc/passwd

Risk​

  • Read sensitive files
  • Access configs
  • Read credentials
  • Sometimes RCE through writable paths

Secure​

Use canonical path validation.

File base = new File("/app/data/");
File target = new File(base, file);

if (!target.getCanonicalPath()
.startsWith(base.getCanonicalPath())) {
throw new SecurityException();
}

7. SSRF (Server-Side Request Forgery)

Vulnerable​

String url =
request.getParameter("url");

URL u = new URL(url);

Attack​

Cloud metadata access:

http://169.254.169.254/latest/meta-data/

Internal service access:

http://localhost:8080/admin

Possible Impacts​

  • Internal network scanning
  • Access internal services
  • Read cloud credentials
  • Firewall bypass
  • Access Redis/Jenkins/internal APIs
  • Possible RCE through vulnerable internal services

Secure​

  • Allowlist domains
  • Block internal IP ranges
  • Disable redirects
  • Validate protocols (http/https only)

8. Cross-Site Scripting (XSS)

Vulnerable​

out.println(
request.getParameter("name")
);

Attack​

<script>alert(1)</script>

Risk​

  • Session hijacking
  • Cookie theft
  • Account takeover
  • Phishing
  • DOM manipulation

Secure​

Use output encoding.

String safe =
StringEscapeUtils.escapeHtml4(name);

Types of XSS​

TypeDescription
Reflected XSSImmediate response
Stored XSSStored in DB
DOM XSSHappens in browser JS

9. Insecure Deserialization

Vulnerable​

ObjectInputStream in =
new ObjectInputStream(fileIn);

Object obj = in.readObject();

Why Dangerous?​

Deserialization reconstructs Java objects from attacker-controlled data.

Attackers may abuse gadget chains for RCE.


Risk​

  • Remote Code Execution
  • Authentication bypass
  • Denial of Service

Dangerous Classes​

APIRisk
readObject()Deserialization
XMLDecoder()RCE
Yaml.load()Unsafe parsing

10. Authentication & Authorization Issues

Dangerous Pattern​

if(role.equals("admin"))

Questions to Ask​

  • Can attacker modify role?
  • Is role coming from JWT/header/request?
  • Is JWT signature verified?
  • Is access control enforced server-side?

Common Issues​

IssueExample
Missing AuthorizationNo role check
IDORAccessing another user's data
Trusting ClientRole from request
JWT None AlgorithmSignature bypass

11. Hardcoded Secrets

Vulnerable​

String password = "admin123";

Look For​

  • API keys
  • JWT secrets
  • AWS credentials
  • DB passwords
  • Encryption keys

Search Keywords​

password=
secret=
apikey=
token=
AWS_SECRET

12. Open Redirect

Vulnerable​

response.sendRedirect(url);

Attack​

https://evil.com

Risk​

  • Phishing
  • OAuth token theft
  • User redirection attacks

Secure​

Allowlist valid domains only.


13. Weak Cryptography

Vulnerable​

Cipher.getInstance("AES/ECB/PKCS5Padding");

Why Dangerous?​

ECB mode leaks data patterns.


Weak Algorithms​

Weak CryptoRisk
MD5Broken hashing
SHA1Collision attacks
AES/ECBPattern leakage
DESWeak encryption
Random()Predictable tokens

Secure Alternatives​

WeakSecure
MD5BCrypt/Argon2
SHA1SHA256+
Random()SecureRandom()
ECBGCM/CBC

14. XXE (XML External Entity)

Vulnerable​

DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();

If external entities enabled:

<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

Risk​

  • File read
  • SSRF
  • Internal network access

Secure​

Disable external entities.


15. Common Validation Mistakes

Weak Validation​

if(input.contains("<script>"))

Easy bypass:

<ScRiPt>

Better Approach​

  • Allowlist validation
  • Output encoding
  • Parameterized queries

16. Important Java Security APIs

APIRisk
Runtime.exec()Command Injection
ProcessBuilder()Command Injection
Statement.executeQuery()SQLi
ObjectInputStream.readObject()Deserialization
response.sendRedirect()Open Redirect
new File()Path Traversal
new URL()SSRF
Cipher.getInstance()Weak Crypto
WebView.loadUrl()Android WebView abuse
ScriptEngine.eval()Code Execution

17. Pentester Mindset

Always trace:

User Input
↓
Validation?
↓
Authentication?
↓
Authorization?
↓
Dangerous Function?
↓
Exploitable?

18. Secure Code Review Flow

StepAction
1Identify user input
2Trace data flow
3Find dangerous sinks
4Check validation
5Check authentication/authorization
6Determine exploitability
7Assess impact

19. Useful Keywords to Search

Input Sources​

getParameter(
getHeader(
getCookies(
readLine(
getInputStream(

Dangerous Sinks​

executeQuery(
execute(
Runtime.getRuntime().exec(
ProcessBuilder(
readObject(
sendRedirect(
new File(
new URL(
eval(

Authentication​

isAdmin
role=
jwt
Authorization
Bearer

20. Fast Manual Review Strategy

First Pass​

Find:

  • Inputs
  • Authentication
  • File handling
  • External requests

Second Pass​

Trace:

  • Input → Sink
  • User → Database
  • User → File System
  • User → Command Execution

Third Pass​

Check:

  • Validation
  • Authorization
  • Encryption
  • Business logic flaws

21. Real Pentester Thinking

Instead of only asking:

“Is this code vulnerable?”

Ask:

  • Can attacker control this value?
  • Can attacker reach this function?
  • Can validation be bypassed?
  • Does authentication exist?
  • Is authorization enforced?
  • What is worst-case impact?
  • Can vulnerabilities be chained?

Example chain:

SSRF
↓
Access internal Jenkins
↓
Default credentials
↓
Script Console
↓
RCE