好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

细谈Web系统安装程序安全 - 网站安全 - 自学php

 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的详细内容...

  阅读:48次