这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家。

ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型的ctf式题目(虽然现在大家都很抵制这样的题目),这里主要是分享Writeup以及我们队在完成题目时的思考流程。

ez_upload 思考流程

最开始我先描述一下题目逻辑。

1、login.php,登陆页面,只获取了username,没有任何限制,username会在转义后进入session。

2、index.php,页面输出了username,ip(可以被xff覆盖),以及上传文件列表(不完整,只有10位)。

3、upload.php,上传文件,要求必须上传php,但是又过滤很多,没办法绕过限制。

在拿到题目后,我们可以得到以下信息:

1、登陆无任何限制,只输入用户名,但单引号、双引号、反斜杠会被转义。aaa' => aaa\'

1)hint提到数据库中username的长度为25

2、登陆后,index.php获取ip,这个ip可以被xff覆盖,而且是每次都会获取。

1)xff受到waf限制,形似。

$ip = get_ip_from_xff();

echo $ip;

waf($ip);

但这里只拦截包括单引号、反斜杠

3、上传文件,要求必须上传php,但会被waf拦截。

1)代码形似:

waf($_FILES);

所以和ip那里触发不一致

2)看上去对php的验证在前,在最早的测试中,只有在触发waf的情况下才能被认为是php(猜测)

\n.....

这里的判断看上去完全一致,像是个悖论

3、上述中所有提到的变量,在输出前都是从session里面取得,但提示中数据库存在。

那么猜测有两个数据库操作点。

1、index.php查看文件列表,select filename from uploads where user = '\$user' and ip = "\$ip"? # ip是否参与未知

2、upload.php上传文件,insert into uploads values (id, '\$user', '\$ip', '\$filename')...

###########猜测分割钱###########

在最早分析完题目后,由于我们没办法绕过上传,所以重新思考了所有的条件。于是有了下面的猜测:

猜测这里存在二次注入,通过user25位阶段对\的转义,然后转义单引号,这样与下一个单引号闭合,于是完成insert注入。

猜测为注入题目...

文件如果被上传,那么一定可以被index.php看到,那么我们需要假设这个文件一定可以被上传。

但我们传不了,那么有两种假设,有我们忽略的条件或者black trick。

而忽略的条件只有waf(尤其是ip上的

假设ip上的waf是用来测试上传文件的文件名

而insert语句为insert into uploads values (id, '\$user', '\$filename')...

我们可以通过测试ip的waf,知道filename的waf。

但在这种假设下,文件一定可以被上传

从上面的条件思考upload.php的核心代码大致如下

if(!empty($_FILES['upfiles']['tmp_name']))

{

if(is_array($_FILES['upfile'])){

die();

}

if(checkIsPhp($_FILES['upfile'])){

die('bu shi php')

}

if(waf($FILES['upfiles'])){

mysql_query('insert')

}else{

die('waf')

}

}

重新思考流程后,我们可以想到,这里的文件一定可以被上传(即使不能直接上传php)

在第二天的比赛中,经过测试,我们发现后台的判断非常奇怪,在假设文件可以被上传的情况下,后台大概是判断是不是一个纯粹的php文件,在不考虑强行脑洞的情况下,我们需要寻找一个非 在完成题目之后,我拿到了题目的源码,重新回顾源码后发现一些有趣的东西。

upload.php

session_start();

include_once 'lib/clean.php';

include_once 'lib/database.php';

if (isset($_FILES['upfile'])) {

$file = $_FILES['upfile'];

if ($file ['error'] > 0) {

switch ($file ['error']) {

case 1 :

$mes = 'The uploaded file exceeds the value of the upload_max_filesize option in the PHP configuration file';

break;

case 2 :

$mes = 'Exceeded the size of the form MAX_FILE_SIZE limit';

break;

case 3 :

$mes = 'File section was uploaded';

break;

case 4 :

$mes = 'No upload file selected';

break;

case 6 :

$mes = 'No temporary directory found';

break;

case 7 :

case 8 :

$mes = 'System error';

break;

}

die($mes);

}

$content = file_get_contents($file['tmp_name']);

checkMIME($file);

if (checkContent($content) && checkExts($file['name'])) {

upload($file);

} else {

die('attack detected');

}

} else {

die('file not found');

}

function upload($file)

{

$savepath = dirname(__file__) . '/uploads/';

$filename = explode('.', $file['name']);

$newname = rand_name() . "." . trim(end($filename));

$finalname = $savepath . $newname;

if (move_uploaded_file($file['tmp_name'], $finalname)) {

$db = new Database();

//,1,(select substring(filename,10,10) from(select filename from picture limit 0,1)x))#

if ($db->insert($_SESSION['username'], getip(), $newname)) {

header('location: index.php');

exit();

}

}

}

function rand_name($l = 64)

{

$str = null;

$Pool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_";

$max = strlen($Pool) - 1;

for ($i = 0; $i

$str .= $Pool[rand(0, $max)];

}

return $str;

}

function checkExts($filename)

{

$AllowedExt = array('php', 'php3', 'php4', 'php5', 'pht', 'phtml', 'inc');

$filename = explode('.', $filename);

if (in_array(strtolower($filename[count($filename) - 1]), $AllowedExt)) {

return false;

}

return true;

}

function checkMIME($file)

{

// text/php text/x-php

$php_ext = array("text/php", "text/x-php");

$type = mime_content_type($file['tmp_name']);

if(!in_array(strtolower($type), $php_ext)){

die("i need php file");

}

}

function checkContent($content)

{

if (stripos($content, '') === 0) {

return false;

}

return true;

}

upload中我们一直认为是悖论的过滤,是通过mime_content_type来判断的,这也是为什么我们可以用#!/usr/bin/php绕过的原因,蛮有意思的一个点

php upload ctf,强网杯CTF防御赛ez_upload Writeup相关推荐

  1. 第五届“强网杯”青少年专项赛盛大开赛

    9月25日,第五届"强网杯"青少年专项赛线上赛盛大开赛.作为国家级赛事强网杯的系列专项赛,青少年专项赛圆满践行了向青少年普及网络安全知识与技能,提升青少年网络安全素养和创新能力,发 ...

  2. [网络安全提高篇] 一一〇.强网杯CTF的Web Write-Up(上) 寻宝、赌徒、EasyWeb、pop_master

    强网杯作为国内最好的CTF比赛之一,搞安全的博友和初学者都可以去尝试下.首先,让我们观摩下这些大神队伍,包括0x300R.eee.0ops.AAA.NeSE.Nu1L等,真的值得我们去学习.其次,非常 ...

  3. 第三届强网杯线上赛记录

    Misc 0x01 签到 flag{welcome_to_qwb_2019} 0x02 强网先锋-打野 解压出来是一个bmp文件 打开图片 又是cxk... 首先想到的是丢尽Stegsolve分析一波 ...

  4. 第六届“强网杯”青少年专项赛 writewp by 楠辞姐姐后援团

    楠辞姐姐后援团战队WRITEUP 前言 这次比赛难度很大,Crypto部分也全都是猜谜语类型的题目,没啥游戏体验,不过好在排名在前30.本篇WP为团队WP,团队成员为:树木,AcexZe,Lenyi ...

  5. 强网杯2022 pwn 赛题解析——yakacmp

    这道题在比赛中是笔者的队友负责的,但可惜的是最后的flag差了几秒没交上.这里借用一下他的exp做一篇分析文章. 这是一个用C++写的vm题,内部实现了各种指令到机器码的转换功能.下面就来分块分析一下 ...

  6. 2017第二届广东省强网杯线上赛——WEB-who are you?

    打开网址 查看网页源代码 将网址在御剑里扫 扫的同时,burpsuite抓包,一般情况下,考虑到出题说我是谁,所以一般想到用户身份,会在cookie/session这边动手脚 所以base64一下 得 ...

  7. 2022强网杯线上赛 qmachine

    附件下载链接 逆向还原 分析可知程序的大致逻辑如下: #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  8. 强网杯线上赛一道套娃MISC题解

    misc Miscstudy 该题共有七关,将所有flag拼接为最后的结果 第一.二关 按时间顺序分析流量包,第一个为http包,以get方法请求了一个链接:http://39.99.247.28/f ...

  9. 第三届广东省强网杯网络安全大赛WEB题writeup

    1. 小明又被拒绝了 直接访问根目录,报403错误 一般是做了ip限制,加上 X-Forwarded-For 头即可绕过 接着又提示不是管理员,仔细看响应头的 Set-Cookie ,有个 admin ...

最新文章

  1. R语言caret包构建机器学习回归模型(regression model)、使用DALEX包进行模型解释分析、特征重要度、偏依赖分析等
  2. Cannot set property 'render' of undefined
  3. Mybatis一级缓存、二级缓存
  4. Ubuntu挂载新硬盘
  5. gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化
  6. 修改centos默认启动级别为字符模式
  7. 空心心形图案的c语言程序,C语言写的各种心形图案_6583
  8. 视频教程-PHP开发进阶课程docker入门与进阶-PHP
  9. excel如何比对两列数据是否相同
  10. LED背光源和LED背光灯区别
  11. 逆水寒怎么找回服务器之前的角色,逆水寒12月27日服务器合并公告 逆水寒合服问题解答一览...
  12. 发送打印任务后不打印
  13. Android阿面试积累,android项目开发实战密码
  14. Quasi-Newton拟牛顿法(共轭方向法)
  15. Linux下 “>/dev/null 2>1 “ 命令学习
  16. 从零开始搭建个人静态简历网站
  17. 改变世界的五位程序员
  18. 微信小程序--引用第三方组件
  19. 选择高光阴影中间调的方法
  20. 记录Python 入门练习题目

热门文章

  1. Python培训基础教程都教哪些
  2. HTML的标签分为哪几类?各标签语法格式是怎样的?
  3. 好程序员web前端技术分享媒体查询
  4. 快节奏的多人游戏同步 - 示例代码和在线演示
  5. 71 mac boook pro 无 gpu 下caffe 安装
  6. ServletResponse-中文名的下载
  7. PostgreSQL 9.3 beta2 stream replication primary standby switchover bug?
  8. linux 环境配置 安装jdk
  9. ORB-SLAM2从理论到代码实现(八):Tracking.cc程序详解(下)
  10. Java中的浅拷贝与深拷贝