CTF中basename()绕过小结(ctf base)

网友投稿 594 2022-10-01


CTF中basename()绕过小结(ctf base)

基本用法

概念:​​basename()​​​函数返回路径中的文件名部分。语法:​​​basename(path,suffix)​​​主要参数:​​Path​​

描述:必需,规定要检查的路径。例子:

输出:

​​home.php​​、​​home​​

​​basename​​绕过最早出自于​​basename broken with non-ASCII-chars​​报告,大致意思是:

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

在使用默认语言环境设置时,​​basename()​​会删除文件名开头的非​​ASCII​​字符。测试代码:

返回结果:

= 'index.php';for($i=0; $i<255; $i++){ $filename = $filename.'/'.chr($i); if(basename($filename) === "index.php"){ echo $i.'
'; } $filename = 'index.php';}

返回结果:​​ASCII​​值为47、128-255的字符均可以绕过​​basename()​​

其中47对应的符号为​​'/'​​,在实际场景中没有利用价值那么也就是说我们可以利用一部分不可见字符来绕过​​basename()​​

同时,在测试中也可以发现中文字符也是可以绕过​​basename()​​

例如​​汉字、?、《、》、;​​等中文字符

例题:

​​[Zer0pts2020]Can you guess it?​​

Can you guess it?

Can you guess it?

If your guess is correct, I'll give you the flag.

Source


重点关注:

if (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();}

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

这个正则匹配了​​config.php/​​为​​$_SERVER['PHP_SELF']​​的结尾,我们可以在​​config.php/​​后面加上不可见字符污染来绕过正则匹配题目的考点在于​​highlight_file(basename($_SERVER['PHP_SELF']));​​这里存在一个任意文件读取的漏洞,但是前提是需要source值存在,这里的技巧在于:当我们传入index.php/config.php时,仍然请求的是index.php,但是当basename()处理后,highlight_file()得到的参数就变成了config.php,从而我们就实现了任意文件包含。

结合上面的特性,我们可以构造出payload:

/index.php/config.php/啊?source

在鹤城杯​​2021EasyP​​题目中也是同样的方法,只不过传递的参数变成了​​show_source​​,用​​.​​或者​​[​​就可以将参数传过去,老Trick就不过多赘述了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源流量分析工具-Zeek的安装和使用(开源网络流量分析工具)
下一篇:Java 基础语法让你弄懂类和对象
相关文章

 发表评论

评论列表