如何理解SQL注入原理

    基础概念
        SQL注入(SQL Inject)指的是web应用程序对用户输入数据的合法性没有判断或过滤不严格,使得攻击者能够在web应用程序中事先定义好的查询语句的结尾添加额外的SQL语句。这些额外的SQL语句能够在管理员不知情的情况下执行,从而欺骗数据库服务器执行非授权的任意查询,进一步获取相应的数据信息。

    工作原理
        用户输入:攻击者通过Web表单、URL、cookie等途径输入恶意数据
        数据拼接:将用户输入的数据与SQL查询语句进行拼接,改造成完整的SQL语句
        执行查询:应用程序将拼接后的SQL语句发送给数据库服务器执行
        获取结果:如果拼接的SQL语句包含恶意内容,服务器可能会执行非预期的操作,如读取、修改或删除数据,甚至执行系统命令


    产生条件
        传递给后端的参数是可控的
        参数内容会被直接带入到数据库查询
        变量未过滤或者过滤不严谨


    信息收集
        数据库名
        数据库用户
        数据库版本:根据版本查已公布的漏洞
        操作系统
        其他:如服务器文件路径


    常用函数
        # 一些SQL注入常用的函数

version()                 # 查看数据库版本
database()                # 查看当前数据库名
user()                    # 查看当前数据库用户
system_user()             # 查看系统用户名
group_concat()            # 把数据库中的某列数据或某几列数据合并为一个字符串
@@datadir                 # 查看数据库路径
@@version_compile_os      # 查看操作系统

        information_schema信息元数据库关键字段说明:

schemata         # 用户创建的所有数据库的库名,关联字段名为 schema_name。
tables           # 用户创建的所有数据库的库名和表名,关联字段分别是 table_schema 和 table_name。
columns          # 用户创建的所有数据库的库名、表名、字段名,关联字段名分别为 table_schema、table_name、column_name。

        执行实例

# 查询所有的数据库名
select schema_name from information_schema.schemata limit 0,1
# 查询指定数据库security中的所有表名
select table_name from information_schema.tables where table_schema='security' limit 0,1
# 查询指定数据库security中的指定数据表users的所有列名
select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1

 

    攻击方式
        错误消息注入:利用系统错误或消息提示获取有用信息
        Union注入:利用Union运算符将多个查询结果组合在一起
        时间注入:利用SQL语句中的时间函数进行后台数据操作
        布尔盲注入:修改SQL语句的查询条件,通过布尔值(真/假)来获取敏感信息
        暴力查询:尝试所有可能的参数组合(比如账号+密码)执行非预期的数据库查询
        数据查询:information_schema查询数据库相关信息
        文件读写:存在魔术引号,可通过编码或宽字节绕过
        跨库注入:通过注入攻击代码来执行对其他数据库的操作


    防御措施
        输入合法性验证:对用户输入的数据进行严格的验证和过滤
        使用参数化查询:将SQL语句和数据分开处理,防止数据被解释为SQL命令
        避免动态拼接SQL语句:减少使用字符串拼接来构造SQL语句
        使用预编译语句:预编译语句能够确保数据的正确性和安全性
        定期更新和维护数据库软件:确保使用的数据库软件是最新的,包含最新的安全补丁

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值