# Sinks

| Vulnerability Type                             | Java Sinks                                                                                                                                                                                                                   | PHP Sinks                                                                                                                                                                                                                                            | Node.js Sinks                                                                                                                                                                                     |
| ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Remote Code Execution (RCE)**                | <p><code>Runtime.getRuntime().exec()</code><br><code>ProcessBuilder.start()</code><br><code>Method.invoke()</code><br><code>ScriptEngine.eval()</code><br><code>InitialContext.lookup()</code> (JNDI Injection)</p>          | <p><code>shell\_exec()</code><br><code>exec()</code><br><code>system()</code><br><code>passthru()</code><br><code>proc\_open()</code><br><code>popen()</code><br><code>eval()</code><br><code>assert()</code><br><code>create\_function()</code></p> | <p><code>child\_process.exec()</code><br><code>child\_process.execSync()</code><br><code>child\_process.spawn()</code><br><code>vm.runInContext()</code><br><code>vm.runInNewContext()</code></p> |
| **SQL Injection (SQLi)**                       | <p><code>Statement.executeQuery()</code><br><code>Statement.executeUpdate()</code><br><code>Statement.execute()</code><br><code>EntityManager.createQuery()</code></p>                                                       | <p><code>mysqli\_query()</code><br><code>mysql\_query()</code><br><code>pg\_query()</code><br><code>PDO::query()</code> (without prepared statements)</p>                                                                                            | <p><code>db.collection.find({ user: req.query.user })</code> (NoSQLi in MongoDB)<br><code>sequelize.query()</code> (raw queries)</p>                                                              |
| **Path Traversal / Arbitrary File Read/Write** | <p><code>File(String)</code><br><code>FileReader(String)</code><br><code>FileWriter(String)</code><br><code>Files.readAllBytes(Path)</code><br><code>ZipInputStream.getNextEntry()</code></p>                                | <p><code>file\_get\_contents()</code><br><code>fopen()</code><br><code>readfile()</code><br><code>include()</code><br><code>require()</code><br><code>unlink()</code></p>                                                                            | <p><code>fs.readFileSync()</code><br><code>fs.readFile()</code><br><code>fs.createReadStream()</code><br><code>fs.writeFileSync()</code><br><code>fs.unlinkSync()</code></p>                      |
| **Server-Side Request Forgery (SSRF)**         | <p><code>HttpURLConnection.openConnection()</code><br><code>URL.openStream()</code><br><code>RestTemplate.getForObject()</code><br><code>WebClient.get().uri()</code></p>                                                    | <p><code>file\_get\_contents("http\://...")</code><br><code>curl\_exec()</code><br><code>stream\_context\_create()</code></p>                                                                                                                        | <p><code>http.get()</code><br><code>axios.get()</code><br><code>fetch()</code><br><code>request()</code></p>                                                                                      |
| **Cross-Site Scripting (XSS)**                 | <p><code>response.getWriter().write()</code><br><code>HttpServletResponse.getOutputStream().print()</code><br>JSP: <code><%= userInput %></code></p>                                                                         | <p><code>echo $\_GET\["input"];</code><br><code>print($\_POST\["input"]);</code><br><code>printf($\_GET\["input"]);</code><br><code>exit($\_GET\["input"]);</code></p>                                                                               | <p><code>res.send(req.query.input)</code><br><code>res.write(req.body.input)</code><br><code>document.write(req.query.input)</code> (in client-side JS)</p>                                       |
| **Cross-Site Request Forgery (CSRF)**          | <p><code>doPost(HttpServletRequest req, HttpServletResponse res)</code><br><code>doPut(HttpServletRequest req, HttpServletResponse res)</code><br><code>doDelete(HttpServletRequest req, HttpServletResponse res)</code></p> | <p>Forms with <code>method="POST"</code> and no CSRF token<br>Session-modifying endpoints (<code>$\_SESSION</code>, <code>setcookie()</code>)</p>                                                                                                    | `app.post('/update', (req, res) => {...}` (without CSRF token verification)                                                                                                                       |
| **XML External Entity (XXE) Injection**        | <p><code>DocumentBuilder.parse()</code><br><code>SAXParser.parse()</code><br><code>XMLReader.parse()</code><br><code>TransformerFactory.newInstance().newTransformer().transform()</code></p>                                | <p><code>simplexml\_load\_string()</code><br><code>DOMDocument.loadXML()</code><br><code>xml\_parser\_create()</code></p>                                                                                                                            | <p><code>xml2js.parseString()</code><br><code>libxmljs.parseXml()</code></p>                                                                                                                      |
| **LDAP Injection**                             | <p><code>DirContext.search()</code><br><code>LdapContext.search()</code></p>                                                                                                                                                 | <p><code>ldap\_search()</code><br><code>ldap\_list()</code><br><code>ldap\_read()</code></p>                                                                                                                                                         | `ldapClient.search()` (Node.js LDAP client)                                                                                                                                                       |
| **Insecure Logging (Information Disclosure)**  | <p><code>Logger.info()</code><br><code>Logger.debug()</code><br><code>System.out.println()</code><br><code>PrintWriter.println()</code></p>                                                                                  | <p><code>error\_log($\_GET\["input"]);</code><br><code>var\_dump($\_POST\["password"]);</code><br><code>print\_r($\_SERVER);</code></p>                                                                                                              | <p><code>console.log(req.body.password)</code><br><code>winston.log('info', req.query.debug)</code></p>                                                                                           |
| **Insecure Cryptography**                      | <p><code>MessageDigest.getInstance("MD5")</code><br><code>Cipher.getInstance("DES")</code><br><code>Cipher.getInstance("ECB")</code></p>                                                                                     | <p><code>md5()</code><br><code>sha1()</code><br><code>crypt("plaintext", "salt")</code><br><code>base64\_encode()</code></p>                                                                                                                         | <p><code>crypto.createHash('md5')</code><br><code>crypto.createCipher('des', key)</code></p>                                                                                                      |
| **Insecure Session Management**                | <p><code>HttpSession.getAttribute()</code><br><code>request.getSession(true)</code></p>                                                                                                                                      | <p><code>session\_start();</code><br><code>setcookie("PHPSESSID", ...)</code></p>                                                                                                                                                                    | `req.session.user = "admin"` (without secure flags)                                                                                                                                               |


---

# Agent Instructions: 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://appsecexplained.gitbook.io/appsecexplained/code-review/sinks.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.
