# Sinks

{% embed url="<https://about.gitlab.com/topics/version-control/what-is-code-review/>" %}

## 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)                                                                                                                                               |
