• Sql注入的基础


    什么是SQL注入

    官方一点的解释:
    攻击者利用web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据系统下达指令,,进而实现对后台数据库乃至整个应用系统的入侵。
    简单解释
    由于代码的不完全或者是存在一些不安全的过滤,导致用户在输入的时候带入了不安全的数据(非法数据);比如说单引号、双引号、联合查询、盲注、闭合等等,然后在输入的时候就可以输入非法的数据

    SQL注入的原理

    服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当作SQL语句来执行,从而影响了数据库安全和平台的安全。
    存在两个条件
    1.用户能够控制输入
    2.原本程序要执行的sql语句,拼接了用户输入的恶意数据

    SQL注入过程

    在这里插入图片描述
    1.攻击者访问有SQL注入漏洞的网站寻找注入点
    2.攻击者构造注入语句,注入语句和程序中的sql语句结合生成新的sql语句
    3.新的sql语句被提交到数据库中进行处理
    4.数据库执行了新的sql语句,引发sql注入攻击

    SQL注入带来的危害

    1. 绕过登录验证:使用万能密码登录网站后台等
    2. 获取敏感数据:获取网站管理源账号密码等
    3. 文件系统操作:列目录,读取、写入文件等
    4. 注册表操作: 读取、写入、删除注册表等
    5. 执行系统命令:远程执行命令

    判断一个HTTP请求是否存在SQL注入的方式:

    1. 经典:and 1=1|and2>1|'or 1=1 |or 1<1

    2. 数据库函数:sleep(4)=1 | length(user())>3—通过时间的盲注在这里插入图片描述

    3. 特殊符号:单引号、双引号----可以使用这两个来进行闭合

    4. 商用的扫描器

    刚刚提到的’or 1=1其实可以算的上是一个万能米啊登录,它的用法可以写成
    select username,password from users where username ='texvalue'or 1=1 -- ' and pasword = 'texvalue2'

    –注释符号后面是有一个空格的,不可以忽略

    这里的or它遵循的是如果第一个是对的,那么就不会执行后面的那个,如果第一个是错的,那么就是执行后面正确的。而1=1就是恒为真值的,所以不论是错的,空的,,后面都是保证是真的,所以都是可以执行的。

    SQL注入分类

    按照注入点类型分类

    • 数字型(整数)注入:提交的id直接进入到数据库中,不需要加入单引号
    • 字符型注入:提交的数据使用符号啊来进行包裹,比如说单引号,双引号。

    它俩最简单的区分方式就是查看时否有单引号进行包裹,有的话就是字符型,没有的就是数字型

    按照注入技术(执行效果)分类

    • 基于布尔的盲注:利用报错信息来判断查询的值时真是假;当判断条件为真的时候,会显示一个结果,如何返回的值为假的时候,会显示另一种结果,所以返回的查询值必须存在真和假
    • 基于时间的盲注:不能跟据页面的返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(也就时页面上面转圈圈的时间)来判断
    • 基于报错的注入:根据页面的报错信息,并且让报错信息中包含所需要的结果。
    • 联合查询注入:使用union的情况下注入
    • 堆查询注入:同时执行多条语句的注入

    SQL漏洞形成的原因

    动态字符串构建引起
    • 不正确的处理转义字符(宽字节注入)
    • 不正确的处理错误(报错泄露信息)
    • 不正确的处理联合查询
    • 不正确的处理多次提交(二次注入)
    后台存在问题
    • 后台没有过滤或者编码了用户数据
    • 数据库可以拼接用户传递的恶意代码
    错误处理不当
    • 详细的内部错误消息显示给用户或者攻击者
    • 错误信息可以直接给攻击者i共下一步攻击的帮助。
    不安全的数据库配置

    没有修改默认账户的名称,比如说
    SQL Server默认的数据库系统管理员账户是-sa
    MySQL中默认使用的账户名称是-root和anonymous
    Oracle在创建数据库的时候通常默认会创建SYS,SYSTEMS DBSNMP和OUTLN账户

    寻找SQL注入点

    1.GET方法

    get方法是一种请求服务器的http方法,使用这种方法的时候,信息包含在URL中;比如说,在点击链接的时候会使用这种方法。
    get请求方法的格式

    ?text=value 1&cat= value2&num=value3...
    
    • 1

    修改的方式

    • 浏览器的导航栏中直接修改就可以操作这些参数
    • HackBar插件
    2.POST方法

    post是一种用于向web服务器发送信息的http方法
    数据信息无法在URL中看到,所以一般可以发送字节大的数据。

  • 相关阅读:
    猜年龄小游戏(while 和 if的运用)
    Java真的不难(四十八)Redis的入门及使用(1)
    【ArcGIS】土地利用变化分析详解(矢量篇)
    CCF CSP认证历年题目自练 Day40
    SVG 渐变边框在 CSS 中的应用
    营销建议 | 您有一份八月营销月历待查收! 建议收藏 !
    Python冷知识:如何找出新版本增加或删除了哪些标准库?
    xv6源码阅读——中断与异常
    速卖通卖家如何抓住产品搜索权重
    Hyperledger Fabric 核心概念
  • 原文地址:https://blog.csdn.net/lml_0916/article/details/126138445