web靶场搭建之帝国cms7.5( 三 )


后台XSS 漏洞类型:
反射型xss
漏洞文件:
///e/admin//.php
漏洞原理:
该漏洞是由于代码只使用进行实体编码过滤 , 而且参数用的是(编码双引号和单引号),还有函数处理 , 但是没有对任何恶意关键字进行过滤 , 从而导致攻击者使用别的关键字进行攻击

http://192.168.0.6/Empirecms/upload/e/admin/openpage/AdminPage.php?ehash_dBV7d=hsAhUCcwEbIjXksMUzC6&mainfile=javascript:alert(1)
其中ehash是随机生成的 , 在登录时可以看到= , 如果缺少这个hash值 , 则会提示非法来源
http://192.168.0.6/Empirecms/upload/e/admin/openpage/AdminPage.php?ehash_dBV7d=hsAhUCcwEbIjXksMUzC6&mainfile=javascript:alert(document.cookie)
源码分析:
打开//e/admin//.php
//变量$leftfile=hRepPostStr($_GET['leftfile'],1);$mainfile=hRepPostStr($_GET['mainfile'],1);
利用函数进行过滤 , 跳转到该函数的定义如下
//处理提交字符function hRepPostStr($val,$ecms=0,$phck=0){if($phck==1){CkPostStrCharYh($val);}if($ecms==1){$val=ehtmlspecialchars($val,ENT_QUOTES);}CkPostStrChar($val);$val=AddAddsData($val);return $val;}
用函数进行HTML实体编码过滤 , 其中 -
编码双引号和单引号 。
//htmlspecialchars处理function ehtmlspecialchars($val,$flags=ENT_COMPAT){global $ecms_config;if(PHP_VERSION>='5.4.0'){if($ecms_config['sets']['pagechar']=='utf-8'){$char='UTF-8';}else{$char='ISO-8859-1';}$val=htmlspecialchars($val,$flags,$char);}else{$val=htmlspecialchars($val,$flags);}return $val;}
要利用函数把字符转换为HTML实体
网页输出
然而输出的位置是在标签的src里 , 这意味着之前的过滤都没有什么用 。标签可以执行js代码 , 因此可以利用:alert(1)触发xss
前台xss 漏洞类型:
反射型xss
漏洞文件:
///e//index.html
漏洞原理:
url地址经过函数处理之后,把url地址中的参数和值部分直接拼接当作a标签的href属性的值和img标签的src标签的值
if(Request("url")!=0){document.write("screen.width-500)this.style.width=screen.width-500;\">");
通过函数获取地址栏的url参数,并作为img和a标签的src属性和href属性,然后经过.write输出到页面 。
转到函数定义
function Request(sName){/*get last loc. of ?right: find first loc. of sName+2retrieve value before next &*/var sURL = new String(window.location);var iQMark= sURL.lastIndexOf('?');var iLensName=sName.length;//retrieve loc. of sNamevar iStart = sURL.indexOf('?' + sName +'=') //limitation 1if (iStart==-1){//not found at startiStart = sURL.indexOf('&' + sName +'=')//limitation 1if (iStart==-1){//not found at endreturn 0; //not found}}iStart = iStart + + iLensName + 2;var iTemp= sURL.indexOf('&',iStart); //next pair startif (iTemp ==-1){//EOFiTemp=sURL.length;}return sURL.slice(iStart,iTemp ) ;sURL=null;//destroy String}
通过.获取当前url地址,根据传入的url参数,获取当前参数的起始位置和结束位置

/Empirecms/upload/e/ViewImg/index.html?url=javascript:alert(document.cookie)
解析:
当浏览器载入一个
URL时 , 它会执行URL中所包含的代码 , 并且使用最后一个语句或表达式的值 , 转换为一个字符串 , 作为新载入的文档的内容显示 。