脆弱性のあるソースコードサンプル集

## 概要
Webアプリケーションの脆弱性が存在するソースコードをまとめてみました。

あくまでサンプルだということは頭に入れておいてください。
今からお見せするソースコードのような書き方をしていないからといって、脆弱性が存在しないわけでは全くありません。
逆に同じようなソースコードが散見されたからといって、100％脆弱性があるとは限らないこともご了承ください。

詳しくはソースコードと一緒に貼ってある各リンクを参照してください。

随時アップデートしていきます。9/11

## 脆弱性一覧

### LFI/ローカルファイルインクルード（PHP）

```php
<?php
   $file = $_GET['file'];
   if(isset($file))
   {
       include("pages/$file");
   }
   else
   {
       include("index.php");
   }
?>
```
https://www.aptive.co.uk/blog/local-file-inclusion-lfi-testing/

### RFI/リモートファイルインクルード（PHP）

```php
<?php
    $file = $_GET['file'];
    include($file);
?>
```
https://www.acunetix.com/blog/articles/remote-file-inclusion-rfi/

### Directory Traversal/ディレクトリトラバーサル（PHP）

```php
<?php
    $file = $_GET['file'];
    file_get_contents('directory/' . $file);
?>
```
https://www.neuralegion.com/blog/directory-traversal-attack/

### SQLi/SQLインジェクション（PHP）

```php
<?php
      $con = mysql_connect("localhost","sqli","sqli");
      if (!$con) {
        die('Could not connect: ' . mysql_error());
      }
      mysql_select_db("sqliexample", $con);
      $id = $_GET['id'];
      $result = mysql_query("SELECT name FROM user WHERE id=$id", $con);
    
      mysql_close($con);
      $num = mysql_num_rows($result);
      $i=0;
      while ($i < $num) {
        $name = mysql_result($result, $i, "name");
        echo "Hello " . $name;
        echo "<br/>";
        $i++;
      }
?>
```
http://ghostlulz.com/source-code-analysis-sql-injection/

### XSS/クロスサイトスクリプティング（JavaScript）

```javascript
protected void doGet(HttpServletRequest request, HttpServletResponse resp) {
    String firstName = request.getParameter("firstName");
    resp.getWriter().append("<div>");
    resp.getWriter().append("Search for " + firstName);
    resp.getWriter().append("</div>");
}
```
https://www.ptsecurity.com/ww-en/analytics/knowledge-base/what-is-a-cross-site-scripting-xss-attack/

### File Upload Vulnerability（PHP）

```php
$file = $_FILES['wpshop_file'];
$tmp_name = $file['tmp_name'];
$name = $file["name"];
@move_uploaded_file($tmp_name, WPSHOP_UPLOAD_DIR.$name);
```
https://www.wordfence.com/learn/how-to-prevent-file-upload-vulnerabilities/

### XXE/XML外部エンティティ攻撃（PHP）

```php
<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 
$creds = simplexml_import_dom($dom);
$user = $creds->user;
$pass = $creds->pass;

echo "You have logged in as user $user";
?>
```
http://colesec.inventedtheinternet.com/attacking-xml-with-xml-external-entity-injection-xxe/

### SSRF/サーバーサイドリクエストフォージェリ（PHP）

```php
<?php

if (isset($_GET['image_url'])){
$url = $_GET['image_url'];

$file = fopen($url, 'rb');
header("Content-Type: image/png");
fpassthru($file);

}
echo 'Please enter image url'
?>
```
https://shieldfy.io/security-wiki/server-side-request-forgery/server-side-request-forgery/

### SSRF/サーバーサイドリクエストフォージェリ（Java）

```java
private static String fetchRemoteObject(String location) throws Exception {
    URL url = new URL(location);
    URLConnection connection = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String body = reader.lines().collect(Collectors.joining());
    return body;
}
```
https://knowledge-base.secureflag.com/vulnerabilities/server_side_request_forgery/server_side_request_forgery_java.html

### OS Command Injection（PHP）

```php
<?php
  $dir = $_GET['dir'];

  $cmd = 'ls images/' . $dir;
  system($cmd, $return_value);
  echo $return_value;
?>
```
https://guides.codepath.com/websecurity/Remote-Code-Execution

### OS Command Injection（Java）

```java
public static void listFiles(String dir) throws Exception {
  Runtime rt = Runtime.getRuntime();
  Process proc = rt.exec(new String[] {"sh", "-c", "ls " + dir});
  int result = proc.waitFor();
  if (result != 0) {
    System.out.println("process error: " + result);
  }
  InputStream in = (result == 0) ? proc.getInputStream() :
                                   proc.getErrorStream();
  int c;
  while ((c = in.read()) != -1) {
    System.out.print((char) c);
  }
}
```
https://knowledge-base.secureflag.com/vulnerabilities/code_injection/os_command_injection_java.html

### SSTI/サーバーサイドテンプレートインジェクション（Python）

```python
@app.route("/")
def index():
            username = request.values.get('username')
            return Jinja2.from_string('Hello ' + username).render()
```
https://www.exploit-db.com/exploits/46386

### Insecure Deserialization（Python）
半分Exploit Codeになってます

```python
import os
import _pickle

class Exploit(object):
def __reduce__(self):
return (os.system, ('whoami',))

def serialize_exploit():
shellcode = _pickle.dumps(Exploit())
return shellcode

def insecure_deserialization(exploit_code):
_pickle.loads(exploit_code)

if __name__ == '__main__':
shellcode = serialize_exploit()
insecure_deserialization(shellcode)
```
https://www.acunetix.com/blog/articles/what-is-insecure-deserialization/

### Zip Slip Vulnerability（Java）

```java
Enumeration<ZipEntry>entries = zip.getEntries(); 
while (entries.hasMoreElements()) { 
    ZipEntry e = entries.nextElement(); 
    File f = new File(destinationDir, e.getName()); 
    InputStream input = zip.getInputStream(e); 
    IOUtils.copy(input, write(f)); 
}
```
https://security.snyk.io/research/zip-slip-vulnerability

## 最後に

脆弱性のあるソースコードを探していると、どの様なコードが危険なのか何となく肌感覚で分かってきた気がします。
ユーザーのインプットから、何かしらの関数を実行するまでにチェックやバリデーションをしている形跡がないと、怪しい匂いがプンプンします。

この記事が皆さんのお役に立てれば嬉しいです。最後まで読んでくださってありがとうございました。

質問がある方は是非コメントしてください😃