免责申明
本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
一、前言
不会存在相关的POC,要POC的师傅可以划走啦,这个文章记录一下自己在给xx做代码审计的一次权限绕过,大致源码方式是(得到目标->提取指纹->github搜索->拿到源码),这里可实现前台rce效果,着重讲解如何进行权限绕过的审计。
二、审计过程
在拿到源码之后,先来查看文件目录。
可以看到为经典的TP开发框架,这里让其页面报错发现为TP5.0.10。
使用工具进行扫描之后未发现漏洞,开始审计,这里我们先看Application下的Controller层。
admin目录就没必要看了,直接看前台可以访问到的即可,api目录,查看相关代码。
这里可以看到存在一个方法upField方法,代码如下:
public function upField(){
$table=input('table');//表名
$id_name=input('id_name');//条件字段
$id_value=input('id_value');//条件值
$field=input('field');//修改的字段
$field_value=input('field_value');//修改的值
if ($field_value=='false'){
$field_value=2;
}
if (empty($table)||empty($id_name)||empty($id_value)||empty($field)||$field_value===false){
return ajaxReturn(0,'参数不足');
}
$where[$id_name]=['eq',$id_value];
$status=Db::name($table)->where($where)->setField($field,$field_value);
if ($status){
return ajaxReturn(200,'操作成功');
}else{
return ajaxReturn(0,'操作失败');
}
}
可以看到最终调用了方法setFiled。
跟入发现调用的是update更新方法,并且这里对更新的表table也是可控的,内容也是可控的,所以第一时间想到的就是把管理员密码通过方法给更新掉。
先来看看数据库的信息。
可以看到存储在了ybk_admin_user表当中,password其实可以看出来是md5加密的,保险起见从代码找下password的存储方式。
可以看到用户输入的password经过md5加密与数据库当中取出来的password进行比较,说明确实是md5加密。
三、漏洞验证
访问路由http://127.0.0.1/index.php/api/Api/upField
可以看到参数不足,开始补充参数,再经过慢慢调试之后如下payload:
http://127.0.0.1/index.php/api/Api/upField?table=admin_user&id_name=user_id&id_value=1&field=password&field_value=1
这里表示操作admin_user表,并且字段为user_id值为1其中的password字段的值为1。
查看一下数据库的值。
可以看到成果更改了,因为登陆验证为md5加密比较,所以我们把我们想要更改的密码进行md5加密之后更改即可,这里以123为例。
进行修改:
查看数据库:
尝试登陆。
四、完结
原文始发于微信公众号(进击安全):某CMS权限绕过漏洞(0Day)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论