• SQL 注入漏洞


    首先要知道sql注入形成的原因:用户输入的数据被sql解释器执行

    sql注入又分:数字型,字符型,cookie 注入,post注入,延时注入,搜索注入,base64注入

    如何甄别一个模块是否有sql注入呢 打个比方

    数字型注入

    www.baidu.com/test?id=1 有这摸一个页面 我在后面加上

    www.baidu.com/test?id=1 and 1=2   如果返回正常无数据就证明此模块可能存在SQL注入漏洞

    而注入多存在asp.php弱类型语言中

    上面那个例子就是典型的数字型注入

    字符型注入

    注意字符串闭合问题如下例子

    select * from table where name='123' and pwd='123' 如果不知道密码 可以把输入的123 改成

    123‘ and1=1 --  在被sql解析器解析时就会变成 select * from table where name='123‘ and1=1 -- ‘and pwd='123'  就这样成功注入了

    当然也要注意不同数据库的连接字符串也不同 SQL Server 是+ ,Oracle 是 || ,MySQL 是空格

     我们以SQL Server Mysql Oracle  这三种主流数据库为例

    SQL Server

    如果在程序中没有用try cath 对错误捕捉在进行友好提示 那sql错误信息 就可能直接暴露给用户 如果是攻击者则会暴露更多信息

    select * from table where name='123' and pwd='123' 在密码处进行注入  123‘ group by username having 1=1 --  如果列中未包含usrname 列名 那么就会将这个错误直接返回给前台显示 通过sql server 错误提示 用having 对表的字段进行字典枚举 可以获取表所有字段  也可以利用系统数据库获取更多数据库信息 内嵌查询

    select * from sys.databases --数据库所有数据库
    select * from  sys.sql_logins --所有登录名
    select * from INFORMATION_SCHEMA.TABLES --当前数据库的所有表
    select * from INFORMATION_SCHEMA.COLUMNS --当前数据库的表列
    select * from sys.all_columns --用户定义的对象和列的集合
    select * from  sys.database_principals --数据库的权限查询
    select * from  sys.database_files --在数据库数据库文件位置
    select * from  sys.objects --数据库的日志,存储过程

    order by  注入可以知道当前表的列数

    order by 100  可以递归知道没出现错误可以确定该数据库有多少列  union 也同样适用

    比如 where id=1  注入  id=1 union select null,null  就会包错 会显示合并列不匹配 可以一直加空 直到不报错  

    当然大部分程序杜绝了’号 可以利用16进制 比如

    select * from table id=1&type=0x4568468  可以对特殊语句进行16进制处理

    Mysql Oracle   同理 可能语法不同和系统函数不用 但注入手段都是差不多的

    为了避免sql 注入 所以对用户所有输入的地方对输入进行参数化处理就可以啦

  • 相关阅读:
    怎么在excel单元格里原有的筛选里面添加新选项
    redis通信协议
    nginx路由文件配置
    R语言绘制相对性关系图
    Generator函数的语法
    360前端星计划作业
    工厂模式
    ReferenceError与undefined的区别
    for...in与点语法
    博客申请成功
  • 原文地址:https://www.cnblogs.com/feizianquan/p/10387501.html
Copyright © 2020-2023  润新知