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

[GXYCTF2019]禁止套娃-使用无参数读文件

点开靶场

发现源码、以及抓包啥都看不出来

用dirsearch扫描发现是git源码泄露,用githack获取源码

查看源码发现最终目标要执行@eval($_GET['exp'])

要执行eval就要通过这些正则,第一个正则匹配不分大小写的php伪协议之类的

重点是第二个正则 

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

大概意思是传递的值是字符串a-z跟上(),然后就会被替换为空,(?R)?的意思是递归匹配。

递归完之判断是否只有;,成立则传进去的 exp 就会被 eval 执行。

举个例子:

a(b(c()));这样的就可以用,反之a('b','c')带有参数的就不能使用。

所以要构造无参数的函数进行命令执行

无参数任意文件读取:查看当前目录的文件名

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

scandir('.');可以用来查看当前目录所有文件名
问题是不能有参数,所以就要想办法来构造这个"."

ocaleconv()返回一包含本地数字及货币格式信息的数组。而数组第一项就是"."

pos()别名current()返回数组中的单元,默认取第一个值;所以pos(localeconv())就会返回数组的第一项且这个第一项刚好就是我们需要的"."

chr(46)也就是字符"."

所以也可以构造46;chr(current(localtime(time()))): 第一个值每秒+1,最多60秒可以得到46

hebrevcl(crypt(arg))可以随机生成一个hash值。第一个大概率是$,小概率是"."

print_r(scandir(chr(ord(hebrevc(crypt(time()))))));多刷新几次一定也能出

最后查看到flag在倒数第二个

再就是如何去读倒数第二个文件

array_reverse() 以相反的元素顺序返回数组;反过来之后flag就在第二个位置了。

next()j将数组中的指针向前移动一位;那么加上next指针就会指向flag了

再利用show_source()把flag读出来

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

http://www.lryc.cn/news/421265.html

相关文章:

  • SpringBoot+MyBatis模板
  • Springboot 定时任务 @EnableScheduling @Scheduled
  • STM32F407ZET6使用LCD(9341)
  • 动手学深度学习7.3 网络中的网络(NiN)-笔记练习(PyTorch)
  • SQL语言-select的使用方法
  • 深入理解Python中的排序算法:快速排序与归并排序实现
  • Linux基础命令 ② 未完成
  • 怎么加密文件?分享文件加密四个方法,2024新版操作教程,教你搞定!
  • cesium加载魔方立方体
  • unity 粒子系统学习
  • CogVideoX环境搭建推理测试
  • STL—容器—list【list的介绍和基本使用】【list的迭代器失效问题】
  • 【面试宝典】MySQL 面试问题
  • 【Cpp筑基】三、对象和类
  • 数据库原理面试-核心概念-问题理解
  • 【JavaScript】JavaScript里的“先斩后奏”之王 shift()方法
  • Python面试宝典第32题:课程表
  • 简单介绍BTC的Layer2项目RGB
  • 跨境电商卖家必看:搭建安全稳定测评自养号环境系统
  • 如何对open62541.h/open62541.c的UA_Client进行状态(在线/掉线)监控
  • 高等数学 第九讲 一元函数积分学的应用
  • django如何更新数据库字段并与数据库保持同步?
  • jenkins插件 SSH Publishers
  • Kafka Client客户端操作详解
  • 【HarmonyOS NEXT星河版开发学习】小型测试案例15-博客列表
  • go-zero中统一返回前端数据格式的几种方式
  • 【向量数据库】Ubuntu编译安装FAISS
  • 制造知识普及(九)--企业内部物料编码(IPN)与制造商物料编码(MPN)
  • 【整数规划】+【0—1规划】解决优化类问题(Matlab代码)
  • Linux下如何使用Curl进行网络请求