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