您的位置:首页 > 理论基础 > 计算机网络

一道CTF场景还原&&防御攻破

2016-12-26 00:00 211 查看
1.文章难易度:【★★★】
2.文章知识点:php语法;php伪协议;ctf;
3.文 章 作 者:xiaoye
4.本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!

前言
例行打卡,昨晚让一个bug弄得觉也没睡好。。果然我太菜。。本来是打算写XXE的,但是想起来了之前在一个群里讨论的ctf题目,当时那位小伙伴就说了下大概情形和大致思路,心挺痒,,但是那个题目应该是他们学校内网才能访问。没办法,那就根据他说的来自己写一道ctf题目喽。正好好久没写php了,练练手。

一、题目的还原
他大致是这么说的:有上传点,只能上传zip或者jpg/png/jpeg图片格式,上传后可以知道路径;有LFI(本地文件包含漏洞),但是包含的如果不是php文件就在后面再加上一个.php后缀;没有RFI(远程文件包含漏洞);
好吧,听起来不是很难,我们分开写,先写上传点,限制为zip&&图片格式:
indexdemo.html:

<html>

<form method='POST' action='upload_filedemo.php' enctype='multipart/form-data'>

<label for='file'>filename:</label>

<input id='file' name='file' type='file' /><br>

<input type='submit' name='submit' value='submit'/>

</form>

</html>


upload_filedemo.php:

<?php

if(isset($_POST['submit'])){

//file information

$uploaded_name = $_FILES['file']['name'];

$uploaded_type = $_FILES['file']['type'];

$uploaded_size = $_FILES['file']['size'];

$uploaded_tmp = $_FILES['file']['tmp_name'];

$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);

//where will we put file

// //$now_path = dirname(_FILE_) . '/upload/';

define('FILE_PATH', dirname(__FILE__));

$target_path = FILE_PATH . '/upload/';

$target_file = md5(uniqid().$uploaded_name) . '.' . $uploaded_ext;

if(($uploaded_ext == 'zip' || $uploaded_ext == 'jpg' || $uploaded_ext == 'png') && ($uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' || $uploaded_type == 'application/zip')){

move_uploaded_file($uploaded_tmp, $target_path . $target_file);

echo 'stored in' . $target_path . $target_file;

}

}

?>


核心代码:

if(($uploaded_ext == 'zip' || $uploaded_ext == 'jpg' || $uploaded_ext == 'png') && ($uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' || $uploaded_type == 'application/zip')){

move_uploaded_file($uploaded_tmp, $target_path . $target_file);

echo 'stored in' . $target_path . $target_file;

}


采用了白名单,攻击者想利用的话就基本只有解析漏洞了,但是我这是apache高版本,暂时不用考虑这块;
采用MIME验证,这块只是辅助,毕竟用户burp拦截下就可以改掉了;

$target_file = md5(uniqid().$uploaded_name) . '.' . $uploaded_ext;


文件名是md5加密的,00截断截不了,而且我这儿php也是高版本的,不用考虑;
这道题目的上传要求这样就基本满足了,送点福利,自己整理的:



这里本来想采用php二次渲染防止图片马,但是。。这样肯定不行,这道题目是让拿shell再拿flag的,你不让传咋行。。哈哈,这是后话了。
文件包含代码:
zipphp.php:

<?php

include('funct.php');

$file = $_GET['file'];

$ext = get_extension($file);

$bz = check_extension($ext);

if($bz){

include($file);

}else{

include($file . '.php');

}

?>

en

funct.php:

<?php

function get_extension($f){

return pathinfo($f, PATHINFO_EXTENSION);

//print pathinfo($f, PATHINFO_EXTENSION);

}

function check_extension($f){

if($f == 'php'){

return true;

}else{

//$f = $f . '.php';

return false;

}

}

?>


核心代码:

function get_extension($f){                                     //获取文件后缀

return pathinfo($f, PATHINFO_EXTENSION);

//print pathinfo($f, PATHINFO_EXTENSION);

}

function check_extension($f){                  //检查文件后缀是否为php,是返回true,不是返回false

if($f == 'php'){

return true;

}else{

//$f = $f . '.php';

return false;

}

}


然后再:

if($bz){                  //判断是否加.php后缀

include($file);

}else{

include($file . '.php');

}


试验下喽:





不是php 文件自动加上php后缀,平台bwapp里也有这个套路的。
好了。。累死。。题目还原好了。。开始做题吧

二、突破防御,getshell
只有LFI没有RFL,那我们之前http://bbs.ichunqiu.com/thread-15871-1-1.html?from=oschina的RFI技巧就无效了,并且LFI限制很多,目前我们只能包含已经存在的php文件,不能上传php(废话。。能上传就不用包含了。。),我们能拿到手的都是一些鸡肋。。所以洗洗睡吧。。哈哈,joke啦
php有很多伪协议:zip data php://filter php://......
等等,我们能上传zip啊。。百度之,发现了一个技巧,利用zip伪协议:
zip://目录/xx.zip%23zip里的文件
哎,我们可以把php文件放到xx.zip中,然后利用伪协议读取,然后包含它啊,说的有点乱,看操作:
写一个1.php:

<?php

phpinfo();

?>


打个压缩包1.zip,把1.php放上去,然后上传



然后利用伪协议读取:





我擦勒,这就结束了!做题时间和写题时间不平衡啊。。。。。。就这样吧,你把1.php写入一句话木马就拿到shell了。。总结一下,这一道题:

我们只能上传zip/图片格式------>上传zip,内含.php恶意文件------>文件包含中可用zip协议------>zip:/目录/xxx.zip%231.php可以访问到zip中的.php文件------>getshell

其实这道题还有个技巧,我们把1.zip改成jpg也可以:



总结
没啥要总结的了吧。。哈哈,欢迎交流 ,写的比较慌,有错误的地方海涵

更多安全技术、精品好文、白帽黑客大佬尽在:http://bbs.ichunqiu.com/portal.php
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CTF 网络安全