作者:yueji0j1anke
首发于公号:剑客古月的安全屋
字数:2909
阅读时间: 35min
声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外。
备注:本文网络摘取,只为学习使用,如有侵权联系作者删除,小编收到后第一时间删除。
目录
-
介绍
-
环境
-
关键字
-
mvc架构
-
10种漏洞挖掘方法
一.大致介绍
相比与.net站,php师傅们要熟悉的多。但大多数漏洞万变不离其宗,即
函数和变量
配合以一些关键字,代码审计想不出洞都很难
二.环境配备
1.seay代码审计系统/phpstorm
2.phpstudy+phpstorm+xdebug
配备过程如下
https://blog.csdn.net/m0_60571842/article/details/133246064
三.关键字
sql注入-> select mysqli mysqluery insert 文件上传-> $_FILES type="file" upload xss -> print echo sprintf var_dump 文件包含 -> require include 等四个函数 代码执行 -> eval assert call_user_func preg_replace 命令执行 -> system exec shell_exec popen proc_open 变量覆盖 —> parse_str() extract() $$ 反序列化 -> serialize() construct destruct ssrf -> file_get_contents 文件删除 -> unlink 变量寻找 -> $_GET $_POST $_FILES $_REQUEST
四.mvc架构讲解
这一块对会java后端的师傅们比较好理解
controller可以简单理解成处理请求的地方,及接受一些传参的函数
调用model去完成数据库的读写操作,随后返回给view,渲染到html上
这里我们采用很经典的一套mvc框架进行演示
比如说这是index.php的源码
但当我们访问
xxx/index.php?s=member&c=account&m=upload 或者 xxx/admin.php?m=Column&a=update&id=3
却能渲染出一个绚丽多姿的页面,比如
m就是model文件,a就是方法,id就是参数
我们可以直接查看源码进行寻找
五.挖掘方法
1.sql注入专场
关键字
get post request 待定函数: echo print
1.数据库监控
一边点各种业务,一边查看数据库监控语句,观察是否有变量可以被我们控制
这里我们选择最简单的seay进行演示
点进首页
发现like功能点存在变量,全局查询找到对应函数
发现确实存在变量,且可控,注入点为单引号
找到对应使用函数位置
跟踪getIP函数
不出意外的话,是xff注入
2.正则表达
相对于数据库监控,正则表达则更显得常用一些。
像sql注入,一般的搜索正则表达式如下
(update|select|insert|delete|).*?where.*=\
搜索出来的东西一个个看,看是否sql语句存在可控变量
进行相关函数跟踪
很明显,没有进行过滤,所以存在sql注入
3.根据1day挖掘
这里拿几个古早的洞进行分析
1.后台注入
https://www.cnvd.org.cn/flaw/show/CNVD-2020-59466
看他的描述文件
这套源码是按照标准的mvc框架进行搭建。
根据mvc路由找到对应文件
这里可以发现有两个对应符号描写文件,我们进入审查,优先发现具有传参的函数
看到有貌似查询数据库操作,点击跟进
发现数据库操作
即这里注入点是括号
我们看看相关数据库操作函数是否存在过滤
继续跟进
在这里echo一下sql,看看是否能被我们控制
显然,存在sql注入
2.前台注入
https://www.cnvd.org.cn/flaw/show/CNVD-2019-05674
直接找到对应路径
发现存在sql执行
追入进行查看
发现进行了魔术引号,且进行了filter_sql进行过滤,进行了大小写转换和关键词的过滤。
但是取死之道已在其中
开启了url编码,我们可以双重url编码绕过
目前我们只知道name参数,但并不知道数据库操作局域,跟进getNameData方法
继续跟进
同样的,在这里echo一下
因为function __construct()为特殊构造函数,只要访问便可自动执行,所以我们可以不加上a参数进行访问
可控
直接构造payload
%25%36%31%25%32%37%25%32%30%25%36%31%25%36%65%25%36%34%25%32%30%25%37%35%25%37%30%25%36%34%25%36%31%25%37%34%25%36%35%25%37%38%25%36%64%25%36%63%25%32%38%25%33%30%25%32%63%25%36%33%25%36%66%25%36%65%25%36%33%25%36%31%25%37%34%25%32%38%25%33%30%25%37%38%25%33%37%25%36%35%25%32%63%25%37%35%25%37%33%25%36%35%25%37%32%25%32%38%25%32%39%25%32%39%25%32%63%25%33%31%25%32%39%25%32%33
当然你也可以使用xdebug调试技术,见前面环境配备技术讲解链接
2.文件删除演示案例
通过搜索关键字
@unlink del unlink
这里通过关键词找到一处删除文件处漏洞且文件参数可控。
接下来尝试跨路径删除
删除成功
3.文件读取
关键词如下
file_get_contents * file_put_contents * fread fgets file parse_ini_file readfile * highlight_file * show_source *
通过关键词搜索发现存在相关功能
接下来寻找使用
找到对应文件
发现函数参数可控
在config里面找到相关前缀路径
进行测试,成功
进行路径跨越读取
成功,利用这个漏洞读取一些配置文件甚至windows.ini也不是不行
4.文件写入
同樣找到用法
进行写入
访问
写入成功
5.文件下载
像之前的都是纯代码审计,其实还可以通过功能点进行测试
比如一些文件下载点
这个跟文件读取的点有些类似,就不再重复
6.文件包含
这里的逻辑是,接受r参数,包含相关文件
如果我们上传了图片马,传参进行相关路径包含,即可完成上传木马操作。
7.RCE 命令执行和代码执行
1.命令执行
这里亦无具体详细,所以下载源码进行审计
搜索system,一下就出来了
查看对应函数
这段代码主要是对上传的文件进行保存并对上传的文件进行压缩处理,但没用进行任何过滤,可能会有注入,我们来看看是否存在变量,跟踪函数调用
存在三处,但我一眼就看中了第四个,因为前三个一定还要继续追踪用处,第四个已经跳脱出inc文件了
这里的脚本代码主要执行文件上传后的操作
获取上传文件的扩展名,并将其转换为小写。 如果文件的扩展名是 'txt',则将上传的文件保存到指定的位置。保存的路径由 WEB_ROOT 和文件名构成。 然后,更新配置数组 $cfg 中的 'weixin_hasverify' 键值为文件名。 如果上传文件的扩展名不是 'txt',则显示错误消息。
而我们的file_save正是触发在后缀名为txt之时
现在我们需要观察网站路由并进行相关函数的触发
http://127.0.0.1/baijiacms-master/index.php?mod=site&act=manager&do=store&op=display&beid=1
是这样一个对应触发
那我们对应setting.php触发如下
http://127.0.0.1/baijiacms-master/index.php?mod=site&act=weixin&do=setting
成功找到对应接口
随便点个txt文件上传
这是$file_full_path的值
不出意外的话
执行的命令会是这样
system('covert xxx 路径 路径') 假如说我们加入|或者&号,那就很爽比如,可惜文件名不能有| convert xxx D:/phpstudy/WWW/bajiacms-master/&whoami&1.txt D:/phpstudy/WWW/bajiacms-master/&whoami&1.txt
不出意外,会返回两次whoami的结果
但需要安装这个
2.代码执行
这里的采用是zzzcms
1 | 1.6.1版本审计
1.6.1版本审计
下载下来进行代码审计,搜索eval等关键词
搜索调用
需要调用这个方法,那么当我们修改模板或者上传文件时即可解析文件,进行eval
构造这个即可完成一个小木马
2 | 2.2.1版本审计
可以看到这里进行了严格的安全过滤
但是采用的是黑名单过滤,总有遗漏的地方。
{if:=`calc`}{end if}
8.验证未授权类型
就是伪造cookie删除cookie进行黑盒测试等
这个也具有典型意义,左边的可以发数据包并且执行,右边的发数据包会被拦截
9.变量覆盖
其实本人一直没怎么挖过变量覆盖,这个洞一向是跟其他漏洞结合从而导致的危险,最常见的是文件包含到配置文件,经常被引用从而导致的危险。但我审计到的源码中基本没有这样的组合拳。所以这里不过多献丑。
10.反序列化
这里拿很经典的phpmyadmin做例子
会自动执行_wake_up魔术方法
刚好wakeup里面存在load函数
跟进load函数,相关函数里面有代码执行,即存在
构造相关poc
即相关类中的相关变量,将其恶意代码写入文件进行file_get_contents
<?php class PMA_Config { var $source = 'ggg.txt'; } $x = new PMA_config(); echo serialize($a); ?>
触发条件总结如下
先触发反序列化,再写入对应后缀文件,file_get_content进行读取之后,进行eval
后续将会推出php篇框架总结,希望各位师傅多多指点~
参考文章: https://www.bilibili.com/video/BV1pQ4y1s7kH/