### 简要描述: YXcms 最新1.2.0版本 存储式XSS(实站演示) 源码分析请见详细说明,各种躺枪的演示在漏洞证明 ### 详细说明: 题外话:之所以发这个漏洞,是因为 1.这个CMS的过滤比较强,不像之前某些CMS一丁点儿过滤都没有 完全没有挑战的价值 2.Stored-XSS 是跨站中危害比较大的漏洞,之前一直没找机会玩一玩跨站,再不发跨站的漏洞可能会被人认为不会挖XSS的洞洞 看代码 /protected/apps/default/controller/extendController.php line:40 ``` session_starts(); //接收表单的地方 if($_POST['checkcode']!=$_SESSION['verify'] || empty($_SESSION['verify'])) $this->error('验证码错误,请重新输入'); //验证码无缺陷,扫描器不可能发现这个漏洞,继续看代码 for($i=1;$i<count($tableinfo);$i++){ //动态的表单支持 if(is_array($_POST[$tableinfo[$i]['tableinfo']])) //先看后面的else $data[$tableinfo[$i]['tableinfo']]=implode(',',$_POST[$tableinfo[$i]['tableinfo']]); else //正常提交表单会到这里,使用in函数来过滤参数,grep一下 $data[$tableinfo[$i]['tableinfo']]=in($_POST[$tableinfo[$i]['tableinfo']]); } $data['ip']=get_client_ip(); $data['ispass']=0; $data['addtime']=time(); if(empty($urls[1])) $jump=$_SERVER['HTTP_REFERER']; else{ $jurl=explode(',',$urls[1]); if(!empty($jurl[1])){ $arr=explode('/',$jurl[1]); if(!empty($arr)){ $canshu=array(); foreach...
### 简要描述: YXcms 最新1.2.0版本 存储式XSS(实站演示) 源码分析请见详细说明,各种躺枪的演示在漏洞证明 ### 详细说明: 题外话:之所以发这个漏洞,是因为 1.这个CMS的过滤比较强,不像之前某些CMS一丁点儿过滤都没有 完全没有挑战的价值 2.Stored-XSS 是跨站中危害比较大的漏洞,之前一直没找机会玩一玩跨站,再不发跨站的漏洞可能会被人认为不会挖XSS的洞洞 看代码 /protected/apps/default/controller/extendController.php line:40 ``` session_starts(); //接收表单的地方 if($_POST['checkcode']!=$_SESSION['verify'] || empty($_SESSION['verify'])) $this->error('验证码错误,请重新输入'); //验证码无缺陷,扫描器不可能发现这个漏洞,继续看代码 for($i=1;$i<count($tableinfo);$i++){ //动态的表单支持 if(is_array($_POST[$tableinfo[$i]['tableinfo']])) //先看后面的else $data[$tableinfo[$i]['tableinfo']]=implode(',',$_POST[$tableinfo[$i]['tableinfo']]); else //正常提交表单会到这里,使用in函数来过滤参数,grep一下 $data[$tableinfo[$i]['tableinfo']]=in($_POST[$tableinfo[$i]['tableinfo']]); } $data['ip']=get_client_ip(); $data['ispass']=0; $data['addtime']=time(); if(empty($urls[1])) $jump=$_SERVER['HTTP_REFERER']; else{ $jurl=explode(',',$urls[1]); if(!empty($jurl[1])){ $arr=explode('/',$jurl[1]); if(!empty($arr)){ $canshu=array(); foreach ($arr as $vo) { $val=explode('=',$vo); $canshu[$val[0]]=$val[1]; } } } $jump=url($jurl[0],$canshu); } //下面用的是in函数过滤完的post,看来只能去找in函数了 if(model('extend')->Extin($tableinfo[0]['tableinfo'],$data)) $this->success('提交成功请等待审核~',$jump); else $this->error('提交失败~'); ``` 寻找in函数 /protected/include/lib/common.function.php line:8 ``` function in($data,$force=false){ //完美的htmlspecialchars+addslashes //看上去好像没希望了 //没错,我马上要说但是了,看看这个CMS是怎么输出的留言内容吧 if(is_string($data)){ $data=trim(htmlspecialchars($data));//防止被挂马,跨站攻击 if(($force==true)||(!get_magic_quotes_gpc())) { $data = addslashes($data);//防止sql注入 } return $data; } else if(is_array($data)) { foreach($data as $key=>$value){ $data[$key]=in($value,$force); } return $data; } else { return $data; } } ``` /protected/apps/default/view/default/extend_guestbook.php line:77 怎么感觉这么喜感,在一堆 $vo['tname'] $vo['addtime'] $vo['reply'] 中 出现了一个html_out($vo['content']) ``` <div class="book-list-info">留言者:{$vo['tname']} IP:{$vo['ip']} 留言时间:{date($vo['addtime'],Y-m-d H:m:i)}</div> <div class="book-list-con">{html_out($vo['content'])}</div> <div class="book-list-back">{$vo['reply']}</div> ``` /protected/include/lib/common.function.php line:75 ``` function html_out($str){ if(function_exists('htmlspecialchars_decode')) $str=htmlspecialchars_decode($str); //天哪!好不容易过滤掉的东西又回来了!!! else $str=html_entity_decode($str); $str = stripslashes($str); return $str; } ``` 留言content引发存储式XSS,证毕 ### 漏洞证明: 经测试,那个表单是在留言处接受的 先在本机证明,再去光顾躺枪的网站: 表单位置: ``` http://127.0.0.1/index.php?r=default/extend/index&id=100023 ``` [<img src="https://images.seebug.org/upload/201312/20215729f7cf495aaae1e0d53428bc0a7b252276.png" alt="001.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/20215729f7cf495aaae1e0d53428bc0a7b252276.png) 然后改content [<img src="https://images.seebug.org/upload/201312/2021581312577a5a8e95c09518743a7c9df41e25.png" alt="002.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/2021581312577a5a8e95c09518743a7c9df41e25.png) [<img src="https://images.seebug.org/upload/201312/2021585794a9c6538a4eab9b54f256b6729f720b.png" alt="003.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/2021585794a9c6538a4eab9b54f256b6729f720b.png) 打cookie了,下面的cookie是躺枪的haohm网站的 [<img src="https://images.seebug.org/upload/201312/20215910740de732a76b3b4f5d14bcf9875d7860.png" alt="004.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/20215910740de732a76b3b4f5d14bcf9875d7860.png) 为了方便测试,再发一个alert的图 [<img src="https://images.seebug.org/upload/201312/2022003327c529ba37676b51e368d8e15538b762.png" alt="005.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/2022003327c529ba37676b51e368d8e15538b762.png) [<img src="https://images.seebug.org/upload/201312/20220114a8a5705222add68e4e645b8a6c2b89fc.png" alt="006.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/20220114a8a5705222add68e4e645b8a6c2b89fc.png) [<img src="https://images.seebug.org/upload/201312/20220130b992f8c5ae213e8def88b80d9eeed16f.png" alt="007.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/20220130b992f8c5ae213e8def88b80d9eeed16f.png) 躺枪光荣,我只是登了演示一下漏洞,啥都没干 http://www.haohm.net/ [<img src="https://images.seebug.org/upload/201312/2022015649aef0b2e8d81de31c1ef5a42e83f61a.png" alt="008.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/2022015649aef0b2e8d81de31c1ef5a42e83f61a.png) 再躺一个,仍然只是验证漏洞,没有任何恶意 [<img src="https://images.seebug.org/upload/201312/2022030733727044402dc7a9305f52a0e276e438.png" alt="009.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/2022030733727044402dc7a9305f52a0e276e438.png)