• 渗透学习之SQL注入基础


    概述

    当应用程序将用户输入的内容,拼接到SQL语句中,一起提交给数据库执行时,就会产生SQL注入威胁。
    判断漏洞的依据
    根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。
    SQL注入经典判断方法
    - 当拼接永真逻辑,如And 1=1 ,返回结果正常。
    - Select * from user where id=1 and 1=1
    - 当拼接永假逻辑,如And 1=2 ,返回结果异常。
    - Select * from user where id=1 and 1=2
    由此可以判断输入的测试参数被执行,从而确定当前位置存在注入漏洞。
    SQL注入危害
    ▪ 窃取数据库敏感信息
    任意查询用户信息、任意查询管理员账号密码
    ▪ 对数据进行恶意的增删改
    ▪ 造成拒绝服务
    通过sleep,benchmark 等函数时数据库阻塞不能正常工作
    ▪ 文件系统操作:列目录,读取、写入文件(一句话木马)等。
    ▪ 获取服务器权限(执行系统命令)
    使用数据库内置的一些函数来执行系统命令
    SQL注入防御
    ▪ 1、参数化查询
    - 参数化查询首先要定义好所有的SQL代码,然后再将每个参数逐个传入,这种编码风格就能够让数据库辨明代码和数据。
    数据库也不会把恶意用户拼接进来的数据,当做部分SQL语句去解析。
    ▪ 2、存储过程
    - 存储过程和参数化查询的作用是一样的,唯一的不同在于存储过程是预先定义并存放在数据库中,从而被应用程序调用的。
    ▪ 3、对所有用户输入进行转义
    - 每个DBMS都有一个字符转义机制来告知DBMS输入的是数据而不是代码,如果我们将所有用户的输入都进行转义,那么DBMS就不会混淆数据和代码,也就不会出现SQL注入了。
    ▪ 4、其他思路:
    - 检测参数
    - 敏感信息加密
    - 低权限账户连接数据库
    - 白名单
    哪些地方存在注入漏洞?
    • 最普遍的注入漏洞是由于参数值过滤不严导致的。
    • Cookie注入漏洞普遍存在于ASP的程序中。
    • 参数名、目录名、文件名等注入漏洞通常存在于有网站路由的程序中。
    使用漏洞扫描器寻找注入点

     SQL注入分类

    一、根据传递数据的类型可以分为:数字型和字符型

    例如 id=1 ,数字型注入不需要考虑单引号或者双引号闭合
    字符型需要考虑闭合问题,例如:1' and '1'='1   即注入语句拼接的时候拼接在执行语句的单引号之中

    二、根据注入方式可以分为:回显注入和盲注

    回显注入

    回显正常:通过执行构造的SQL注入语句之后,页面与原页面存在差异,但没有报错信息。
    回显报错注入:通过执行构造的SQL语句之后,页面报错,且将报错信息显示页面上,通常程序使用了mysql_error类似的函数,将错误信息直接显示在页面中
    select id,name from product where id = 1 and updatexml(1,concat(0x5c,user()),1)   //在显示错误信息的同时也会将user()函数执行的结果返回在页面上。

    盲注

    布尔盲注
    在SQL注入过程中,应用程序仅仅返回True(页面)或False(页面)。无法根据应用程序的返回页面得到需要的数据库信息。可以通过构造逻辑判断(比较大小)来得到需要的信息。
     select id,name from product where id = 1 or 1=1
    时间盲注
    在SQL注入过程中,无论注入是否成功,页面完全没有变化。此时只能通过使用数据库的延时函数来判断注入点一般采用响应时间上的差异来判断是否存在SQL注入,即基于时间型SQL盲注。
    select id,name from product where id = 1 and sleep(5)
    逐字猜解法

    ▪1、判断有无注入点▪and 1=1 and 1=2

    ▪2、猜表名(一般的表的名称无非是admin adminuseruser pass password 等) ▪and (Select count(*) from 表名)<>0 ▪and exists (select * from 表名)

    ▪3、猜列名▪and (Select count(列名) from 表名)<>0 ▪and exists (select 列名from 表名)逐字猜解法

    ▪4、判断内容长度▪and (select top 1 len(user_name) from admin)=5(user_name的长度=5,正常则=5,也可以用>,<号去判断)

    ▪5、截取字符串并转换为ascii码进行数值比较,判断ascii码值:

    ▪and (select top 1 asc(mid(user_name,1,1)) from admin)=97 判断第一位(97代表‘a’的ascll值)

    ▪and (select top 1 asc(mid(user_name,2,1)) from admin)=97 判断第二位

     联合查询

  • 相关阅读:
    整理SVN代码-->正式环境的代码
    业务(1)
    在一个项目中跨领域调用接口的的实现
    一个java文件编译之后会产生多个class文件
    shutil模块
    shevle模块
    confiparser模块
    sys模块
    subprocess模块
    【ADO.NET】3、从TXT中导入数据到数据库
  • 原文地址:https://www.cnblogs.com/heiwa-0924/p/12814439.html
Copyright © 2020-2023  润新知