免费发布信息
当前位置:APP交易 > 热点资讯 > app交易 >  YZM几经周折的积累(鸡肋)审计过程

YZM几经周折的积累(鸡肋)审计过程

发表时间:2021-07-09 16:55:29  来源:红帽社区  浏览:次   【】【】【
红帽社区是一个垂直网络安全社区,融合“红帽先锋”正能量精神,每日分享最新安全资讯,提供安全问答、靶场、众测、漏洞库等功能,是网络安全爱好者学习、交流的优质社区。

几经周折

内容繁多。如果不想看,请翻到最后总结。

天荒夜谈来注入,勿以成败论英雄

寻找的方法方法很简单,seay源码审计系统一把梭(我还在使用上古审计工具,哪位大佬有现代化审计工具求介绍)。

发现在应用/admin下的category控制器中, 变量无单引号注释

追踪该纪律发现是栏目编辑的方法,意味着如果有漏洞的存在 ,那么正常情况下需要后台操作。

发现该语句的执行来自于DB类的query方法。在该cms的核心目录寻找该DB类

继续追中execute方法

由上图可以看出,传入数据先放入lastsql 然后直接执行了。
mysql_query(sql)sql) this->geterr(sql) 这两个方法只要其中一个执行成功就返回真 最后debug一下sql查看是否出现错误

查看addms静态方法,发现只是输出一个错误信息。并不影响。
回头追踪与区别this>geterr(this->geterr(sql)方法。

发现也是获取mysql错误的方法。那么就不用深究了

回到最初,追踪利用条件


发现可以利用的$_POST[‘arrparentid’]引用了safe_replace()函数。 但是这不是一个PHP的函数。所以全局搜索获取到


但是


这里可以有方式绕过。但是我太菜了。
最后发现


变量$_POST[‘arrparentid’]
会被重置为
放弃。

雨天过后是晴天,柳暗花明又一村

经过今天的翻找,终于在Yzmphp/core/class/databack.class.php(121行)
找到直接使用了$db_query的地方。如下图

但是该处有可控变量table吗?搜索一下使用了该方法的地方 



与之对应的table是tables[tables[id] 来自于控制器中

来自于_session (application/admin/controller/database.class.php(157行)) _SESSION[‘backup_tables’] = tables;tables; session来自于table (application/admin/controller/database.class.php(126行))


$table的来自于POST方法。那么至此确定,输入完全可控。

刚才是向上追寻注入点,现在向下追寻是否过滤
由于内容过多只做结果说明。 “向下寻找并无过滤”。

床头屋漏无干处,但见彩虹风雨后

暴雨就是注入点的利用有点尴尬。
由最开始的地方可以知道。该数据的入口在yzm/core/class/databack/class.php的backup方法中(115行)。
而引用该方法的的地方在application/admin/controller/databases.class.php的export_list方法中(126行)。
那么寻找到使用该方法的后台路径。备份数据库处

数据包如下

表明处为注入点。尝试报错。
但是因为无回显的注入。所以先想别的方法验证
所以先查看备份配置文件application/admin/controller/databases.class.php

尝试payload
&tables%5B%5D=yzm_admin_log' and sleep(10) and 1='1

进入
$result = $db->fetch_array($db->query("SHOW CREATE TABLE {table}`"))` 之后 其中的db->query()变成
SHOW CREATE TABLE yzm_admin_log' and sleep(10) and 1='1

接下来就是验证环节
但是show create table我不知道该怎么利用注入

这时候出现问题了!!


但是数据备份已经创建

内容为空,仅仅执行了开始的头部。如下图

可以看到,没有执行到
@un($_SESSION['backup_config']['path'].'backup.lock');

锁文件还在
可以确定。执行到了
出错了之后就终止了
最后发现有个start的传参决定了运行创建session还是运行sql语句。 如果start 可控传参,那么就可以跳过
SHOW CREATE TABLE {table}`` 那么追踪start

来自于get传参。那么试着伪造一个。
在这里有个坑, 如果有dosubmit就会进入初始化


所以修改数据包
删除dosubmit参数。

elseif (isset($_GET['id']) && isset($_GET['start'])) {
因为这里还会判断ID和start所以在用get方式传参ID和start
传参如下,红色地方为需要注意的点,两个get传参,一个post传参。最后查询的语句中$table为空,而且不执行

SHOW CREATE TABLE {$table}`
OK 。可以。查询下,为啥table为空

Table来自于上个if判断条件。因为没有赋值所以为空。

乱花渐欲迷人眼 浅草才能没马蹄

总结与POC

上面发现如何修改都不能到第二里面,并且设置$_session table
所以


先利用 157行设置$_session table

然后再使用第二个数据包
操作如下:
1、设置payload语句进入session

2、触发payload

总结

1、首先是sql注入找注入点。但是没成功
2、找到注入点,无回显,不知道如何利用
3、利用写文件两次触发。
上面的第一步为第二步找到了可能纯在注入的漏洞。
第二步解决了第三步如何触发的思路。

几经周折

内容繁多。如果不想看,请翻到最后总结。

天荒夜谈来注入,勿以成败论英雄

寻找的方法方法很简单,seay源码审计系统一把梭(我还在使用上古审计工具,哪位大佬有现代化审计工具求介绍)。

发现在应用/admin下的category控制器中, 变量无单引号注释
image.png
追踪该纪律发现是栏目编辑的方法,意味着如果有漏洞的存在 ,那么正常情况下需要后台操作。

发现该语句的执行来自于DB类的query方法。在该cms的核心目录寻找该DB类
image.png
继续追中execute方法
image.png
由上图可以看出,传入数据先放入lastsql 然后直接执行了。
mysql_query(sql)sql) this->geterr(sql) 这两个方法只要其中一个执行成功就返回真 最后debug一下sql查看是否出现错误
image.png
查看addms静态方法,发现只是输出一个错误信息。并不影响。
回头追踪与区别this>geterr(this->geterr(sql)方法。
image.png
发现也是获取mysql错误的方法。那么就不用深究了

回到最初,追踪利用条件

image.png

发现可以利用的$_POST[‘arrparentid’]引用了safe_replace()函数。 但是这不是一个PHP的函数。所以全局搜索获取到

image.png

但是

image.png

这里可以有方式绕过。但是我太菜了。
最后发现

image.png

变量$_POST[‘arrparentid’]
会被重置为
放弃。

雨天过后是晴天,柳暗花明又一村

经过今天的翻找,终于在Yzmphp/core/class/databack.class.php(121行)
找到直接使用了$db_query的地方。如下图
image.png

但是该处有可控变量table吗?搜索一下使用了该方法的地方 ![image.png](/img/sin/M00/00/2F/wKg0C17Q3jqALlkrAAAmU32VHJw320.png) 与之对应的table是tables[tables[id] 来自于控制器中
image.png
来自于_session (application/admin/controller/database.class.php(157行)) _SESSION[‘backup_tables’] = tables;tables; session来自于table (application/admin/controller/database.class.php(126行)) ![image.png](/img/sin/M00/00/2F/wKg0C17Q3peAZpmUAABFxJYU0eI109.png) table的来自于POST方法。那么至此确定,输入完全可控。

刚才是向上追寻注入点,现在向下追寻是否过滤
由于内容过多只做结果说明。 “向下寻找并无过滤”。

床头屋漏无干处,但见彩虹风雨后

暴雨就是注入点的利用有点尴尬。
由最开始的地方可以知道。该数据的入口在yzm/core/class/databack/class.php的backup方法中(115行)。
而引用该方法的的地方在application/admin/controller/databases.class.php的export_list方法中(126行)。
那么寻找到使用该方法的后台路径。备份数据库处
image.png
数据包如下
image.png
表明处为注入点。尝试报错。
但是因为无回显的注入。所以先想别的方法验证
所以先查看备份配置文件application/admin/controller/databases.class.php
image.png
尝试payload
&tables%5B%5D=yzm_admin_log' and sleep(10) and 1='1

进入
$result = $db->fetch_array($db->query("SHOW CREATE TABLE {table}`"))` 之后 其中的db->query()变成
SHOW CREATE TABLE yzm_admin_log' and sleep(10) and 1='1
image.png

接下来就是验证环节
但是show create table我不知道该怎么利用注入

这时候出现问题了!!

image.png

但是数据备份已经创建
image.png
内容为空,仅仅执行了开始的头部。如下图
image.png
可以看到,没有执行到
@un($_SESSION['backup_config']['path'].'backup.lock');
image.png
锁文件还在
可以确定。执行到了
出错了之后就终止了
最后发现有个start的传参决定了运行创建session还是运行sql语句。 如果start 可控传参,那么就可以跳过
SHOW CREATE TABLE {table}`` 那么追踪start
image.png
来自于get传参。那么试着伪造一个。
在这里有个坑, 如果有dosubmit就会进入初始化

image.png
所以修改数据包
删除dosubmit参数。

elseif (isset($_GET['id']) && isset($_GET['start'])) {
因为这里还会判断ID和start所以在用get方式传参ID和start
传参如下,红色地方为需要注意的点,两个get传参,一个post传参。最后查询的语句中$table为空,而且不执行

SHOW CREATE TABLE {$table}`
OK 。可以。查询下,为啥table为空
image.png

Table来自于上个if判断条件。因为没有赋值所以为空。
image.png

乱花渐欲迷人眼 浅草才能没马蹄

总结与POC
image.png
上面发现如何修改都不能到第二里面,并且设置$_session table
所以

image.png
先利用 157行设置$_session table
image.png
然后再使用第二个数据包
操作如下:
1、设置payload语句进入session
image.png
2、触发payload
image.png

总结

1、首先是sql注入找注入点。但是没成功
2、找到注入点,无回显,不知道如何利用
3、利用写文件两次触发。
上面的第一步为第二步找到了可能纯在注入的漏洞。
第二步解决了第三步如何触发的思路。




责任编辑:
声明:本平台发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。

德品

1377 678 6470