https://dreamhack.io/wargame/challenges/413/
난이도: Level 1
<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'];
/* 유저 입력에 http 가 포함되어있는지 확인 */
if(strpos($url, 'http') !== 0 ){
die('http only !');
}else{
/* escapeshellcmd(): ';', '||', '&&' 등 필터링 */
$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>
위 PHP 코드에서 escapeshellcmd() 함수를 통해, 문자를 필터링하고 있습니다.
이후, shell_exec() 함수를 통해 curl 명령에 유저로부터 받은 인자를 넘겨 실행하고 있습니다.
cache 폴더에 md5(url) 해시 함수를 통해 파일을 만든 후, 내용을 해당 파일에 써주고 있습니다.
escapeshellcmd() 함수는 '-' 문자를 필터링하지 않기 때문에, curl 명령에 존재하는 옵션을 활용할 수 있게 됩니다. curl 명령에 -o 옵션을 사용하면 임시 파일을 생성할 수 있습니다.
> escapeshellcmd() 함수에 대해 더 자세히 알고 싶다면 아래 링크를 참조하시면 됩니다 :)
https://www.php.net/manual/en/function.escapeshellcmd.php
그렇기에, -o 옵션을 활용하여 웹셸을 업로드하면 Exploitation이 가능합니다.
개인 웹서버가 있을 경우, 개인 웹서버에 webshell.php 코드를 생성하여 curl 명령을 통해 다운로드 받으면 되지만, 없을 경우에 아래 URL 링크를 활용하면 됩니다.
Exploit Code
위 내용을 입력으로 주게 되면, /var/www/html/cache/ 경로에 webshell.php 파일이 생기게 됩니다.
그리하여, .아래와 같이 /cache/webshell.php 경로에 접근하여 명령을 실행시킬 수 있게 됩니다.
위 사진은 "ls /' 명령을 실행한 결과입니다. 결과를 보면 flag 가 있는 것을 볼 수 있습니다.
cat /flag 명령을 입력해보았는데 아무것도 나오지 않아서 file /flag 명령을 통해 파일 유형을 확인해보니
실행파일이라고 나와있는 것을 확인할 수 있습니다.
실행파일이므로 /flag 를 통해 파일을 실행시켜주면 FLAG 를 획득할 수 있습니다.
'DreamHack' 카테고리의 다른 글
[DreamHack] XSS Filtering Bypass (1) | 2023.06.15 |
---|---|
[DreamHack] baby-sqlite (0) | 2023.06.15 |
[DreamHack] out_of_bound (0) | 2023.06.09 |
[DreamHack] XSS - 2 (2) | 2023.06.07 |
[DreamHack] Return Address Overwrite (0) | 2022.11.14 |