### 简要描述: ~~ ### 详细说明: 1、先来看存储型XSS跨进后台 在申请链接处,文件/link/add_link.php ``` elseif ($act=="save") { $captcha=get_cache('captcha'); $postcaptcha = trim($_POST['postcaptcha']); if($captcha['verify_link']=='1' && empty($postcaptcha)) { showmsg("请填写验证码",1); } if ($captcha['verify_link']=='1' && strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0) { showmsg("验证码错误",1); } 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'];...
### 简要描述: ~~ ### 详细说明: 1、先来看存储型XSS跨进后台 在申请链接处,文件/link/add_link.php ``` elseif ($act=="save") { $captcha=get_cache('captcha'); $postcaptcha = trim($_POST['postcaptcha']); if($captcha['verify_link']=='1' && empty($postcaptcha)) { showmsg("请填写验证码",1); } if ($captcha['verify_link']=='1' && strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0) { showmsg("验证码错误",1); } 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); } } ``` 对链接信息没有过滤直接进入数据库。 在后台显示时,文件/admin/admin_link.php if($act == 'list') { get_token(); 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); } if ($_CFG['subsite']=="1" && $_CFG['subsite_filter_links']=="1") { $wheresql.=empty($wheresql)?" WHERE ":" AND "; $wheresql.=" (l.subsite_id=0 OR l.subsite_id=".intval($_CFG['subsite_id']).") "; } $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'=>$db->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->assign('navlabel',"list"); $smarty->display('link/admin_link.htm'); } 看看get_link函数: ``` 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; } ``` 直接取出显示,没有过滤,导致xss。 我们来申请链接:http://localhost/74cms/link/add_link.php [<img src="https://images.seebug.org/upload/201405/09132900622c6a715fd1a38acfc403572f117ef0.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/09132900622c6a715fd1a38acfc403572f117ef0.png) 后台管理员查看申请链接时:http://localhost/74cms/admin/admin_index.php [<img src="https://images.seebug.org/upload/201405/09133004ed5ae2c9a037b48df70446216ab4e294.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/09133004ed5ae2c9a037b48df70446216ab4e294.png) 2、后台GetShell 我们首先可以在前台上传一个头像jpg文件,文件内容: ``` <?php phpinfo();?> ``` 上传后的文件路径为: http://localhost/74cms/user/personal/personal_index.php 查看头像属性: [<img src="https://images.seebug.org/upload/201405/091333299bf02ac8a414114887c57862fdf1aa28.png" alt="3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/091333299bf02ac8a414114887c57862fdf1aa28.png) 通过第一步拿到的cookie登陆后台。 后台工具——计划任务——添加任务: 任务脚本就填我们上传的头像图片路径:../../data/avatar/100/2014/05/09/1.jpg 然后提交即可。 此时在网站首页刷新页面,得到结果: [<img src="https://images.seebug.org/upload/201405/09133647fbb9415c2b90ac4717c51150918ea387.png" alt="5.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201405/09133647fbb9415c2b90ac4717c51150918ea387.png) 3、总结 通过上面的XSS和后台的GetShell 我们可以全部自动化,由于后台有csrf防御,我们可以先通过xss获取到后天的csrftoken,然后构造getshell的js文件,在来一次xss就搞定了。 ### 漏洞证明: 见详细说明。