反引号的使用以及php短标签
打开页面,发现是源码
1 | <?php |
我们可以看见源码中有两个自定义函数waf()和check()函数
对于第一个waf()函数,我们可以知道
1 | function waf($input){ |
当输入的值为数组时会进入一个死循环,而当输入的值部位数组时,会进入check()函数
1 | function check($input){ |
可见正则过滤了空格、下划线、^、+、eval、{、},且由于是
1 | / /i |
所以是不区分大小写,而对于主体代码
1 | $dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'; |
可知,当?action=pwd时,会回显路径
1 | sandbox/f2f0c289641ba52db7d0edeb85513ada/ |
而我们?action=upload时,会将$data的内容写入到
1 | sandbox/f2f0c289641ba52db7d0edeb85513ada/index.php |
所以我们可以利用这个一点来构造恶意代码,但是它过滤了php,所以我们可以使用php的短标签
1 | <?= ?>相当于<?echo ?> |
而php有一个特性,就是当php代码中有反引号闭合的,就会将反引号闭合的当作是shell命令执行,相当于shell_exec(),所以当禁用shell_exec()时失效
因此可以构造
1 | data=<?`cat%09*`?> |
其中%09是绕过空格过滤的,这样即可读出flag