BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过

题目


后台PHP源码:

<?php
include 'config.php'; // FLAG is defined in config.phpif (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {exit("I don't know what you are thinking, but I won't let you read it :)");
}if (isset($_GET['source'])) {highlight_file(basename($_SERVER['PHP_SELF']));exit();
}$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {$guess = (string) $_POST['guess'];if (hash_equals($secret, $guess)) {$message = 'Congratulations! The flag is: ' . FLAG;} else {$message = 'Wrong.';}
}
?>

这题有两种解题方式,第一种看这里

include 'config.php'; // FLAG is defined in config.phpif (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF'])) {exit("I don't know what you are thinking, but I won't let you read it :)");
}if (isset($_GET['source'])) {highlight_file(basename($_SERVER['PHP_SELF']));exit();
}

第二种看这里,但是第二种我不会。哈哈哈哈哈哈哈…

$secret = bin2hex(random_bytes(64));
if (isset($_POST['guess'])) {$guess = (string) $_POST['guess'];if (hash_equals($secret, $guess)) {$message = 'Congratulations! The flag is: ' . FLAG;} else {$message = 'Wrong.';}
}

好了,废话不多说。现在开始解题吧!
首先是需要绕过这个正则表达式:

if (preg_match('/config\.php\/*$/i', $_SERVER['PHP_SELF']))

这里是表示不能以config.php为结尾,不然会被拦下。
所以这里可以在config.php后面再加一个文件名,比如:

  • /config.php/index.php
  • /config.php/test.php
  • /config.php/{随便什么文件名都可以}

接下来获取flag是看这个

highlight_file(basename($_SERVER['PHP_SELF']));

关键点是这个函数basename
basename() 函数返回路径中的文件名部分。但是它有个小问题,它会去掉文件名开头的非ASCII值。比如:

  • $url1 = “path/index.php”; // 返回index.php
  • $url2 = “path/index.php”.urldecode(’%D1%A7%CF’); // 返回index.php和乱码
  • $url3 = urldecode(’%D1%A7%CF%B0flag.php+ '); // 返回flag.php,前面的非acsii被删除
  • $url4 = urldecode(’%74%65%73%74%5fflag.php+%D1%A7%CF%B0 '); // 返回flag.php和 后面的非ascii

如图

关于basename函数的bug可以看这里

With the default locale setting "C", basename() drops non-ASCII-chars at the beginning of a filename.

所以payload是:

  • …/index.php/config.php/%ff?source
  • …/index.php/config.php/%a1?source
  • …/index.php/config.php/%df?source

上面的payload随便哪一个都可以,主要是保证config.php后面必须是非ascii值就可以了

获取到的Flag:

BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过相关推荐

  1. basename函数漏洞之[Zer0pts2020]Can you guess it?

    知识点: basename 函数,获取路径中的文件名:比如:test/inde.php/s   就会返回index,php 但是漏洞就是,它会去掉文件名开头的或者结尾的非ASCII值! 例题: 代码: ...

  2. PHP basename() 函数

    定义和用法 basename() 函数返回路径中的文件名部分. 语法 basename(path,suffix) 参数 描述 path 必需.规定要检查的路径. suffix 可选.规定文件扩展名.如 ...

  3. R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator )

    R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator (i ...

  4. php文件名函数,php 获取文件名basename()函数的用法总结

    PHP 中basename()函数给出一个包含有指向一个文件的全路径的字符串,此函数返回基本的文件名,本篇文章收集了关于使用PHP basename()函数获取文件名的几篇文章,希望对大家理解使用PH ...

  5. php文件名函数,详解php 获取文件名basename()函数的用法

    PHP 中basename()函数给出一个包含有指向一个文件的全路径的字符串,此函数返回基本的文件名,本篇文章收集了关于使用PHP basename()函数获取文件名的几篇文章,希望对大家理解使用PH ...

  6. basename函数 中文问题

    前段时间对学校一电影站做了点修改,动态生成文件给用户下载,其中需要向一个页面传递一些参数,有些是中文.今天再去看,发现在下载的时候文件名中的中文全部获取不到,php中使用的是basename函数,前几 ...

  7. php的basename,php basename 函数

    下面来看看提供一关于件路径的组成部分basename函数实例教程 basename ( PHP 4中, PHP 5中) basename -返回文件路径的组成部分 描述 字符串basename (字符 ...

  8. php 中basename,php中的basename函数怎么用

    php中的basename函数的用法:[basename($file)].basename()函数用于返回文件路径中的文件名部分,函数语法为[basename(path,suffix)],其中参数pa ...

  9. php basename() 绕过,【转】PHP里的basename函数不支持中文名的解决

    今天用到basename 函数获取文件名称时,发现如果是中文的文件名返回只有后缀的空文件名(如:.pdf) string basename ( string path [, string suffix ...

最新文章

  1. Mysql InnoDB B+树索引和哈希索引的区别? MongoDB 为什么使用B-树?
  2. [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?
  3. Eclipse 报java.lang.OutOfMemoryError: PermGen space
  4. 奥特曼系列ol光元在哪个服务器,奥特曼系列ol光元怎么合理使用
  5. 通过string型类名实例化一个类
  6. 深度学习主流框架介绍(PyTorch、TensorFlow、Keras、Caffe、Theano、MXNET)
  7. Magento 2.0 Alipay Cross-Border Mobile Payment Extension - Magento 2.0 支付宝跨境支付手机版...
  8. 从计算机系统结构的发展和演变看,近代计算机是以,西南民族大学计算机系统结构试卷B有答案.doc...
  9. 详解boost库中的Message Queue
  10. 浪潮服务器开启虚拟化功能,浪潮服务器-虚拟化解决方案.ppt
  11. 计算机网络WiFi共享,wifi共享软件哪个好 wifi共享软件排行榜推荐
  12. 一文排除R语言热力图所有的坑
  13. java计算机毕业设计vue健康餐饮管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  14. 粤通院 招聘FPGA工程师
  15. 慎用鲁大师 360等软件
  16. 【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui
  17. BMZCTF 网鼎杯 2018 minified
  18. 云原生周报 | 百度开源千万级CPS压测软件 dperf;BFE Server v1.5.0 发布
  19. 终于拿到蚂蚁金服Offer!!!分享一下全程面试题和面试经验!
  20. USB协议学习笔记 - 虚拟串口Virtual Port Com用于LOG打印

热门文章

  1. 搜狗双拼如何打单韵母字
  2. 前端学习--Bable的使用步骤
  3. 初识Cura3D打印开源项目
  4. MobileNetV2: Inverted Residuals and Linear Bottlenecks--M Sandler
  5. python量化策略——改进的美林时钟轮动策略(一)
  6. 手把手教你一键U盘装系统
  7. amcharts使用总结
  8. 特征值问题编程基础:特征值特征向量的求解和性质
  9. Java程序员面试学习资料汇总
  10. sparksql mysql_使用SparkSQL操作MySQL - Spark入门教程