file_put_contens小trick

file_put_contents tricks

0x01 trick1

来自于P神的实例:

<?php
$text = $_GET[‘text‘];
if(preg_match(‘[<>?]‘, $text)) {
    die(‘error!‘);
}
file_put_contents(‘config.php‘, $text);

希望getshell,但是限制了<>,无法写入PHP标准代码。

来自于P神的小密圈分享:

          file_put_contents的第二个参数,可以是数组,并且会将数组转化成字符串写入。并且得益于PHP弱类型,在正则匹配前,传入的数组会被强制转化成字符串,也就是Array。因此可以绕过正则匹配,并且能够正常写入。

实例:

    

0x02 trick2

另一个关于file_put_contents的小trick,当file_put_contents、copy、file_get_contents等读取写入操作与unlink、file_exists等删除判断文件函数之间对于路径处理的差异导致的删除绕过

<?php
$user=$_GET[‘user‘];
var_dump($user);
echo $user[‘name‘];
$filename = __DIR__.‘\\‘.$user[‘name‘];
echo $filename;
$data = $user[‘info‘];

file_put_contents($filename, $data);
if(file_exists($filename)){
unlink($filename);
}

p牛在小密圈说过类似问题

查看php源码,其实我们能发现,php读取、写入文件,都会调用php_stream_open_wrapper_ex来打开流,而判断文件存在、重命名、删除文件等操作则无需打开文件流。

我们跟一跟php_stream_open_wrapper_ex就会发现,其实最后会使用tsrm_realpath函数来将filename给标准化成一个绝对路径。而文件删除等操作则不会,这就是二者的区别。

所以,如果我们传入的是文件名中包含一个不存在的路径,写入的时候因为会处理掉“../”等相对路径,所以不会出错;判断、删除的时候因为不会处理,所以就会出现“No such file or directory”的错误。

所以,linux可以通过xxxxx/../test.php、test.php/. 来绕过删除

windows可以通过test.php:test test.ph<来绕过文件删除

拿windows实例:

http://127.0.0.1/l.php?user[name]=2.php:test&user[info]=2y 会生成2.php

http://127.0.0.1/l.php?user[name]=2.ph<&user[info]=2y 会写入内容

学习资料:http://www.am0s.com/functions/386.html

原文地址:https://www.cnblogs.com/BOHB-yunying/p/11638492.html

时间: 2024-11-18 06:51:58

file_put_contens小trick的相关文章

弱智错误+小trick集合

这里就不区分错误和trick了 不定期更新 1.多维dp的时候一定要计算空间复杂度,必要时可以考虑滚动或者卡卡边界 2.dp的东西和匹配相关的时候,可以考虑将每组匹配拆开dp,即记录一维表示当前有多少个点已经被选作了匹配的一个点但是另一个点尚未确定 3.dp的东西意义有"连续\(m\)个至少有一个/不能有连续\(m\)个"的序列的时候,我们可以记录\(f_i\)表示长度为\(i\)的合法序列,同时从\(f_{i-1},f_{i-2},...,f_{i-m}\)转移 原文地址:https

[小Trick]哈希值结构体

struct hashv { int len; ull val; hashv(char c) { val = c, len = 1; } hashv() : len(0), val(0) {} hashv operator+(hashv b)const { hashv ret; ret.len = len + b.len; ret.val = val + cf[len]*b.val; return ret; } bool operator==(hashv b)const { return len

小trick之mklink

因为要看很多论文就下载安装了zotero,又因为文献库的文件夹在安装目录太深,找起来太麻烦,再加上是软件本身的安装目录,因此把论文都下载在默认文件中总会天然地产生不安全感,万一误删软件怎么办.所以在文献库里面加了论文的链接. 又过了一段时间,感觉自己电脑和实验室电脑两头忙,U盘未免太忙了. 所以,就想到把本地文件夹和云盘文件夹做同步.但是本地文件夹好几个,一个个去同步也很麻烦. 于是想到,能不能在本地建一个文件夹,然后把需要同步的本地文件夹都丢到这个文件里. 可是,问题来了,全部移过来,之前加到

lua小trick

实现for循环中的continue语法 通过while true do end 包装 实现 例如: 1 if condition do 2 3 while true do 4 5 if condition2 do 6 7 break 8 9 end 10 11 do sth 12 13 .......... 14 15 break 16 17 end 18 19 end 原文地址:https://www.cnblogs.com/SoraCCC/p/9639531.html

二分查找-数组实现(小trick)

template<typename T> int binarySearch(T arr[], int n, T target){ int l = 0, r = n-1; //在[l...r]范围内寻找targetwhile(l <= r){ //当 l == r 时 区间有效 int mid = l+(r-l)/2; if(arr[mid] == target) return mid; if(target > arr[mid]) l = mid + 1; //target在[mid

C/C++ 中带空格字符串输入的一些小trick

今天在重温 C++ 的时候发现自己存在的一些问题,特此记录下来. 我们可以看一下下面这段代码: #include <iostream> #include <cstdio> #include <string> #include <cctype> using namespace std; int main(int argc, char const *argv[]) { string s; cin >> s; int cnt[26]={0};//字母统

HDU 5667 Sequence(矩阵快速幂+费马小定理)

题意:不好复制,直接上链接http://acm.hdu.edu.cn/showproblem.php?pid=5667 思路: 观察递推式我们可以发现,所有的f_if?i??都是aa的幂次,所以我们可以对f_if?i??取一个以aa为底的loglog,即g_i=log_a\ f_ig?i??=log?a?? f?i?? 那么递推式变成g_i=b+c*g_{i-1}+g_{i-2}g?i??=b+c∗g?i−1??+g?i−2??,这个式子可以矩阵乘法 这题有一个小trick,注意a\ mod\

解决TCP延迟应答(Delay ACK)问题的3个小Trick-(续:正规的做法)

这个话题确实有点乱,事实就是如此.        在<解决TCP延迟应答(Delay ACK)问题的3个小Trick>中,我描述了一种通过修改发送端协议栈的方式来消解Delay ACK带来的危害的方案,这实属一种无奈的走火入魔的做法,因为你无法控制数据接收端,因为总是有人认为网络上的任何所谓的"延迟"都是坏事,完美主义者总是试图消解任何的延迟!但事实上...        再次重申,不要以为Delay ACK是什么坏事,千万不要!正如不要认为拥塞窗口越大越好一样,任何人都无

[转] 【译】让人倾倒的 11 个 npm trick

[From] https://segmentfault.com/a/1190000006804410 本文转载自:众成翻译译者:文蔺链接:http://www.zcfy.cc/article/1206原文:https://nodesource.com/blog/eleven-npm-tricks-that-will-knock-your-wombat-socks-off/ 有效率地使用 npm 可能会很困难.内置特性堆积如山,尝试学习它们是很艰巨的任务. 就我个人而言,单学习并使用其中一些小 t