暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【OWASP TOP 10】SQL注入过程和防御方法

360技术 2019-05-24
528

奇技指南

OWASP Top 10指Web应用程序最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。

本文是【OWASP TOP 10】系列的第一篇,主要为大家介绍SQL注入的过程和防御方法。


网页被篡改,银行卡信息被盗用,敏感数据泄露......网络安全问题层出不穷。


OWASP(开放式Web应用程序安全项目)最具权威的就是“10项最严重的Web 应用程序安全风险列表” ,总结了Web应用程序最可能、最常见、最危险的十大漏洞,是开发、测试、服务、咨询人员应知应会的知识。


本文是【OWASP TOP 10】系列的第一篇,主要为大家介绍SQL注入的过程和防御方法。


什么是注入?

注入攻击的本质,Web应用程序没有过滤用户输入,直接把用户输入的恶意数据当作代码执行。

SQL注入

攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗数据库服务器执行恶意的SQL命令。

命令注入

后端未过滤掉恶意数据,代码当做系统命令执行。

代码注入

一般出现在不安全的使用某些函数(文件包含)(反序列化漏洞)。

LADP注入

轻量级目录访问协议,用于访问网络中的目录服务,常用在Active Directory,企业管理目录。用户提交的输入不经过验证插入LDAP搜索过滤器中,攻击者通过提交专门设计的输入修改过滤器的结构,以检索数据或执行未授权操作。

XML注入

XXE漏洞,引用外部实体时,通过构造恶意内容,导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。XPath注入:与SQL注入类似,XPath解析器本身对URL、表单中提交的代码内容未作严格限制,导致恶意代码,可以直接解析执行。XQuery注入。

JSON注入

轻量级的数据交换格式,主要利用特殊字符注入JSON中,造成解析失败。

JSONP注入

回调函数未作严格的检测和过滤。


对于这么多的注入种类本章主要讲解SQL注入的过程和防御方法


SQL注入原理

SQL注入攻击的本质,服务端没有过滤用户输入的恶意数据,直接把用户输入的数据当成SQL语句执行,从而影响数据库的安全和平台的安全。本质上是对用户的输入检查不充分,导致非法的SQL语句提交到服务端被数据库执行并返回。


用一个表格来表示一下SQL注入的几种分类之间的关系:


下面分别来说下各种分类注入时的情形:


按注入点的类型分类(3种)


1、数字型注入点

当输入的参数为整数,如ID,年龄,页码等,如果存在这种类型的注入漏洞就称为数值型注入。就像此类链接:http://xxx.com/index.php?id=1,此类SQL查询语句原型大致为:select * from 表名 where id=1

2、字符型注入点

当输入的参数为字符串时,并且存在漏洞,就称为字符型注入,与数值型参数不同的是,字符型注入一般要使用单引号来闭合。就像此类链接:http://xxx.com/index.php?name=admin,此类SQL查询语句原型大致为:select * from 表名 where name=’admin’

3、搜索性注入点

这类注入主要是指在进行搜索时没有过滤搜索参数,一般连接中有keyword=’关键字’,有的不在URL中而是通过POST表单提交,此类注入点提交SQL语句,其原型大致为:select * from 表名 where 字段 like ‘%关键字%’

当我们提交注入参数为:keyword=’and [查询条件] and ‘%’=’ ,在数据库中的SQL语句就是:select * from 表名 where 字段 like ‘%’ and [查询条件] and ‘%’ = ‘%’


按数据的提交方式分类(3种)

1、GET注入

提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接: http://xxx.com/index.php?id=1 ,id是注入点。

2、POST注入

使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。 例如POST表单中:admin=”or “a”=”a&password=123456

3、HTTP头注入

注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。Cookie 也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段, 注入点存在 Cookie 当中的某个字段中。 例如,当服务端要将客户的cookie传入数据库查询以此来认证客户登录的身份,此时cookie中可能存在注入点。


按数据执行的效果分类(5种)

1、布尔盲注

可以根据页面的返回信息判断真假进行注入。

盲注中常用的三个函数:这三个函数都是从一个字符串中返回一个字符子集

mid(string,start,length):返回的子字符串从指定位置开始

substr(string,start,length):返回指定的子串

left(string,length):返回最左边指定的字符数left(database(),1)>’s’

查询语句:SELECT userid FROM member WHERE u_name=$name AND u_pass=$pass;

注入语句:

name=-1′ and (select mid(u_name,1,1) from member where userid=1)=’a’

name=-1′ and (select mid(u_name,2,1) from member where userid=1)=’d’

name=-1′ and (select mid(u_name,3,1) from member where userid=1)=’m’

name=-1′ and (select mid(u_name,4,1) from member where userid=1)=’i’

name=-1′ and (select mid(u_name,5,1) from member where userid=1)=’n’

ASCII()将某个字符转化为ascii值:ascii(substr(user),1,1)=101

regexp正则表达式的用法:user()结果为root,regexp为匹配root的正则表达式:select user() regexp’^ro’

IF语句:select * from users where id =1 and 1=(if((user() regexp ‘^r’),1,0));

2、时间盲注

基于时间的盲注的原理是,当对数据库进行查询操作,如果查询的条件不存在,预计执行的时间便是0

不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行,即页面返回时间是否增加来判断。

往往语句执行的速度非常快,线程信息一闪而过,得到的执行时间基本为0,sleep(N)这个语句在这种情况下起到了非常大的作用。SELECT  sleep(N) 可以让次语句执行N秒钟。

如果判断结果为真,则会通过sleep/benchmark()函数造成较长延时,如果不为真,则语句很快就执行完毕。

sleep(time):延迟time(s)时间

benchmark(count,expr):expr语句执行count次

3、报错注入

页面会返回错误信息,或者把注入的语句的结果直接返回在页面中,这种形式的注入在平常的攻击中很常见。

4、联合查询注入

可以使用union的情况下的注入。这类注入在平时的攻击中也很常见,通常都是用union联合查询来爆出其他表的信息。

5、堆查询注入

可以同时执行多条语句的执行时的注入。


本文作者:城北徐公,360网络安全学院学员

原文地址:

https://www.starlitsky.online/starlitsky/?p=194


360网络安全学院 是360旗下官方唯一教育培训机构,目前开设《安全运维与响应》和《安全评估与审计》两大培训方向,旨在培养专业的网络安全人才,为国家及社会的网络安全保驾护航。

官网:https://college.360.cn/

界世的你当不

只做你的肩膀

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

关注360技术,关注技术与安全~

文章转载自360技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论