ctf.show 萌新模块 web12关, 这一关考察的是代码执行漏洞的利用, 重点在于命令执行函数的利用方式, 推荐使用反引号(``) 或者 base64加密绕过
页面中展示了部分源码, 并提示我们 falg 就在 config.php文件中, 读取文件内容即可拿到 flag
首先分析一下源码
重点在这个if判断中, 过滤了参数中的 system exec highlight cat . php config 关键字, 只要绕过这些过滤条件就能使用 eval()函数执行代码了
方法一, base64加密绕过
base64_decode(); -- base64解码,常用于参数绕过
base64_encode(); -- base64加密
查看当前目录文件, 拿到 config.php文件的位置
?c=passthru('ls');
由结果可知, 文件就在当前目录下
接下来获取 config.php 文件名base64加密后的值, 这里使用 base64_encode()函数来加密, 方法不唯一, 其他方式获取加密的值也可以
加密完成后, 利用base64加密后的文件名绕过过滤条件, 查看文件内容, 由于 cat命令被过滤了, 这里使用 more 代替
?c=$a = base64_decode('Y29uZmlnLnBocA==');passthru("more $a");
页面空显示, 但也没报错
右键查看网页源码即可看到文件内容, 获取 flag
方法二, 反引号绕过
反引号``, 可以执行系统命令, 并返回一个字符串类型的变量, 用来保存命令的执行结果, 需要注意的是, 反引号``中的命令会先被执行并将结果以字符串类型的变量返回, 而后再参与到其他代码的执行, 类似一个函数
首先查看当前目录下的文件, 确认 config.php 文件的位置
?c=echo `ls | grep conf*`;
由结果可知, 文件就在当前目录下
上面的命令 `ls | grep conf*` 返回结果是一个内容为 config.php 的字符串变量, 我们将返回结果作为文件名使用 more命令查看文件内容, 即可获取 flag
?c=passthru('more `ls | grep con*`');
页面空显示, 但没有报错, 没有关系, 这很正常
右键查看网页源码即可拿到 flag