php upload ctf,强网杯CTF防御赛ez_upload Writeup
这是强网杯拟态防御线下赛遇到的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绕过的原因,蛮有意思的一个点
相关文章:

Oracle 表空间扩容
2019独角兽企业重金招聘Python工程师标准>>> 1、查询当前表空间使用情况 col FILE_NAME format a50; col SPACE_NAME format a15; select b.file_name file_name,b.tablespace_name space_name, b.bytes/1024/1024 munM,(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 …
PHP网站首页打不开的原因讲起
最近有个网站首页打不开,偶尔报504错误,如图所示,这是nginx直接返回的。今天下午16:00多又出现了,看了下阿里云数据库连接,其实在晚上2:00也出现了一次。这个图是后来问题已经解决了获取的,数据库连接的请求…

前端资源整理 - 订阅、工具等
取自 我的GITHUB 的 fe-store-house repo,欢迎 PR,欢迎 STAR。原 repo 不定期更新,此文可能断更。断更了一年多,重新更新一下,似乎 sfgg 的文章渲染中 gfm table 解析有问题。最新更新时间 2017-11-02。前端资源 中文 …

mysql和mariadb可以同时使用吗,MariaDB与MySQL在一台服务器同时运行
[rootHE3 ~]#groupaddmariadb-g 513[rootHE3 ~]#useradd -u 513-gmariadb-s /sbin/nologin -d /home/mariadbmariadb从MariaDB官网下载二进制安装包至/root目录,本文采用的是目前最新稳定版mariadb-10.1.16[rootHE3 ~]# tar xvf mariadb-10.1.16-linux-x86_64.tar.g…

http请求与响应
一、请求格式 二、响应格式 转载于:https://www.cnblogs.com/believepd/p/10470824.html
Linux环境安装phpredis扩展
php访问redis需要安装phpredis扩展,phpredis是用纯C语言写的。phpredis下载地址 https://github.com/phpredis/phpredis 最新的版本是phpredis-develop.zip,我们选择的上一个稳定版2.2.7# wget https://github.com/nicolasff/phpredis/archive/2.2.7.tar…

IO流(文件的读写)---本文的正确性有待您验证。
2019独角兽企业重金招聘Python工程师标准>>> JAVA的I/O介绍。<<疯狂JAVA编程>>第15章有详细介绍,如下: http://www.cnblogs.com/lijunamneg/archive/2013/03/22/2975087.html import java.io.FileNotFoundException;import java.…

创建图像 php,详解php创建图像具体步骤
php 的图像处理在验证码是最常见的,下面说下使用php创建图像的具体步骤。简要说明:PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括,,,以及在内的多种格式的图像。 更加方便的是,PHP 可以…

Java语法基础-序列化
33. Java序列化中如果有些字段不想进行序列化,怎么办? 答:对于不想进行序列化的变量,使用transient关键字修饰。 transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被…
Spring AOP与IOC
Spring AOP实现日志服务pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version> </dependency> <dependency><groupId>org.springfr…

matlab求解外弹道,基于MATLAB∕Simulink的通用质点外弹道程序设计.pdf
2017.01 设计与研发基于 MATLAB/Simulink 的通用质点外弹道程序设计崔 瀚(沈阳工学院兵器类虚拟仿真实验教学中心, 辽宁抚顺 ,113122 )摘要:本文以弹丸质点外弹道学为研究对象,通过分析以时间为 自变量的质点外弹道方程组,借助 MATLAB/Simuli…

深入Java虚拟机读书笔记[10:20]
第十章 栈和局部变量操作 第十一章 类型转换 第十二章 整数运算 第十三章 逻辑运算 第十四章 浮点运算 第十五章 对象和数组 第十六章 控制流 第十七章 异常 以上一些是操作码相关的内容, 第十八章 finally子句 微型子例程 字节码中的finally子句表现的很像微型子例…

docker Rails Permission denied @ dir_s_mkdir
sudo chmod 777 -R public转载于:https://www.cnblogs.com/znsongshu/p/9777543.html
图形化的Redis监控系统redis-stat安装
Redis需要监控才知道具体运行信息,虽然Redis也提供了info等命令行,但是毕竟不方便而且不能保存历史信息。 redis-stat是一个用ruby写成的监控redis的程序,基于info命令获取信息,而不是通过monitor获取信息。 关于Redis的安装参考此…

Oracle简单脚本演示样例
Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR VARCHAR2(5000); VN_COUNT NUMBER; BEGIN --查看现有系统是否有BT_PRODUCT_MODEL表 SELECTCOUNT(…

matlab看fft帮助,日记 [2009年06月02日] MATLAB FFT HELP 帮助文档及我的翻译
fftFast Fourier Transform 的缩写, 即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在…

用Kotlin在IntelliJ Idea中无法生成 spring-configuration-metadata.json 文件
为什么80%的码农都做不了架构师?>>> 问题描述 在百度搜索关键词,搜索到了 Stack Overflow 有相关问题 spring-configuration-metadata.json file is not generated in IntelliJ Idea for Kotlin ConfigurationProperties class 原文链接: https://stack…
Linux系统轻量级监控工具monitorix和munin安装
提到监控工具,大家都会想到zabbix等重量级的,这些好是好,但是需要安装数据库等等,如果有时候希望简单点其实可以借助一些轻量级的监控工具,例如monitorix和munin。需要做点前置工作开启Nginx和php-fpm的status…

MySql 查询表字段数
MySql 查询表字段数 SELECT COUNT(*) FROM information_schema.columns WHERE table_schematest_cases AND table_namecases_send ; test_cases 为数据库名称 cases_send 为表名 列出表字段名称 SHOW COLUMNS FROM cases_send

phpstudy2014 php7.0,phpstudy下载_phpStudy下载2014 官方版_php环境集成包 1.0_零度软件园...
phpStudy 1.7.0 (phpStudy V1.65 Build 080120)该程序包集成最新的ApachePHPmysqlphpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等…
AndroidApplication优化解耦
Application后处理器(AndroidPostProcessing): 通过注解配置初始化各模块及应用所需 sdk,按优先级/延时时间/是否只在Debug下有效/执行线程 等条件初始化 sdk 通常,我们要在 Application 中处理一堆的三方 SDK 和自定义…

Git 详解
1. Git 1.1. Git是何方神圣? Git是用C语言开发的分布版本控制系统。版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态)。另一个状 态可以是不同的文件,也可以是不同的文件内容。举个例子&…

shell基础语法以及监控进程不存在重启
转码 # dos2unix ./test.sh 权限# chmod ax ./test.sh语法 变量 var"111" echo $var echo ${var}运算 no14; no25; let resultno1no2 echo $result;自增自减少 let no let no--[]和let类似 result$[ no1 no2 ] result$[ $no1 5 ] 也可以使用(()),但使…

java md5算法,JAVA实现MD5算法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package org.zcq100.Other;public class MD5 {static final int S11 8;static final int S12 13;static final int S13 18;static final int S14 23;static final int S21 7;static final int S22 11;static final int S23 …

Hulu直播服务难点解析(一):系统需求
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/83053654 Hulu在其博客发布了建立直播服务遇到的挑战及解决方案,这对于以前只提供点播服务的系统而言是一次彻底的升级。Li…

Velocity 入门(一)
Velocity是一种Java模版引擎技术,该项目由Apache提出。因为非常好用,和工作中有啥用,所以我在在理简单的入门一下。 网上找了很多教程,写的不是很明白,要么就是全部拷贝下来时候运行不起来。 在这里我来写一份比较完成…

php 魔术方法 多继承,day23:单继承多继承菱形继承__init__魔术方法
原文:https://www.cnblogs.com/libolun/p/13434675.html单继承关于继承的一些基本概念1.什么是子类?什么是父类?如果一个类继承另外一个类,该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)2.继承的种类:1.单继承 2.多继承3…
最新版IntelliJ IDEA 15开发Java Maven项目
IntelliJ IDEA是最好的java开发IDE之一 下载地址:http://www.jetbrains.com/idea/download/1.安装好之后开始创建项目2.选择Maven类型项目,选择JDK3.设置Maven坐标4.需要给新项目Add Framework support5.选择Java EE项目模板6.初始的网站修改pom.xml文件…

Android APP全面屏适配技术要点
全面屏的概念 为什么先要解释一下全面屏,因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕,100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和…
PHP数据库连接池SQL Relay安装使用
SQL Relay按照其官网http://sqlrelay.sourceforge.net/index.html上所说是:A powerful database connection management solution. 翻译为中文也就是说SQL Relay是一个开源的数据库池连接代理服务器。目前SQL Relay支持的数据库很多: SQL Relay supports…