这题有两个思路,第一个比较简单,第二个的可拓展性高
第一种方法
1.查看源码发现删除文件名末尾的点跟首尾去空只执行一次,那么我们可以构造文件名:info.php.空格. 进行绕过
黑名单过滤,直接引用的 $file_name ,程序先是去除文件名前后的空格,再去除文件名最后的.,再通过strrchar来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用类似info.php. .(两个点号之间有一个空格)绕过,如果重名名了文件的话应该会用$file_ext来进行拼凑文件,这样保存在服务器中的文件将没有后缀(去除了.空格)
2.可以看到上传成功
3.但是它实际在服务器中的存储文件名是没有最后那个点的
4.访问执行成功
5.原理就是,过滤程序会先过滤件文件名最后一个点,成为 info.php.空格,然后strrchr
()函数截取最后一个点以及后面的字符串,剩下 .空格,接着再过滤尾部的空格,就只剩下一个点(.)了,. 与黑名单对不上,就绕过了服务器检测,服务器认为他是合法的就把他原来的文件名存入服务器。然后因为 Windows系统是不允许文件名最后面是 . ,会把最后面的点去掉,变成 info.php.空格,因为文件名后面跟空格也是不合法的,所以系统又会把空格去掉。那就还剩下 info.php. 最后把info.php. 后面的点也去掉了,就成了info.php
说的有点绕,我给图大家看下,我在Windows 下在文件名最后加空格和点大家猜猜会怎样
当我回车保存之后,文件名仍然是 info.php,这也就验证了windows下系统会自动删除文件名最后的点和空格这句话。
第二种方法
1.查看源码,发现是黑名单过滤。能用的后缀都被过滤完了
2.但是没有过滤 .htaccess ,那我们可以利用这个。.htaccess 是apache服务器下的控制文件访问的配置文件 ,能实现文件权限,解析,重定向等功能,更详细的解释可以看这里 .htaccess文件配置理解
windows下创建 .htaccess 的方法:
(1)先新建空白文本文档,写入下面我们需要的 .htaccess 规则
AddType application/x-httpd-php .jpg
规则意思是:在这个文件夹下把所有 .jpg 文件当作php文件解析。
(2)点击左上角 文件-->另存为,然后文件名填 .htaccess ,保存类型选所有文件
这样就创建完成了
3.有了思路,那么我们执行起来就简单了。
先把 .htaccess 传上去,上传成功
再上传 info.jpg,上传成功
那这时候我们去访问 info.jpg 会怎样呢
可以看到当作 php文件执行了
上传webshell 也是一样的原理