1、%00截断
这个只有php <= 5.3的才有。高的就不行了。所以就先不试了。(懒得下php5.3了= =)大概就是如下例:
test.php%00.jpg
这是程序就会去掉%00后面的字符串。所以程序读取时候就变成了
test.php
2、0x00截断
原理是,程序读取文件名时。遇到0x00。就认为文件名结束了。因为0x00就是字符0.也就相当于false和空。类似于c语言读取字符串遇到\0认为是字符串结束一样。
我们来测试一下。我们做好一个php文件,用来打印上传文件的信息。
接着上传一个后门文件test.php.jpg
通过burp截包。
我们到hex那里去看十六进制。找到上传的文件名。之后就去找文件名中的”.”(点)。点的十六进制是0x2e。我们可以看到这里又两个2e,因为我的文件是test.php.jpg有两个点。我们把第二个点的2e修改成00
可以看到,修改后立即生效,文件名变成了test.phpjpg。第二个点没了。我们forward上传看看。
可以看到。test.php.jpg在上传的时候,因为截断的原因,变为了test.php。
利用:
百度了一下,这个利用方式可以这样子:
1、当上传文件的上传路径可控时,可以配合输入的上传路径进行截断上传。
如:只能上传Jpg,用户可以输入的变量有
上传路径 (string)
上传文件 (file)
那么可以这样子上传
路径:upload/ a.php. 这个.用brup修改为0x00
文件:a.jpg 内容为php一句话木马
到时它拼接上传的时候就会这样
upload/a.php(截断)a.jpg
例子:
我们的文件上传的php代码稍加修改,变为如下:
判断了后缀名必须时jpg,但是这里的漏洞就是直接将path和filename拼接起来了。
那么我们就只能在path上面下手了。test.jpg里面是php一句话木马
\
我们要去hex那里找到upload/test.php.
forward上传。看到回显信息是成功的
我们去服务器那里看看。成功截断
当然也能成功执行命令
2、暂时还没想到 ==
3、#截断
这个在url可以截断。如下图:
#截断后:
这个只能在url中使用,即Url中#号后面的自动去掉。暂时没有想到什么利用方式。就先记着先把。
4、?截断
和上面的#号截断类似,也是只能url里面用。用?时,url会认为后面加的是get变量。即可截断。实例:
这个也暂时没想到利用方式,也就先记着先把。