当前位置: 首页 > news >正文

[HCTF 2018]WarmUp (代码审计)

打开题目:

好好好。

看看源码:

? source.php

让我看看!

发现还有个文件叫hint,php

看看:

得到目的文件是ffffllllaaaagggg

分析代码:
 

$_REQUEST

        变量 $_REQUEST用于收集HTML表单提交的数据,默认情况下包含了$_GET,$_POST和$_COOKIE的数组。

        GET是从服务器上获取数据,GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。

        POST是向服务器传送数据,POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。

        通过POST和GET方法提交的所有数据都可以通过$_REQUEST["参数"]获得。

empty()

        empty(var) 函数用于检查一个变量是否为空,当 变量var 存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE。

is_string()

        is_string(var)检测变量是否是字符串,如果var是字符串则返回true,否则返回false。

include

        include语句包含并运行指定文件。

文件查找过程:

        1、被包含文件先按参数给出的路径寻找。

        2、如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找。

        3、如果在include_path下没找到该文件,则include最后才在调用脚本文件所在的目录和当前工作目录下寻找。

        4、如果最后仍未找到文件则include会发出一条警告。

逻辑结构

        传入的file参数需满足以下3个条件,才可包含并运行file:

        (1)不为空。

        (2)为字符串。

        (3)emmm::checkFile($_REQUEST['file']) 返回 true,也就是必须在白名单里。

函数作用:
mb_substr: 获取部分字符串。
mb_strpos: 查找字符串在另一个字符串中首次出现的位置。
in_array($needle, $haystack):needle待搜索值,haystack待搜索数组。

两种方法:
 

NO.1:
我们可以采用的方法就是构造payload?file=hint.php?../../../../../../ffffllllaaaagggg,利用第二个if进行绕过,使checkFlie返回真值,从而包含我们的ffffllllaaaagggg文件得出flag

NO.2:
我们可以通过对?进行二次编码从而绕过p a g e = u r l d e c o d e ( _page = urldecode( 
page=urldecode(page)
?file=hint.php%253f../../../../../ffffllllaaaagggg
原理如下:在我们将参数传给file时,服务器端会自动进行一次url解码,然后这里还有个urldecode再进行一次解码。共两次解码,所以我们可以使用两次编码进行绕过urldecode,?一次url编码%3f,二次url编码%253f。然后就是第一种方法中。

就得到了flag。

相关文章:

  • 深度解读 Cascades 查询优化器
  • 提升英语学习效率,尽在Eudic欧路词典 for Mac
  • redis基本用法学习(主要数据类型)
  • Javascript高频面试题
  • 小程序使用Nodejs作为服务端,Nodejs与与MYSQL数据库相连
  • 【UE 材质】切换颜色、纹理时的过渡效果
  • 网络安全Web学习记录———CTF---Web---SQL注入(GET和POST传参)例题
  • 各技术栈需要掌握的知识
  • 01.Git分布式版本控制工具
  • CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版
  • 人工智能与大数据的紧密联系
  • 计算机网络考研辨析(后续整理入笔记)
  • 时序预测 | Python实现XGBoost电力需求预测
  • Flask学习三:模型操作
  • 《Kotlin核心编程》笔记:反射、注解和加锁
  • ----------
  • “大数据应用场景”之隔壁老王(连载四)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Golang-长连接-状态推送
  • Javascripit类型转换比较那点事儿,双等号(==)
  • linux学习笔记
  • React as a UI Runtime(五、列表)
  • React组件设计模式(一)
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Twitter赢在开放,三年创造奇迹
  • 程序员该如何有效的找工作?
  • 构造函数(constructor)与原型链(prototype)关系
  • 聊聊redis的数据结构的应用
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 数据结构java版之冒泡排序及优化
  • Spring Batch JSON 支持
  • 仓管云——企业云erp功能有哪些?
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #define 用法
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $NOIp2018$劝退记
  • (10)STL算法之搜索(二) 二分查找
  • (pojstep1.1.2)2654(直叙式模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (万字长文)Spring的核心知识尽揽其中
  • (一) storm的集群安装与配置
  • (转)详解PHP处理密码的几种方式
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @font-face 用字体画图标
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [Android] Implementation vs API dependency