Author:Yaseng [目录]
0x00 前言 0x01 关于程序安装文件 0x02 最土团购直接重复安装 加 getShell 0x03 跳转绕过 phpdisk header bypass & getShell 0x04 全局变量覆盖绕过 sdcms 0x05 非主流 dcrcms 的非常重装 0x06 phpweb 安装会员验证绕过 0x07 其他绕过实例 0x08 安全代码的编写 0x09 总结
前言 作为一个Web系统,安装程序是必不可少的。提供安装系统,已连接数据库和初始化网站数据,当首次安装时,系统一般会生成一个lock文件以免非法重装,但我们可以通,导致系统重装,系统数据丢失甚至getShell,本文以多个实例浅谈web系统安装程序的安全。
关于程序安装文件 web系统安装在第一次访问程序入口的会自动安装, 以笔者熟悉的php为例,一般是install.php 或者根目录下的install文件夹,安装流程如下
图一 围观以上内涵图先,接下来我们用多个案例细谈之。 最土团购直接重复安装 加 getShell 1.访问 www.2cto.com /install.php (有的人懒,并没有删除这个文件) 2.填写自己本机搭建好的Mysql帐户和IP,重新安装之。 3.注册一个帐户,第一个注册的默认为管理员。 4.访问/manage/index.php 5.点击 设置--模版---选择about_job.html 添加PHP一句话 6.用菜刀链接site.com/about/job.php
Phpdisk header 绕过 参考: http://www.2cto.com/Article/201206/137339.html 图二 如图二,已安装检测时,直接 header跳转,而php中的 header 函数跳转之后还可以执行,而为了安装方便去掉gpc,导致重复安装直接getShell. 图三 xdcms全局变量覆盖绕过重装 参考: http://www.2cto.com/Article/201208/145312.html 看 install下的 index.php 文件 foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach($$_request as $_k => $_v) ${$_k} = _runmagicquotes($_v); }
经典的全局变量覆盖,代码的意思是把传入的变量数组遍历赋值,比如 $_GET[‘a’] 赋值为 $a Ok 继续往下看已安装检测代码
$insLockfile = dirname(__FILE__).'/install_lock.txt'; //在全局数据遍历之前 if(file_exists($insLockfile)){ exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!"); } 这里的 insLockfile是我们可控的(全局变量覆盖),随便传入一个参数 http://demo.xdcms.cn/install/index.php?insLockfile=1 图四 图四位sdcms官方网站,利用poc http://www.2cto.com /install/index.php?insLockfile=1&step=4&dbhost=localhost&dbname=xdcms&dbuser=root&dbpwd=&dbpre=c_&dblang=gbk&adminuser=yaseng&adminpwd=90sex 加粗部分填写配置 直接绕过 重装
dcrcms 逻辑缺陷导致二次安装 我们来看dcrcms非主流安装程序,没有已安装检测代码,index.php写入配置,传入install_action.php,当安装结束时, function install_end() { //安装收尾 //把安装文件的名字换了 @rename('index.php', 'index.php_bak'); }
额 改了index.php 有毛用,index.php只是一个配置数据的发射器,好吧 既然你改名的 index 我就本地写一个index吧... 图五 提交本地表单 图六 Done !!!
phpweb 重装vip验证绕过 Phpweb 作为一个收费系统,安装时有会员验证,所以开发人员的天真的免去了已安装检测. 图七 但是安装流程有 post过来的 nextstep控制 图八 Firefox tamper 直接绕过安装 ( 破解 此程序未测试,感兴趣者可深入研究) 图九 其他绕过 安装程序不能绕过时,可以通过别的方式,比如dedecms的任意文件删除,删除lockfile, Xxxcms的任意文件改名等等。 安全代码的编写
改名? 加lock file ? ..... 这些都有被绕过的危险,discuz给了我们一个很好答案.看代码,安装完后访问后台 if(@file_exists(DISCUZ_ROOT.'./install/index.php') && !DISCUZ_DEBUG) { @unlink(DISCUZ_ROOT.'./install/index.php'); if(@file_exists(DISCUZ_ROOT.'./install/index.php')) { dexit('Please delete install/index.php via FTP!'); } } 直接删除 index.php,下手干净利落,永除后患...
总结
本文笔者代码审计和项目开发时对web系统安装程序的简单评测,案例中有的在新版本中已经修正,有些是未公布0day,具体利用方法还靠读者自行研究。
本文原创,转载请注明来处 http://yaseng.me/web-installer-security. html
查看更多关于细谈Web系统安装程序安全 - 网站安全 - 自学php的详细内容...