首页 > 深圳网站制作 > 网站建设平台有哪些,SQL注入,WEB渗透入门教程
2019
01-13

网站建设平台有哪些,SQL注入,WEB渗透入门教程

SQL注入,WEB渗透入门教程


SQL注入原理

对于WEB应用来说,用户数据等都是存储在数据库中的。SQL注入就是攻击者通过构造一些恶意的SQL查询语句,让后台的数据库去解析,从而达到入侵目标网络,获取敏感信息的攻击手段。

SQL的危害

一旦数据库被入侵的话,黑客们可以搞得事情就多了,例如脱你裤子(拖库),就是把你整个数据库拿下来,这就意味着你所有的用户信息泄露。这些被获取到用户信息可以可能会被倒卖,二次利用(例如,有些人喜欢一套用户名密码用到底的,可以直接做成字典去暴力刷取一些邮箱等)。

数据库MYSQL基础

补充一点数据库的查询方式,一个MYSQL里面可以有很多个数据库,一个数据库里面会有很多张数据表,数据表可以理解为Excel的表格样式。比如我需要查询ID=1的用户,这个命令到达数据库之后,数据库会在数据表的ID列,查询值为1的那格,输出ID值为1的那行的用户名。当数据库查找到在ID这一列一个个往下找的时候,会返回布尔值(TRUE 或者FALSE)ID=1的时候,会返回TRUE。

一个简单的数据库查询语句是这样的

SELECT first_name, last_name FROM users WHERE user_id = '$id'

在【users】这个表中查询【user_id 】等于【1】(我们在网页上输入的值)的【first_name】和【 last_name】。

SQL注入的分类

SQL注入的分类有很多种方式吧,有按注入位置分的,有按参数类型分,有按注入技术分类的,下面我们具体介绍错误回显和布尔注入。明天会接着介绍时间盲注和UNION注入。(使用OWASP的DVWA靶机演示部分注入)

错误回显

错误回显是通数据库的报错信息来获取一些数据库的基本信息。错误回显最基础的注入就是单引号【'】

错误回显

我们可以从错误回显中可以看到,靶机使用的数据库是MYSQL,提示我们第一行中的【'】不是一个正确的符号。

这里我们看一下对应的MYSQL语句发生了什么变化。

SELECT first_name, last_name FROM users WHERE user_id = '''

可能不太明显,最后【user_id = '''】这里搜索的值是【'】,这里是提前闭合了这个SQL语句,导致多了一个【'】出来。只要语句有一点错误,数据库都不会接受这个语句,所以数据库报错,并返回错误信息。

布尔

布尔注入的思路主要是以下三点。1、提前闭合语句。2、利用OR和AND构造特殊情况,例如恒为正确。3、注释后面多余的SQL语句

' or 1=1 -- '

#单引号【'】提前闭合了对于id的查询,然后构造【1=1】恒为正确的情况,【-- 】注释了后面的SQL语句

构造恒为正确语句

网页把所有的用户都回显出来了

我们也同样来看MYSQL语句的变化

SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 -- ' '

分析MYSQL语句,查询ID=空(其实是什么都无所谓)【'】闭合前面的SQL了,【or】(或者)1=1,后面注释掉,不匹配。那么数据库在ID列一个个往下对比数据的时候,无论是否匹配成功,都会被后面【1=1】的TRUE强行匹配成功,所以就把所有可以返回的用户及密码都显示在页面上了。

二,WEB渗透入门教程——SQL注入(2)

小白的web学习之路2017-11-09 22:19:34

承接上一篇WEB渗透入门——SQL注入,接下来介绍一下时间盲注和UNION注入。

时间盲注

其实一般来说,现实环境中的网站会有一些安全设置,会导致一些简单的错误回显或者布尔注入无法实现。这时候我们可以通用调用MYSQL内部的函数来实现注入。时间盲注正是利用【AND】逻辑,调用MYSQL内置的【sleep】函数,实现确定SQL注入点的手段。

插一个数据库知识点。sleep这个函数通常会用在运维调试的时候,比如我想确定一下我的页面是不是真的向服务器发起了执行SQL语句的请求的时候,可以通过【sleep(n)】来使页面反馈停留n秒。

为了直观可见,我直接使用数据库来实现。

搜索时间为0.00sec

搜索时间为5.00sec

虽然数据库不会返回任何数据,但是搜索时间的明显增长,在我们浏览的页面上,体现为加载时间明显变长了。

UNION注入

要讲明白union注入是什么,就要先知道union是什么。

这里再次插入数据库知识点:UNION联合查询语句。数据库的查询指令【select】的具体语法可以从我上面的截图看到,而UNION是用来连接两个【select】查询语句的。我先创建两个表格test1和test2,如图

两个表格,嗯,我手残打成了lasttname,不要在意

select firstname from test1 where id=1 union select lasttname from test2 where id=1;

查询结果

我们分别从test1中获取【xiao】和test2中获取【bai】这两个数据,通过UNION查询将两个查询语句的结果联合输出。

关于UNION的用法,还有一个很重要的特点是,他前后两个【select】语句查询的项的数目必须是一致的。我第一个【select】语句只查询了一项【firstname】,那么我第二个【select】语句也只能查询一项,不然数据库会报错。

所以可以通过这个特点,我们可以通过不断改变我们注入语句的查询项的数目,来确定目标后台查询的具体数目。

UNION可以从另外一个表获取数据的特性就可以帮助我们搞事情了。

我们来看下一张图。我通过不断改变【select】查询项的数目

1' union select null -- '

1' union select null,null -- '

1' union select null,null,null -- '

得到了靶机的后台查询是两个查询项,故构造了如下的语句来获得数据库的版本信息。

@@version也是MYSQL的内置函数

得到数据库的版本

我们这里利用了【@@version】这个函数,通过UNION注入获取到数据库版本【5.1.41-3】系统信息【ubuntu12.6】。还可以获取整个MYSQL的数据库名字,用户信息等。

这里又要插入一个数据库知识点。MYSQL数据库(>=5.0)中有一个自带数据库【information_schema】,从名字我们就可以知道这是一个放着我们数据库信息的数据库。我们可以从这里获取到诸如整个MYSQL中创建了多少数据库,权限列表等十分敏感的信息。

这里我再放一个利用UNION注入拿到MYSQL所有数据库名字的回显。

url

回显

从这里我们可以看出,靶机中只有【information_schema】和【dvwa】两个数据库。至于像用户信息,用户权限等信息的获取,大家可以回去自己尝试,这里就不累述了

三,SQL注入的攻击思路和防御思路。

今天一整篇文章都是文字啊,感觉阅读起来很困难。我在中间分别插入一些有SQL注入漏洞原始PHP代码截图。代码来源全部是来自DVWA靶机的。

SQL注入的攻击思路

小编曾经在安全服务公司里面当过实习生,所以对现实环境中的渗透测试有一点了解。通常现实环境中,如果测试的对象是在生产环境中的门户网站之类的,我们的渗透测试是不能用SQLMAP这些自动化注入工具的。为了维持客户的生产环境中的网站正常运行,我们一般使用手工注入。

SQL注入攻击的思路一般是按照下面的顺序来的。

1、判断是否有SQL注入的漏洞

判断注入漏洞是否存在一般利用【布尔注入】、【时间盲注】。【时间盲注】在上一篇文章里已经介绍得比较完整了,下面我补充了【布尔注入】判断注入点的用法。

网站建设与网页设计 【布尔注入】之前介绍是通过构造一个【必为真】的情况,来获取整个数据表的数据,但是真实环境中,一般是即使我们成功让我们构造的语句运行也不一定会有像靶机那样的反馈。在网页没有一个明确回显的时候,我们怎么知道这里是否存在一个注入漏洞呢?(一时没有找到好的配图,直接文字说明吧。)

.php?id=1' or 1=1 --'

.php?id=1' or 1=2 --'

上面这两个语句分别构造了【永为真】和【永为假】两种特殊情况。假如我们在用【永为真】的语句注入后,并没有返回有用的信息的话,我们可以通过比较【永为真】【永为假】两个语句分别出来的回显,如果不一样,那我们可以基本确定我们构造的【1=1】【1=2】已经被执行了,所以可以基本确定有SQL注入漏洞。

这里放一个低安全级别的代码吧。

这里支持单纯的获取ID值,就丢进去数据库查询,是最不安全的代码

这段代码对获取的【$id】没有做任何的过滤操作,就是说我们想怎么传递SQL语句都可以,是十分不安全的代码。

2、获取数据库的类型和操作系统信息

获取数据库和操作系统信息一般是通过UINON查询来查询一些敏感的内置函数来实现的。下面列举一些有用的内置函数。

@@datadir #返回数据库的路径

@@basedir #返回数据库的安装路径

@@version_compile_os #返回操作系统信息

@@version #返回数据库版本信息

通过这些收集数据库和系统信息,如果发现目标的版本过低,或者并没有更新到最新的版本,可能会有一些系统固有漏洞,可能可以通过工具简化后面的渗透步骤。(不过网上的工具一般是不可以在为客户提供服务怎样网站建设的时候使用的,因为并没法保证网上的工具有没有后门,会不会为客户产生一个新的威胁。)

3、获取数据库内容

4、加密信息破解

5、提升权限

6、内网渗透

在一个常规的渗透测试的项目中,一般是点到为止,我们是不会执行3-6点的操作的。在交互的报告上,只会注明网站那些地方出现了SQL注入漏洞,通过怎样的playload可以重现,建议怎样修复。

这里放一个中等安全的代码,代码有点长,只放核心查询位置的代码吧

北海网站建设 这里调用了一个php函数:mysql_real_escape_string

【mysql_real_escape_string】这个函数会将获取的数据(这里是【$id】)所有特殊字符进行转义,当然包含单引号【'】双引号【"】这两个,是用于防御SQL注入攻击的函数。

SQL注入的防御思路

防御永远比攻击要难得多,为什么这么说呢?

如果作为一个黑客,你只要在网站上面找到一个攻击点,我就可以攻击进去了,我不需要管其他地方有没有漏洞,会不会被其他人利用。

但是作为安全工程师的话,你需要知道你网站所有有可能被攻击的地方,并针对每一个点来进行加固。WEB上可以攻击的点不只只有SQL注入一种漏洞,还有XSS、CSRF等等,这两个后面肯定也会介绍到。

回到正题,我们要怎样去防御SQL注入攻击呢?

1、首先,永远不要相信用户的输入。SQL注入攻击的第一步就是确定是否存在SQL注入漏洞。我们是无法保证用户是不是按照我们希望的那样去输入查询信息的。所以我们要对用户的输入进行限制,避免被轻易的找到SQL注入漏洞。例如:

(1)通过正则表达式来限制用户的输入长度;

(2)对单引号【'】,注释符号【--】进行过滤;

(3)在开发网页的过程中,重视安全性,调用类似【mysql_real_escape_string】这样的函数进行防御。

2、攻击者在确定有SQL注入漏洞后,会尝试获得我们的数据库和SERVER OS版本信息,我们应该用自定义错误信息包装原始错误信息,避免数据库和SERVER OS版本信息轻易流出。

3、做好数据库的权限分离。我们永远无法保证网站是100%安全的,永远都有被拖库的可能。那么好的权限分离可以帮助我们在被拖库后,不被获取到大量有意义的数据。

比如说,我们必然不能通过ROOT用户来管理应用,应该为每个应用创建对应的数据库账号,并配置好相应的权限。那么即使被拖库了,攻击者也无法获得其他数据库的资料。这里有一个权限分配原则:赋予账号可以完成日常管理的最小权限。

4、所有敏感信息,例如密码,一律要加密,并且要哈希加盐处理。

又来插入知识点:加盐加密。

我们永远无法保证网站是100%安全的,永远都有被拖库的可能。那么,怎么保证在拖库之后,也不会让人轻易的获得我们用户的密码呢?大家都知道HASH是一种不可逆的加密方式,但是这种加密方式由于计算机的性能的快速提升,已经可以通过撞库破解了。

加盐加密应运而生:即使用户的密码很短,只要我们在他的短密码后面加上一段很长的字符,再计算MD5值,那反推出原始密码就变得非常困难了。加上的这段字符,我们称为盐(Salt),通过这种方式加密的结果,我们称为加盐HASH。

文末就放高安全级别代码吧,这里放出对获取的【$id】的处理方式

这里调用了两个函数【stripslashes】【mysql_real_escape_string】

高安全级别的代码,想要绕过防御就十分困难了,大家可以一起研究交流一下。


本文》有 0 条评论

留下一个回复