0%

第27天-PHP应用&原生语法&全局变量&数据接受&身份验证&变量覆盖&任意上传

演示案例:

➢ WEB开发-原生PHP-超级全局变量

➢ WEB开发-原生PHP-代码审计案例

一、变量覆盖安全

$GLOBALS:这种全局变量用于在PHP脚本中的任意位置访问全局变量

二、数据接收安全

$_REQUEST:$_REQUEST 用于收集 HTML 表单提交的数据。

$_POST:广泛用于收集提交method=”post” 的HTML表单后的表单数据。

$_GET:收集URL中的发送的数据。也可用于提交表单数据(method=”get”)

$_ENV:是一个包含服务器端环境变量的数组。

$_SERVER:这种超全局变量保存关于报头、路径和脚本位置的信息。

三、文件上传安全

$_FILES:文件上传且处理包含通过POST方法上传给当前脚本的文件内容。

$_FILES[‘userfile’][‘name’]     //客户端机器文件的原名称。

$_FILES[‘userfile’][‘type’]     //文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。

$_FILES[‘userfile’][‘size’]     //已上传文件的大小,单位为字节。

$_FILES[‘userfile’][‘tmp_name’] //文件被上传后在服务端储存的临时文件名。

$_FILES[‘userfile’][‘error’] //和该文件上传相关的错误代码。此项目是在 PHP 4.2.0 版本中增加的。

四、身份验证安全

$_COOKIE:是一个关联数组,包含通过cookie传递给当前脚本的内容。

本地客户端浏览器存储

设置cookie

setcookie(name, value, expire, path, domain);

name:cookie名

value:cookie值

expire:过期时间。常见写法:time()+3600一小时后过去、time()-1删除cookie

path:生效路径

domain:生效域名

$_COOKIE[‘cookie名’]:取cookie值

$_SESSION:是一个关联数组,包含当前脚本中的所有session内容。

:::info
目标服务端存储,存储记录的数据

session_start()开启session会话,这个必须在html前开启

$_SESSION[‘名’]=值,用来存储session数据

unset($_SESSION[名]),删除单个session数据

session_unset(),删除所有session数据

session_destroy(),删除session文件

:::

五、代码审计应用

1、DuomiCMS变量覆盖

漏洞利用原理:

首先这个漏洞是在common.php,里面存在可变变量漏洞。我们可以在URL中构造session的键和值,参数传入common.php,经过拼接后创建session相关变量。这个利用文件comment.php需要满足两点:第一,文件开头执行session_start();第二,引入存在漏洞的common.php。这样我们就能通过Payload伪造管理员session数据。

当访问admin/index.php时,admin/index.php引用了config.php,而config.php引用了check.admin.php,所以这一步就会鉴定我们是否有管理员权限。服务端读取对应session文件里面的session数据,判断管理员权限。因为之前已经伪造好了管理员session,校验通过,所以就能直接登录管理员后台。

参考:

https://blog.csdn.net/qq_59023242/article/details/135080259

这里有三个关键文件

a.common.php这个是漏洞形成代码

1
2
3
4
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

因为可变变量可以伪造session的值

b.攻击利用文件(如,comment.php)

1
2
3
<?php
session_start();
require_once("../duomiphp/common.php");

主要就是要开启session,并且调用了漏洞代码,符合这个条件的其他文件也可以。这样就成功伪造了session凭证。

c. check.admin.php鉴权文件

哪个文件包含或引用了它,自动执行文件内容(里面有鉴权函数或实例),就会鉴权正好读到我们伪造的session数据然后登录管理员账号,index这种admin后台操作文件,它调用了执行鉴权了,我们输入payload之后再访问就成功通过管理员权限执行了

漏洞复现:

/interface/comment.php?_SESSION[duomi_admin_id]=10&_SESSION[duomi_group_id]=1&_SESSION[duomi_admin_name]=zmh

伪造管理员session数据

成功登录

2、YcCms任意文件上传

参考:https://zhuanlan.zhihu.com/p/718742254

?a=call&m=upLoad send

漏洞利用:

首先用小皮搭建一下这个网站,登录到后台

这里有一个上传logo,这里采用了mime类型校验,只允许上传image/png和image/x-png,这里一会儿会从代码中讲解。

上传网址是http://yccms.com/admin/?a=call&m=upfile&type=content

我们确保mime类型是image/png,内容末尾写上后门,直接蚁剑连一下。

漏洞原理:

这个是关键的上传代码,看到这个方法里面创建了一个LogoUpload实例,并且调用了out()函数

这个是LogoUpload类内的out()函数,发现法设置了mime类型白名单,只允许image/png 和 image/x-png上传