一、 启动环境
1.双击运行桌面phpstudy.exe软件
2.点击启动按钮,启动服务器环境
二、代码审计
1.双击启动桌面Seay源代码审计系统软件
2.因为74CMS3.0源代码编辑使用GBK编辑,所以首先需要先将编码改成GBK
3.点击新建项目按钮,弹出对画框中选择(C:\phpStudy\WWW\74cms),点击确定
漏洞分析
1.点击展开左侧user目录,弹出的下拉列表中双击user_personal.php文件,右侧页面可以看到相关代码。
elseif ($act==\'userprofile\')
{
$smarty->assign(\'user\',$user);
$smarty->assign(\'title\',\'个人资料 - 会员中心 - \'.$_CFG[\'site_name\']);
$smarty->assign(\'userprofile\',get_userprofile($_SESSION[\'uid\']));
$smarty->display(\'member_personal/personal_userprofile.htm\');
}
elseif ($act==\'userprofile_save\')
{
$setsqlarr[\'realname\']=trim($_POST[\'realname\'])?trim($_POST[\'realname\']):showmsg(\'请填写真实姓名!\',1);
$setsqlarr[\'sex\']=trim($_POST[\'sex\']);
$setsqlarr[\'birthday\']=trim($_POST[\'birthday\']);
$setsqlarr[\'addresses\']=trim($_POST[\'addresses\'])?trim($_POST[\'addresses\']):showmsg(\'请填写通讯地址\',1);
$setsqlarr[\'mobile\']=trim($_POST[\'mobile\']);
$setsqlarr[\'phone\']=trim($_POST[\'phone\']);
$setsqlarr[\'qq\']=trim($_POST[\'qq\']);
$setsqlarr[\'msn\']=trim($_POST[\'msn\']);
$setsqlarr[\'profile\']=trim($_POST[\'profile\']);
if (get_userprofile($_SESSION[\'uid\']))
{
$wheresql=" uid=\'".intval($_SESSION[\'uid\'])."\'";
!updatetable(table(\'members_info\'),$setsqlarr,$wheresql)?showmsg("修改失败!",0):showmsg("修改成功!",2);
}
else
{
$setsqlarr[\'uid\']=intval($_SESSION[\'uid\']);
!inserttable(table(\'members_info\'),$setsqlarr)?showmsg("修改失败!",0):showmsg("修改成功!",2);
}
}
2.当传入的参数act==’userprofile_save’,然后将POST接收到数据进行更新或者插入,在被代码块中除了头部整体使用过addslashes函数以外,并没有其他的过滤。 6.其中get_userprofile()函数会根据用户的UID进入数据库中进行查询,如果返回数据则进行更新数据,如果没有返回数据,则进行插入数据。 7.假设用户已经填写过个人资料,更新资料会进入updatetable函数,函数在/include/common.fun.php
function updatetable($tablename, $setsqlarr, $wheresqlarr, $silent=0) {
global $db;
$setsql = $comma = \'\';
foreach ($setsqlarr as $set_key => $set_value) {
if(is_array($set_value)) {
$setsql .= $comma.\'`\'.$set_key.\'`\'.\'=\'.$set_value[0];
} else {
$setsql .= $comma.\'`\'.$set_key.\'`\'.\'=\\'\'.$set_value.\'\\'\';
}
$comma = \', \';
}
$where = $comma = \'\';
if(empty($wheresqlarr)) {
$where = \'1\';
} elseif(is_array($wheresqlarr)) {
foreach ($wheresqlarr as $key => $value) {
$where .= $comma.\'`\'.$key.\'`\'.\'=\\'\'.$value.\'\\'\';
$comma = \' AND \';
}
} else {
$where = $wheresqlarr;
}
return $db->query("UPDATE ".($tablename)." SET ".$setsql." WHERE ".$where, $silent?"SILENT":"");
}
函数中间并没有进行过滤,直接进行遍历传输过来的数组,然后拼接成插入语句进行数据查询。 8.所以,可以在插入数据的时候插入SQL语句,获取管理员Hash。
漏洞利用
1.双击桌面BurpSuite软件,自定义设置浏览器能让BurpSuite软件拦截
2.登录用户,点击“账户管理”—>“个人资料”,输入攻击payload,msn字段主要闭合前边语句,个人简介字段真正的攻击SQL语句
点击保存
需要将msn字段中编码的数据恢复回来 然后点击forwad
再次查看个人资料,发现已经攻击成功