网页被篡改,银行卡信息被盗用,敏感数据泄露......网络安全问题层出不穷。
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注入的几种分类之间的关系:

下面分别来说下各种分类注入时的情形:
一 | 按注入点的类型分类(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技术,关注技术与安全~




