qianxiao996

一、 启动环境

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
在这里插入图片描述
再次查看个人资料,发现已经攻击成功

分类:

技术点:

相关文章: