PHP file_put_content函数写文件鸡肋绕过

2015-10-06 01:27:14 17 7118


昨天遇到个站,非常奇葩,把客户的评论写到文件里面,而且开了报错。所以就很容易地看出了那个文件的源码,大概是这样的:
<?php
$name1 = $_POST['filename1'];
$name2 = $_POST['filename2'];
$val = $_POST['val'];
file_put_contents('./company_list/'.$name2.'-'.$name1.'.txt', $val);
?>
所以,我就想,能不能把那个.txt截断,然后先后在本地搭建了Windows环境和centos环境。

这是fuzz脚本:
import requests

for i in range(256):
    url = 'http://localhost/test/1.php'
    data = {'filename1':'1.php%s' % chr(i+1),'filename2':'2','val':'<?php phpinfo();?>'}
    a = requests.post(url = url, data = data)
win下的结果:

发现在windows下可以使用“:”截断后面的.txt,让上传的文件变成了.php,原因是windows不允许”:”等一些特殊符号存在于文件名中,在linux中则可以存在。

之所以说鸡肋,是因为这样并没有什么卵用,只是上传了个php文件而已,file_put_content函数相当于是fopen,fwrite,fclose的打包函数,但是由于并不存在”2-1.php:.txt”文件,尽管fopen函数写了个文件名到文件夹里,不过fwrite函数无法将内容写入该文件中,因此该文件只能是空文件。

会不会覆盖其他文件呢?我试了一下,对原文件内容似乎也没有影响,我的notepad++还是提示该文件已更改,是否reload,reload以后,发现内容并没有改变。

本文只是为了抛砖引玉,看看大牛们有没有其他的奇淫思路。

自评TCV:2

关于作者

range4篇文章45篇回复

评论17次

要评论?请先  登录  或  注册