前言
马上要考试了,然后就简单的分析下俩个XSS的洞,开始准备考试了…
XSS 1(前台存储型)
漏洞点在admin/login/login_check.php
,同样可以利用上一处变量覆盖的点
关键在这个update子句中,将authcode()处理后的$turefile
写入到数据库中字段为met_adminfile
,跟进函数authcode()
用于进行加解密的函数,并没有对其内容进行检测、过滤。而该变量为数组$url_array[]
倒数第二项。这里导入了admin/include/common.inc.php
这里对传入的COOKIE、POST、GET
的参数进行过滤,然后赋值到全局变量$_M['form']
中,完成变量覆盖,所以也就是完全可控的,直接构造Payload
1 | /admin/login/login_check.php?url_array[]=1&url_array[]=<svg onload=alert(1)>&url_array[]=1 |
然后在后台的安全与效率对应着app/system/ui_set/admin/index.class.php
Index类的doindex()方法,而该类继承关系为:index>admin>common
跟进common类
加载了全部的配置数据,跟进load_config_global()
这里将数据库中取出的met_adminfile配置选项数据进行解密,然后赋给全局变量数组$_M['config']['met_adminfile']
回到doindex()中,
这里拼接的时候调用了$_M['config']['met_adminfile']
变量,然后将url赋值给$localurl_admin
,然后在最后面导入了模板文件app/system/safe/admin/templates/index.php
这里两处都未经任何编码过滤,直接输出了$localurl_admin,导致Payload执行
同样的最新版本的6.20中还未修复……
XSS 2(后台反射型)
这个漏洞有点苛刻,不仅需要登录后台管理,还需要一条数据库信息才能触发。
漏洞点在admin/column/move.php
最后只是对$foldername
进行检测,而$metcms
没有进行过滤直接输出,导致了漏洞的产生。
并且在admin/include/common.inc.php
中,同样因为变量覆盖可以使得上述变量可控
所以只要$foldyanzheng
不为0和$folder_m
非空就能执行传入的JS语句。
1 | $folder_m=$db->get_one("SELECT * FROM $met_column WHERE foldername='$foldername' and lang='$lang'"); |
$met_column
默认为met_column,$lang
为语言cn,只有$foldername
未知。所以还需要一条数据信息,查询数据库可以拿到
构造语句
1 | SELECT * FROM met_column WHERE foldername='member' and lang='cn' |
最后Payload为
1 | /admin/column/move.php?foldyanzheng=1&foldername=member&lang_columnerr4=<svg onload=alert(/test/)> |
同样的最新版本的6.20中还未修复……