74CMS 3.0 SQL注入漏洞后台
代码审计工具:seay
CMS:74CMS3.0
一、 启动环境
1.双击运行桌面phpstudy.exe软件
2.点击启动按钮,启动服务器环境
二、代码审计
1.双击启动桌面Seay源代码审计系统软件
2.因为74CMS3.0源代码编辑使用GBK编辑,所以首先需要先将编码改成GBK
3.点击新建项目按钮,弹出对画框中选择(C:\phpStudy\WWW\74cms),点击确定
漏洞分析
1.点击展开左侧admin目录,弹出的下拉菜单中双击admin_login.php文件,右侧页面可以看到相关代码
<?php
/*
* 74cms 锟斤拷录页锟斤拷
* ============================================================================
* 锟斤拷权锟斤拷锟斤拷: 锟斤拷士锟斤拷锟界,锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷权锟斤拷锟斤拷
* 锟斤拷站锟斤拷址: http://www.74cms.com锟斤拷
* ----------------------------------------------------------------------------
* 锟解不锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟街伙拷锟斤拷诓锟斤拷锟斤拷锟斤拷锟揭的匡拷牡锟角帮拷锟斤拷露猿锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷薷暮锟?
* 使锟矫o拷锟斤拷锟斤拷锟斤拷猿锟斤拷锟斤拷锟斤拷锟斤拷锟轿猴拷锟斤拷式锟轿猴拷目锟侥碉拷锟劫凤拷锟斤拷锟斤拷
* ============================================================================
*/
define('IN_QISHI', true);
require_once(dirname(__FILE__).'/../data/config.php');
require_once(dirname(__FILE__).'/include/admin_common.inc.php');
$act = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : 'login';
if($act == 'logout')
{
unset($_SESSION['admin_id']);
unset($_SESSION['admin_name']);
unset($_SESSION['admin_purview']);
setcookie('Qishi[admin_id]',"",time() - 3600,$QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_name]',"",time() - 3600,$QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_pwd]',"",time() - 3600,$QS_cookiepath, $QS_cookiedomain);
header("Location:?act=login");
}
elseif($act == 'login')
{
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
.......
程序首先定义个常量’IN_QISHI’,紧接着包含了两个文件config.php和admin_common.inc.php文件,config.php文件主要包含了数据库的配置,admin_common.inc.php文件主要进行连接数据库,过滤GET、POST、COOKIE、REQUEST传过来的数据,然后进行一些程序初始化操作。
2.通过$_REQUEST[‘act’]获取GET或者POST传递过来的数据,并赋值给act的内容进行判断,当登录参数是do_login的时候要进行登录判断,登录成功的关键是check_admin函数判断
elseif(check_admin($admin_name,$admin_pwd))
{
update_admin_info($admin_name);
write_log("成功登录",$admin_name);
if($remember == 1)
{
$admininfo=get_admin_one($admin_name);
setcookie('Qishi[admin_id]', $_SESSION['admin_id'], time()+86400, $QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_name]', $admin_name, time()+86400, $QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_pwd]', md5($admin_name.$admininfo['pwd'].$admininfo['pwd_hash']), time()+86400, $QS_cookiepath, $QS_cookiedomain);
}
}
3.check_admin函数关键从获取用$name变量到最后使用没有进行任何过滤操作,最后直接拼接了SQL语句执行。
function check_admin($name,$pwd)
{
global $db;
$admin=get_admin_one($name);
$md5_pwd=md5($pwd.$admin['pwd_hash']);
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd ='".$md5_pwd."' ");
if($row['num'] > 0){
return true;
}else{
return false;
}
}
三、漏洞利用
双击桌面BurpSuite软件,自定义设置浏览器能让BurpSuite软件拦截
访问(IP/Domain)admin/admin_login.php文件,任意输入用户名和密码,输入正确的验证码,BurpSuite拦截到数据并把数据发送到Repeater,使用宽字节SQL注入
成功登陆
重新刷新一遍浏览器发现页面已经进入后台。