web第37题
[GXYCTF2019]禁止套娃

打开靶场

审计源代码无发现,使用dirmap进行目录扫描

发现.git目录,猜测存在.git源码泄露,参考:
CTF-WEB:Git 源码泄露
git文件致源码泄露
使用githack工具下载到.git文件夹下的index.php文件


index.php

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {// echo $_GET['exp'];@eval($_GET['exp']);}else{die("还差一点哦!");}}else{die("再好好想想!");}}else{die("还想读flag,臭弟弟!");}
}
// highlight_file(__FILE__);
?>

php代码审计,首先就看到@eval($_GET[‘exp’]);代码执行,执行到这一步需要经过3重正则校验
PHP preg_match():执行正则表达式匹配
PHP preg_replace() 函数
php中的== 和===的用法及区别

第一个if过滤了data/filter/php/phar伪协议,不能以伪协议形式直接读取文件
第二个if参考了大佬的解释:

(?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有。,引用一次正则则变成了[a-z,_]+\([a-z,_]+\((?R)?\)\),可以迭代下去,那么它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的,这其实是无参数RCE比较典型的例子,

第三个if使用正则匹配过滤了et/na/info等关键字,导致get()、phpinfo()等函数不能使用

payload知识点
1.localeconv() 函数返回一包含本地数字及货币格式信息的数组。


可以看到数组返回的第一个就是.
2.current() 函数返回数组中的当前元素的值。
每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素。

取出数组的第一个元素的值即为.
3.scandir列出指定目录中的文件和目录,当参数为.时,即列出当前目录的文件

构造payload读取当前目录下的文件:

?exp=print_r(scandir(current(localeconv())));


读取到当前目录下存在flag.php文件
思考如何读取flag.php文件内容
4.array_reverse()函数以相反的元素顺序返回数组。

?exp=print_r(array_reverse(scandir(current(localeconv()))));


5.next()函数讲内部指针指向数组中的下一个元素,并输出

?exp=print_r(next(array_reverse(scandir(current(localeconv())))));


6.highlight_file将代码高亮显示出来

最终payload:

?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));

其他解法:session_id()实现任意文件读取
参考:无参数rce
[GXYCTF2019]禁止套娃(无参RCE)

session_id可以获取PHPSESSID的值,而我们知道PHPSESSID允许字母和数字出现,而flag.php符合条件.
因此我们在请求包中cookie:PHPSESSID=flag.php,使用session之前需要通过session_start()告诉PHP使用session,php默认是不主动使用session的。
session_id()可以获取到当前的session id。
这样可以构造payload:?exp=readfile(session_id(session_start()));
达到任意文件读取的效果:

即使用session_id获得了PHPSESSID的值flag.php,再使用readfile函数进行文件读取,在此之前需要开启session,即使用session_start()

[GXYCTF2019]禁止套娃相关推荐

  1. BUUCTF [GXYCTF2019] 禁止套娃

    题目分析 这题对我这个小白来说好难理解,慢慢补坑吧.PHP很多常用的函数都不是很了解,命令执行也是呜呜呜感觉学得还不是很精通. 打开题目,只有如下: 看源码也没有什么东西,常见的信息泄露:robots ...

  2. [GXYCTF2019]禁止套娃--详解

    目录 分析 法一 法二 分析 打开连接,发现啥也没有,只有一句话在那,看了源码.抓包数据也没发现啥,用dirsearch目录扫描一下,间隔设置为0.1线程设置为1,防止429,就是跑得比较久 等了一会 ...

  3. [GXYCTF2019]禁止套娃 1

    目录 源码 思路 题解 源码 扫到 .git <?php include "flag.php"; echo "flag在哪里呢?<br>"; ...

  4. java套娃_[GXYCTF2019]禁止套娃

    0x00 知识点 无参数RCE eval($_GET['exp']); 1.利用超全局变量进行bypass,进行RCE 2.进行任意文件读取 形式: if(';' === preg_replace(' ...

  5. 禁止套娃!Redis官网宕机,返回“连接不上Redis”

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Spring Boot + Vue 如此强大?竟然可以开发基于 C/S 架构的应用个人原创+1博客:点击前往,查 ...

  6. DNSSEC?禁止套娃!

    简介 DNSSEC是DNS安全拓展,主要思想是通过在DNS记录中添加加密签名,从而为DNS解析流程提供来源可认证和数据完整性的保障. 本文的目的是帮助大家大致理解DNSSEC的工作流程 建议读者先掌握 ...

  7. 汉诺塔 = 套娃 ?

    递归算法:是一种直接或者间接地调用自身的算法.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归过程一般通过函数或子过程来实现. 递归算法的实质:把问 ...

  8. Python|“套娃”算法-递归算法解决全排列

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 1 什么是递归? 什么是递归?晦涩难懂而又有学术气息的解释网上 ...

  9. 套娃成功!在《我的世界》里运行Win95、玩游戏,软件和教程现已公开

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI <我的世界>(MineCraft)真是一款高自由度的神奇游戏,几乎每隔几天都会有大神用它实现一些奇妙的创意. 最近有一个叫uD ...

最新文章

  1. go语言笔记——go环境变量goroot是安装了路径和gopath是三方包路径
  2. 学习 redux 源码整体架构,深入理解 redux 及其中间件原理
  3. python实现搜索之二分查找
  4. 09花冠钥匙计算机电路图,丰田花冠轿车发动机防盗系统设定
  5. 信息学奥赛一本通(1094:与7无关的数)
  6. PostgreSQL与MySQL的日期类型DATE/date的格式区别
  7. C语言丨检测用户键盘输入数据的合法性
  8. python与机器学习(五)——决策树
  9. 高校云计算机中心建设方案,最新某大学云数据中心建设方案.pdf
  10. 安卓版的水经注地图_水经注万能地图下载器
  11. k2p拆机ttl刷breed_最新k2p 22.10.3.42;22.10.3.38和k2 22.6.532.231拆机ttl刷breed图文教程
  12. Mac 系统文件占用内存过大怎么办?
  13. 二极管压降电压一览表
  14. java获取本机ip的方法
  15. WSO2 XMl转JSON
  16. Chrome常见黑客插件及用法
  17. android 图表实现,Android实现图表绘制和展示
  18. 矮人DOS工具箱 4.2:把DOS/Ghost/分区专家集成至启动菜单
  19. 分布式配置中心 Disconf 安装配置
  20. Farmer John的故事

热门文章

  1. ResNet+cifar10总结-由浅入深
  2. 2018初中计算机考试知识点,2018计算机等级考试考点:考前学习的技巧
  3. usb gadget g_webcam uvc gadget调试
  4. 定时打开指定程序软件
  5. 联通云OSS上传文件
  6. 超实用!7 个优秀的 UI 交互动画技巧
  7. 深度专访丨云和恩墨盖国强,识别它、抓住它,在国产数据库沸腾以前
  8. js 里奇数的判断条件
  9. Vue3 中定义ts 对象
  10. 【AVS】AVS2编码器开源啦:xAVS2