代码解释用的ai,我自己解释乱糟糟的
拿到这个题先随便输个数字发现url里面没参数
看源码发现文件calc.php
补全路径看到一个php文件内容:
这段代码是一个简单的PHP脚本,它包含了一个简单的输入验证和执行用户输入的功能。
代码逻辑如下:
-
首先,通过
error_reporting(0);
语句关闭错误报告,以防止在代码中发生错误时泄露敏感信息。 -
接下来,使用条件语句
if(!isset($_GET['num']))
检查是否存在名为"num"的GET参数。如果不存在,将调用show_source(__FILE__);
函数来显示脚本本身的源代码。这是一种防止代码被直接访问和查看的常见做法。 -
如果存在GET参数"num",则将其赋值给变量
$str
。 -
定义了一个黑名单数组
$blacklist
,包含了一些特殊字符和正则表达式,用于检查用户输入是否包含这些字符。 -
使用循环遍历黑名单数组中的每个元素,通过
preg_match()
函数匹配用户输入中是否存在黑名单中的字符。如果匹配成功,将输出"what are you want to do?"并终止脚本执行。 -
如果用户输入通过了黑名单检查,将使用
eval()
函数执行用户输入的代码,并将结果通过echo
语句输出。
我的判断来看,这个需要给num参数传入我们能绕过黑名单过滤的攻击语句即可拿到flag
构建的payload:?num=print_r(dirscan('/'))
scandir()
函数用于获取指定目录下的所有文件和文件夹的名称。在这里,chr(47)
返回ASCII码值为47的字符,即斜线/
,所以scandir(chr(47))
的作用是获取根目录下的所有文件和文件夹的名称。
-
print_r()
:这是一个打印函数,用于以可读的方式输出变量的内容。它接受一个参数,可以是一个变量或一个数组。在这里,print_r(scandir(chr(47)))
的作用是将根目录下的文件和文件夹的名称以可读的方式打印出来。
但是因为过滤引号和斜杠,我们得想办法将被过滤字符用其他方法表示
查到斜杠的ascii码值为47,我们可以用chr(47)代替'/',但是执行的效果和这个是一样的
新payload:
?num=%20print_r(dirscan(chr(47)))
通过在URL中添加空格字符,可能绕过了对URL进行安全处理的机制,使攻击者可以执行任意代码
拼接路径成功看到根目录下的东西
这个关联数组中第六个元素应该就是我们需要的
先构建一个payload:?num=print_r(file_get_contents('/flag'))
但是因为斜杠被过滤,所以我们还是用chr()函数替换/flag
所以新的payload为:
?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
因为chr返回的就是字符串带引号所以我们只管拼接好就行,不用手动加
拼接好后成功获得flag