一、漏洞描述
对传入数据库的参数未进行过滤导致存储型xss
在我的资源中下载::hkqyglxt-含有存储型XSS漏洞的源码包 下载即可
二、代码审计
2.1 查看代码
2.2.1 第一个漏洞文件位置
在 /admin/cms_channel_add.php 文件中
2.2.1.1 代码审计
在图中红框 标记起来的位置,存在问题
以“请填写导航名称”这一句 为例,其余几句参照本例即可
null_back($_POST['n_name'] ,'请填写频道名称');
意思是: 采用POST方式通过 n_name 参数传递数据,之后将传递过来的数据带入 null_back()函数
接下里查看null_back()函数的作用
使用seay源代码审计系统的全局搜索功能,查找 null_back ,如下图所示
在最下面找到 function null_back($str, $rul) ,就是该函数
双击最后一行,跳转到文件 library.php 中null_back()函数
查看代码,意思是:判断字符串内容是否为空,没有进行任何过滤
接着回到 /admin/cms_channel_add.php 文件,继续往下执行,
**意思是:
**判断是否已存在相同的频道名称,判断是否已存在相同的导航名称
经过判断,如果不存在相同的频道名称、导航名称,继续向下执行
将通过POST方式获取n_aname的参数值,赋值给$_data['n_aname']
将通过POST方式获取n_nname的参数值,赋值给$_data['n_nname']
$_data['n_aname'] = $_POST['n_aname'];
$_data['n_nname'] = $_POST['n_nname'];
继续向下执行,通过POST方式传递的参数值全部都赋值给$data
变量,并且将data变量的值代入arrtoinsert()函数
使用seay源代码审计系统,查看arrtoinsert()函数
发现arrtoinsert()函数的作用是将:将数组转换成供insert用的字符串,也没有进行任何过滤
接着回到 /admin/cms_channel_add.php 文件,继续往下执行下一句
$sql = 'insert into cms_nav ('.$str[0].') values ('.$str[1].')';
**意思是:**将获取到的内容插入进数据库,其中列名值是 n_parent 参数的值,对应的数据值是 n_name 参数的值
总结:
请填写频道名称的值 n_name ,未经任何过滤,直接插入到数据库中,导致可以插入XSS的payload:<script>alert(1)</script>
2.2.1.2 漏洞复现
通过文件路径/admin/cms_channel_add.php 猜测应该是在后台管理的位置
输入账号密码登录后台
登录后台后,直接将文件路径拼接到127.0.0.1上,之后访问发现是 内容管理-》添加频道
输入payload:
3<script>alert(123)</script>
之后点击添加新频道
访问网站首页,触发XSS弹窗,并且新频道已成功添加
2.2.2 第二个漏洞文件位置
在 /admin/cms_message_answer.php 文件中
2.2.2.1 代码审计
在图中红框 标记起来的位置,存在问题
$_data['m_answer'] = $_POST['m_answer'];
**意思是:**将通过POST方式m_answer参数传递过来的值,直接赋值给 $_data
变量
之后将$_data
变量的值代入到 arrtoupdate()函数,并赋值给$str
查找arrtoupdate()函数
arrtoupdate()函数的作用是“将数组转换成供update用的字符串”,没有进行任何过滤
接着回到 /admin/cms_message_answer.php 文件,继续向下执行
直接将$str
的值,带入数据库中执行
总结:
参数 m_answer ,未经任何过滤,直接插入到数据库中,导致可以插入XSS的payload:<script>alert(666)</script>
2.2.1.2 漏洞复现
通过文件路径/admin/cms_message_answer.php 猜测应该是在后台管理的位置
访问http://127.0.0.1/admin/cms_message_answer.php后直接跳转到下图所示位置
选择详情回复
输入payload:<script>alert(666)</script>
点击保存
之后我们进入前台。查看访客留言,触发XSS弹窗
更多web安全工具与存在漏洞的网站搭建源码,收集整理在知识星球。