PHP代码审计之文件上传

PHP代码审计之文件上传

1.文件上传原理

将Web木马插入到服务器并且服务器端可以成功解析插入的Web木马

何为上传的Web木马被解析:最简单的例子就是目标服务器后端用PHP语言,那么针对上传的文件我们就要利用PHP木马进行上传,且后缀为.PHP

是否存在上传漏洞的前提条件是:①存在上传点 ②上传点的内容可控③上传的文件可被解析

1.1 文件上传业务流程

通过前端页面上传恶意文件到后端,服务器接收到文件后先将他存储为临时文件,将临时文件移动到信的位置,然后攻击者访问该文件,恶意文件被解析后返回该恶意文件内容。

图片

2.2文件上传利用条件

①Web站点具有上传功能点

②上传的目标文件可被Web服务器解析

③已知上传的目标文件路径以及文件名

④目标文件可被访问

在某种情况下服务器会对上传的文件进行访问控制,也就是说即使将目标文件上传到服务器也无法对其进行访问,无法进一步利用。

1.3 文件上传示例代码

index.html

form标签中action属性定义在哪个文件实现后端文件上传功能,method属性定义上传方式,enctype属性定义上传类型,如果不写浏览器将根据上传文件,自行判断上传文件类型

input标签type属性定义input标签将内容当做什么类型来处理,name属性定义上传文件名

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>文件上传小demo</title>
</head>
<body>
<form  action="demo.php" method="post" enctype="multipart/form-data">  
  <p>请选择上传的文件:</p>
   <input class="upload_file" type="file" name="uploadFile"/>
   <input class="button" type="submit" name="submit" value="上传" />
</form>
</body>
</html>
demo.php
<?php
   if(is_uploaded_file($_FILES["uploadFile"]["tmp_name"]))
  {
       $upFile = $_FILES["uploadFile"];
       $name = $upFile["name"];
       $type = $upFile["type"];
       $size = $upFile["size"];
       $tmpName = $upFile["tmp_name"];

       var_dump($upFile);

       $path = "./".$name;
       move_uploaded_file($tmpName,$path);

       echo "文件上传成功";
  }else
  {
       echo "文件上传失败";
  }

?>

上传dog.jpg作为演示文件

uploadFile就是index.htmlinput标签中name属性值,上传成功后会通过var_dump()函数以键值对的形式打印出$_FILES中保存的所有值。

值得注意的是文件被上传后,默认地会被存储为临时文件(phpBD6C.tmp),需使用move_uploaded_file()函数将临时文件进行移动存储,如果不进行移动在上传代码运行完成之后临时文件将被删除,文件将不会被保存。

图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OMSn2wP-1665538622137)(D:\知识管理\图片\640-1665537458529-84.png)]

1.3.1 PHP超全局变量以及函数介绍

$_FILES

PHP中的超全局变量,用来接收上传文件的所有内容,$_FILES是一个二维数组,数组内容如下:

$_FILES['uploadFile']['name']   客户端文件的原名称。
$_FILES['uploadFile']['type']   文件的 MIME 类型,例如"image/gif"。
$_FILES['uploadFile']['size']   已上传文件的大小,单位为字节。
$_FILES['uploadFile']['tmp_name']   文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir指定。
$_FILES['uploadFile']['error']   该文件上传相关的错误代码。

var_dump()

图片

is_uploaded_file()

图片

move_uploaded_file()

如果移动过程中文件名重复,则会覆盖以后文件。

图片

2.文件上传检测类型

文件上传最重要的是对上传文件的类型进行检测,相关检测方式如下如:

图片

2.1 代码示例

这里代码为前端JS检测代码,上述提到的检测类型代码以及绕过方式会在Upload-Labs靶场中为大家一一讲解。

upload_index.html
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>文件上传JS检测demo</title>
</head>
<body>
<form  action="demo.php" method="post" enctype="multipart/form-data" onsubmit="return checkFile()">
   <p>请选择上传的文件:</p>
   <input class="upload_file" type="file" name="uploadFile"/>
   <input class="button" type="submit" name="submit" value="上传" />


</form>


</body>
</html>

<script type="text/javascript">
   function checkFile() {
  //获取数组下标为0的值,也就是上传的文件名
       var file = document.getElementsByName('uploadFile')[0].value;
       if (file == null || file == "") {
           alert("请选择要上传的文件!");
           return false;
      }
       //定义允许上传的文件类型
       var allow_ext = ".jpg|.png|.gif";
       //提取上传文件的类型
       var ext_name = file.substring(file.lastIndexOf("."));
       //判断上传文件类型是否允许上传
       if (allow_ext.indexOf(ext_name) == -1) {
           var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
           alert(errMsg);
           return false;
      }
  }
</script>

2.2 绕过方式

上传.php文件,提示不允许上传

图片

修改后缀名为.jpg,并使用burp抓包修改将后缀修改回原来的.php绕过js检测

图片

3.文件上传代码审计总结

本次只对文件上传原理以及上传代码如何进行实现进行简单介绍,目的是让大家了解文件上传中前后端代码是如何进行分工配合实现文件上传的。在文件上传代码审记中重点要关注的是上传检测部分的代码,通过审计该部分代码来绕过文件上传检测。后续在Upload-Labs靶场部分会对上述所提到的所有上传检测代码以及绕过方式进行一一介绍以及实战演示。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,您想了解有关 PHP 反序列化代码审计方面的问题。PHP 序列化和反序列化是将 PHP 数据结构转换为字符串,并在需要时将其还原为原始数据结构的过程。反序列化攻击是一种安全漏洞,攻击者可以利用此漏洞在受攻击的服务器上执行任意代码。为了进行反序列化攻击,攻击者需要在 PHP 应用程序中注入恶意序列化数据,并使之触发反序列化操作。 在进行 PHP 反序列化代码审计时,应特别注意以下几个方面: 1.检查是否存在反序列化注入漏洞:要注意所有接受输入的地方(包括 GET 或 POST 请求参数、cookie、session 和文件上传等)是否存在反序列化注入漏洞。攻击者可以在这些位置上注入恶意的序列化数据,从而触发反序列化操作,并在服务器上执行任意代码。 2.检查是否使用了不受信任的序列化数据:应该避免使用从不受信任的来源(如其他服务器或第三方接口)接收到的序列化数据。攻击者可以在这些数据中注入恶意代码,然后在服务器上执行。 3.检查使用了哪些序列化函数:PHP 提供了多种序列化函数,包括 serialize()、unserialize()、json_encode() 和 json_decode() 等。不同的序列化函数对数据结构的处理方式不同,因此需要根据实际情况选择正确的序列化函数。同时,应该避免使用 unserialize() 函数反序列化不受信任的数据,因为这个函数容易受到攻击。 以上是我可以提供的一些反序列化代码审计方面的建议,如还有其他问题,欢迎向我提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值