PHP原生开发审计

PHP原生开发审计
SQL注入挖掘
产生条件
1. 有可控的参数 2. 参数没有被进行严格的过滤检测 3. 参数被用来执行sql语句挖掘技巧
+ 正则搜索:PHPStrom正则语句:(update|select|insert|delete|).*?where.*= + 功能追踪:查询功能点所对应的文件中是否存在注入 + 语句监控:利用数据库监控工具监控每个功能执行的语句来判断是否存在SQL注入案例一:
**Bluecms**这里看到有117条结果,如果要产生漏洞,需要满足的条件是
- 有可控的参数
- 参数没有被进行严格的过滤检测
- 参数被用来执行sql语句
由此我们对每条结果进行分析,以查询到的第一条语句为例:
此处的$db->getone是程序自己写的简化查询语句,并没有对传入的值进行过滤
此处$username来自$get[‘username’],我们向上查找
并没有地方使用synlogin函数,也就是参数不可控,所以此处无法产生sql注入
用同样的方法审计其他代码,找到了ad_js.php文件
这里的$ad_id是由GET方法传入的参数,参数可控,上文只对其进行了是否为空的检查,检查不严格,同时$db->getone对语句进行了执行,存在漏洞的三要素满足所以此处应该存在sql注入
构造payload证明存在sql注入
案例二:
**emlog** CNVD-2018-26200小迪此处直接看CNVD的通报
定位到了admin/comment文件
我们依然采用正则法进行筛选
这里有一个这个函数,传入一个ip然后将ip进行拼接后执行sql语句, 这里的db->query()同样是自己写的sql查询,无过滤
注意这里对报错信息进行了输出
我们向上寻找哪里调用了这个函数
来到了admin/comment.php
这里我们来让代码可以成功执行函数
第一个要满足的条件是$action== ‘delbyip’,这里的action来自admin/globals.php,是由$_GET[‘action’]传入
第二个要满足的是对token的校验,需要一个admin用户的token由GET方法传入
第三个就是我们毫无过滤的$ip变量
这里同案例一的区别是这里不对查询成功的值进行回显,同时该程序自定义的查询函数会返回报错信息,所以我们可以采用报错注入
案例三:
**emlog** CNVD-2023-65138此处小迪师傅的讲解稍有问题,以下是我自己的看法
CNVD信息如下
这里提示user.php存在漏洞
这里我们使用一个数据库监测工具来检测运行此页面时都执行了哪些sql语句
再结合代码
此时其实也就是进行了
1 | $users = $User_Model->getUsers($email, $nickname, $page); |
三个操作,我们跟到第一条php语句中
这里$res = $this->db->query(“SELECT * FROM “ . DB_PREFIX . “user where 1=1 $condition order by uid desc $limit”);将数据库中所有的数据取出,然后注意下面的while循环$this->db->fetch_array($res)
这里的fetch会导致执行取出的数据中的sql语言,成功实现二次注入
此时的问题是如何将数据写入数据库中,回看后台页面
这里刚好有导入数据库文件的功能点,我们构造一个用户名为sql语句的用户名即可实现对sql注入payload的控制,例如:
1 | INSERT INTO emlog_user VALUES('2','admin','$P$BMVlZmMwm7LisI3pnP6AH7fcDXt2x3/',(select version()),'admin','n','','qq@qq.com','','127.0.0.1','0','1747918914','1748689621'); |
成功实现二次注入
文件安全类挖掘
任意文件上传类挖掘
产生条件
+ 文件可上传 + 知道文件上传的路径 + 上传文件可以被访问 + 上传文件可以被执行挖掘技巧
+ 脚本文件名:upload.php、up.php、upfile.php、del.php、delfile.php、down.php、downfile.php 、read.php、readfile.php + 应用功能点:下载,上传,读取,删除 --> URL路径 --> 文件地方代码 --> 分析 + 操作关键字:$_FILES、move_upload_file()、上传文件、删除文件、安装文件、上传成功、上传失败等最简单的就是直接搜索 move_upload_file() 文件上传函数,某些网站会进行封装将其封装为upload 或 file 函数等
某些网站存在模板上传功能,虽可能不能直接上传木马,但可以将木马包含在模板压缩包中,使用模板后可能会触发木马
案例一:
**emlog-模板文件上传** CVND-2023-4497首先直接全局搜索 move_upload_file(
此处的俩个函数前均对上传的文件进行了白名单检测,在此就不过多展开了,我们继续查看 $_FILES 的情况
此处允许上传一个 zip 文件对 zip 文件的内容并没有做校验,并且给出了 zip 文件的解压位置,如果确认解压后可以执行那么此处就存在文件上传,由 CNVD 的内容可知此处确实存在文件上传,我们先不看这个继续往下分析一个不存在的深化我们的理解
这里先检测了是否是 zip 文件,然后
1 | $sqlfile['tmp_name'] = dirname($sqlfile['tmp_name']) . '/' . str_replace('.zip', '.sql', $sqlfile['name']); |
判断了解压后的文件是否是一个 .sql 文件,对上传的 zip 文件进行了过滤,所以不存在任意文件上传。不过这里可以上传 .sql 文件要考虑是否可以达到 sql 二次注入的效果,由于我们在研究文件上传所以先略过(其实此处就是 sql 注入的案例三的上传点)
回到前面我们可以上传一个 zip 并且程序将此 zip 走了一个 emUnZip()
函数的主要意思就是根据传入的 $type 值检测不同的内容
- 模板(tpl):检查 zip 中是否存在 header.php 文件。
- 插件(plugin):检查 zip 中是否存在 插件名.php 文件。
- 备份(backup):检查 zip 中第一个文件的扩展名是否为 .sql。
- 更新(update):不做额外校验。
这里我们的值是 tpl ,只需要直接利用默认模板制作 zip 文件就可以了,其实也就是直接将上传的 zip 文件解压到了 ../content/templates/ 路径,我们要继续检查文件是否可以访问和被执行成功
直接复制 ../content/templates/ 路径下的文件夹制作一个包含了恶意代码的zip文件
上传模板并启用
证明存在文件上传
案例二:
**emlog-插件文件上传** CNVD-2023-74535还是案例一的步骤,全局搜索 $_FILES ,然后定位到 /admin/plugin.php 位置
这里同样是上传 zip 然后解压,此处也只是检测了 zip 中是否存在 插件名.php 文件,同样直接搞一个网站自带的插件文件夹然后写个马子就行了,这里就不过多赘述了
任意文件包含&下载(读取)&删除类挖掘
---产生条件
文件包含类:存在 include()、require()、include_once()、require_once() 函数且参数可控文件下载类:存在 file_get_contents()、fread()、readfile()、file()、highlight_file()、show_source()函数且参数可控
文件删除类:存在文件删除函数 unlink() 或文件删除的逻辑(如 system(‘rm’.$val) ),且删除的位置可控即参数可控
文件删除案例一:
**emlog-任意文件删除** CNVD-2021-41633全局搜索 unlink(
这里接收了一个bak参数然后遍历删除bak列表中的所有路径,这里明显存在参数可控,所以这里可能存在任意文件删除
在 admin/ 下创建一个1.txt
访问后成功删除1.txt,任意文件删除漏洞存在
- 标题: PHP原生开发审计
- 作者: S1naG0u
- 创建于 : 2025-06-01 21:55:32
- 更新于 : 2025-08-17 22:21:15
- 链接: https://s1nag0u.github.io/2025/06/01/php原生开发审计/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。