BUUCTF [RoarCTF 2019]Easy Calc

文章描述了一种通过AI分析一个PHP脚本,发现其输入验证漏洞,如何构造payload绕过黑名单,最终利用file_get_contents函数获取flag的过程。作者展示了如何利用ASCII码值和巧妙的编码来执行任意代码.
摘要由CSDN通过智能技术生成

代码解释用的ai,我自己解释乱糟糟的

拿到这个题先随便输个数字发现url里面没参数

看源码发现文件calc.php

补全路径看到一个php文件内容:

这段代码是一个简单的PHP脚本,它包含了一个简单的输入验证和执行用户输入的功能。

代码逻辑如下:

  1. 首先,通过error_reporting(0);语句关闭错误报告,以防止在代码中发生错误时泄露敏感信息。

  2. 接下来,使用条件语句if(!isset($_GET['num']))检查是否存在名为"num"的GET参数。如果不存在,将调用show_source(__FILE__);函数来显示脚本本身的源代码。这是一种防止代码被直接访问和查看的常见做法。

  3. 如果存在GET参数"num",则将其赋值给变量$str

  4. 定义了一个黑名单数组$blacklist,包含了一些特殊字符和正则表达式,用于检查用户输入是否包含这些字符。

  5. 使用循环遍历黑名单数组中的每个元素,通过preg_match()函数匹配用户输入中是否存在黑名单中的字符。如果匹配成功,将输出"what are you want to do?"并终止脚本执行。

  6. 如果用户输入通过了黑名单检查,将使用eval()函数执行用户输入的代码,并将结果通过echo语句输出。

我的判断来看,这个需要给num参数传入我们能绕过黑名单过滤的攻击语句即可拿到flag

构建的payload:?num=print_r(dirscan('/'))

scandir()函数用于获取指定目录下的所有文件和文件夹的名称。在这里,chr(47)返回ASCII码值为47的字符,即斜线/,所以scandir(chr(47))的作用是获取根目录下的所有文件和文件夹的名称。

  1. 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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值