YZM几经周折的积累(鸡肋)审计过程
几经周折
内容繁多。如果不想看,请翻到最后总结。
天荒夜谈来注入,勿以成败论英雄
寻找的方法方法很简单,seay源码审计系统一把梭(我还在使用上古审计工具,哪位大佬有现代化审计工具求介绍)。
发现在应用/admin下的category控制器中, 变量无单引号注释
追踪该纪律发现是栏目编辑的方法,意味着如果有漏洞的存在 ,那么正常情况下需要后台操作。
发现该语句的执行来自于DB类的query方法。在该cms的核心目录寻找该DB类
继续追中execute方法
由上图可以看出,传入数据先放入lastsql 然后直接执行了。
mysql_query(this->geterr(sql)
这两个方法只要其中一个执行成功就返回真
最后debug一下sql查看是否出现错误
查看addms静态方法,发现只是输出一个错误信息。并不影响。
回头追踪与区别sql)方法。
发现也是获取mysql错误的方法。那么就不用深究了
回到最初,追踪利用条件
发现可以利用的$_POST[‘arrparentid’]引用了safe_replace()函数。 但是这不是一个PHP的函数。所以全局搜索获取到
但是
这里可以有方式绕过。但是我太菜了。
最后发现
变量$_POST[‘arrparentid’]
会被重置为
放弃。
雨天过后是晴天,柳暗花明又一村
经过今天的翻找,终于在Yzmphp/core/class/databack.class.php(121行)
找到直接使用了$db_query的地方。如下图
但是该处有可控变量table吗?搜索一下使用了该方法的地方
与之对应的table是id] 来自于控制器中
来自于_session
(application/admin/controller/database.class.php(157行))
_SESSION[‘backup_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控制器中, 变量无单引号注释
追踪该纪律发现是栏目编辑的方法,意味着如果有漏洞的存在 ,那么正常情况下需要后台操作。
发现该语句的执行来自于DB类的query方法。在该cms的核心目录寻找该DB类
继续追中execute方法
由上图可以看出,传入数据先放入lastsql 然后直接执行了。
mysql_query(this->geterr(sql)
这两个方法只要其中一个执行成功就返回真
最后debug一下sql查看是否出现错误
查看addms静态方法,发现只是输出一个错误信息。并不影响。
回头追踪与区别sql)方法。
发现也是获取mysql错误的方法。那么就不用深究了
回到最初,追踪利用条件
发现可以利用的$_POST[‘arrparentid’]引用了safe_replace()函数。 但是这不是一个PHP的函数。所以全局搜索获取到
但是
这里可以有方式绕过。但是我太菜了。
最后发现
变量$_POST[‘arrparentid’]
会被重置为
放弃。
雨天过后是晴天,柳暗花明又一村
经过今天的翻找,终于在Yzmphp/core/class/databack.class.php(121行)
找到直接使用了$db_query的地方。如下图
但是该处有可控变量table吗?搜索一下使用了该方法的地方
![image.png](/img/sin/M00/00/2F/wKg0C17Q3jqALlkrAAAmU32VHJw320.png)
与之对应的table是id] 来自于控制器中
来自于_session
(application/admin/controller/database.class.php(157行))
_SESSION[‘backup_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行)。
那么寻找到使用该方法的后台路径。备份数据库处
数据包如下
表明处为注入点。尝试报错。
但是因为无回显的注入。所以先想别的方法验证
所以先查看备份配置文件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、利用写文件两次触发。
上面的第一步为第二步找到了可能纯在注入的漏洞。
第二步解决了第三步如何触发的思路。