74CMS 3.0 存储型XSS漏洞

一、 启动环境

1.双击运行桌面phpstudy.exe软件
在这里插入图片描述
2.点击启动按钮,启动服务器环境

二、代码审计

1.双击启动桌面Seay源代码审计系统软件
在这里插入图片描述
2.因为74CMS3.0源代码编辑使用GBK编辑,所以首先需要先将编码改成GBK
在这里插入图片描述
3.点击新建项目按钮,弹出对画框中选择(C:\phpStudy\WWW\74cms),点击确定

漏洞分析

1.点击展开左侧link目录,弹出的下拉列表中双击add_link.php文件,右侧页面可以看到相关代码。

elseif ($act=="save")
{	
	if ($_CFG['app_link']<>"1")
	{
	showmsg('已停止自助申请链接,请联系网站管理员!',1);
	}
	else
	{	
	$setsqlarr['link_name']=trim($_POST['link_name'])?trim($_POST['link_name']):showmsg('您没有填写标题!',1);
	$setsqlarr['link_url']=trim($_POST['link_url'])?trim($_POST['link_url']):showmsg('您没有填写链接地址!',1);
	$setsqlarr['link_logo']=trim($_POST['link_logo']);
	$setsqlarr['app_notes']=trim($_POST['app_notes']);
	$setsqlarr['alias']=trim($_POST['alias']);
	$setsqlarr['display']=2;
	$setsqlarr['type_id']=2;
	$link[0]['text'] = "返回网站首页";
	$link[0]['href'] =$_CFG['site_dir'];
	!inserttable(table('link'),$setsqlarr)?showmsg("添加失败!",0):showmsg("添加成功,请等待管理员审核!",2,$link);
	}
}

2.程序首先检测网站是否开启自助申请链接,如果没有,将阻止用户申请。 紧接着网站将获取到链接名字、URL、logo、说明等赋值到setsqlarr数组,最后将数据插入到数据库中。 文件开始程序依然包含了公共文件/include/common.inc.php,程序内部使用了str_tags去除HTML和PHP标签,所以,凡是带有尖括号的一律会被过滤掉。
3. 后台/admin/admin_link.php负责管理申请的友情链接

if($act == 'list')
{
	check_permissions($_SESSION['admin_purview'],"link_show");
	require_once(QISHI_ROOT_PATH.'include/page.class.php');
	$oederbysql=" order BY l.show_order DESC";
	$key=isset($_GET['key'])?trim($_GET['key']):"";
	$key_type=isset($_GET['key_type'])?intval($_GET['key_type']):"";
	if ($key && $key_type>0)
	{
		
		if     ($key_type===1)$wheresql=" WHERE l.link_name like '%{$key}%'";
		elseif ($key_type===2)$wheresql=" WHERE l.link_url like '%{$key}%'";
	}
	else
	{
	!empty($_GET['alias'])? $wheresqlarr['l.alias']=trim($_GET['alias']):'';
	!empty($_GET['type_id'])? $wheresqlarr['l.type_id']=intval($_GET['type_id']):'';
	if (is_array($wheresqlarr)) $wheresql=wheresql($wheresqlarr);
	}
	$joinsql=" LEFT JOIN ".table('link_category')." AS c ON l.alias=c.c_alias  ";
	$total_sql="SELECT COUNT(*) AS num FROM ".table('link')." AS l ".$joinsql.$wheresql;
	$page = new page(array('total'=>get_total($total_sql), 'perpage'=>$perpage));
	$currenpage=$page->nowindex;
	$offset=($currenpage-1)*$perpage;
	$link = get_links($offset, $perpage,$joinsql.$wheresql.$oederbysql);
	$smarty->assign('link',$link);
	$smarty->assign('page',$page->show(3));
	$smarty->assign('upfiles_dir',$upfiles_dir);
	$smarty->assign('get_link_category',get_link_category());
	$smarty->display('link/admin_link.htm');
}

4.程序首先检查管理员权限,然后获取前端页面传过来进行拼接SQL语句,最后进入到get_links函数内部进行数据库查询查询

function get_links($offset, $perpage, $get_sql= '')
{
	global $db;
	$row_arr = array();
	$limit=" LIMIT ".$offset.','.$perpage;
	$result = $db->query("SELECT l.*,c.categoryname FROM ".table('link')." AS l ".$get_sql.$limit);
	while($row = $db->fetch_array($result))
	{
	$row_arr[] = $row;
	}
	return $row_arr;	
}

5.查询完成以后将获得结果传入到/link/admin_link.htm文件中

<tr>
      <td   class="admin_list admin_list_first">
	  <input name="id[]" type="checkbox"  value="{#$list.link_id#}" />
	  <a href="{#$list.link_url#}" target="_blank"  {#if $list.display<>"1"#}style="color:#CCCCCC"{#/if#}>{#$list.link_name#}</a>	
	   {#if $list.Notes<>""#}
	  <img src="images/comment_alert.gif" border="0"  class="vtip" title="{#$list.Notes#}" />
	  {#/if#}
	   {#if $list.link_logo<>""#}
	  <span style="color:#FF6600" title="<img src={#$list.link_logo#} border=0/>" class="vtip">[logo]</span>
	  {#/if#}
	  {#if $list.display<>"1"#}
	  <span style="color: #999999">[不显示]</span>
	  {#/if#}
      </td>

6.模板文件中显示logo直接使用数据库传入过来的link_logo参数,并将作为img图像 src的参数,并且src参数用户可控,所以构成存储型XSS。

漏洞利用

1.首先点击网站底部的申请友情连接
在这里插入图片描述
2.弹出的页面中,输入如下参数,然后点击提交
在这里插入图片描述
其中Logo地址处为真正的攻击payload,x为了使img图像报错,然后调用onerror参数弹出对话框。 3.登录后台,依次点击广告->友情链接,将鼠标移动到LOGO位置,页面立刻弹出对话框
在这里插入图片描述

posted @ 2019-01-09 15:43  浅笑996  阅读(517)  评论(0编辑  收藏  举报