Web攻防 PHP + Mysql注入实战演练

随着Web应用的高速发展和技术的不断成熟,对Web开发相关职位的需求量也越来越大,越来越多的人加入了Web开发的行列。但是由于程序员的水平 参差不齐或是安全意识太低,很多程序员在编写代码时仅考虑了功能上的实现,很少或是根本没有考虑应用的安全性问题。这…

SQL注入作为一种很流行的攻击手段,一直以来都受到网络安全研究者和黑客们的广泛关注。那什么是 SQL注入呢?SQL注入是这样一种攻击技术:攻击者通过把恶意SQL命令插入到Web表单的输入域或页面请求的查询字符串中,来达到欺骗服务器执行恶意 的SQL命令的一种攻击方式。

SQL注入攻击概述

SQL注入(SQL Injection)定义

SQL注入是攻击者通过把恶意SQL命令插入到Web表单的输入域或页面请求的查询字符串中,来达到欺骗服务器执行恶意的SQL命令的一种攻击方式。

SQL注入攻击危害

利 用SQL注入漏洞,攻击者可以操纵数据库的数据(如得到数据库中的机密数据、随意更改数据库中的数据、删除数据库等等),在得到一定权限后还可以挂马,甚 至得到整台服务器的管理员权限。由于SQL注入是通过网站正常端口(通常为80端口)来提交恶意SQL语句,表面上看起来和正常访问网站没有区别,如果不 仔细查看WEB日志很难发现此类攻击,隐蔽性非常高。一旦程序出现SQL注入漏洞,危害相当大,所以我们对此应该给予足够的重视。

SQL注入漏洞原理

SQL注入的本质是恶意攻击者将SQL代码插入或添加到程序的参数中,而程序并没有对传入的参数进行正确处理,导致参数中的数据会被当做代码来执行,并最终将执行结果返回给攻击者。
我们来看一个例子,当访问http://www.a.com/cms/new.php?id=3时,在页面上会显示一篇id号为3的文章,在服务器端实际上会执行如下一段代码,如图1所示:

图1

上面的过程中实际执行的SQL语句如下:

Select * from news where id=3

现在我们在URL(http://www.a.com/cms/new.php?id=3)后面添加” and 1=1″,此时实际执行的SQL语句是:

Select * from news where id=3 and 1=1

由于这个条件永远成立,所以返回的页面和正常页面相同。

当添加“ and 1=2”时,会执行如下SQL语句:

Select * from news where id=3 and 1=2

由于这个条件永远不成立,所以返回的页面和正常页面不同。

现在我们可以控制参数id的值来影响程序的返回结果。我们来分析一下图1中的代码,通过GET方式取的参数id的值后,直接用来构造动态SQL语句,并执行SQL查询。整个过程没有对变量id的值作任何处理,导致SQL注入漏洞的产生。

SQL注入典型流程

1.判断Web系统使用的脚本语言,发现注入点,并确定是否存在SQL注入漏洞

2.判断Web系统的数据库类型

3.判断数据库中表及相应字段的结构

4.构造注入语句,得到表中数据内容

5.查找网站管理员后台,用得到的管理员账号和密码登录

6.结合其他漏洞,想办法上传一个Webshell

7.进一步提权,得到服务器的系统权限

(注:以上为一般流程,根据实际情况,情况可能会有所不同。)

PHP+Mysql注入实例

为了方便测试,我们在本地搭建了一个Web系统环境,以攻击者的角度来渗透网站,让读者理解php+mysql注入的完整流程。URL是http://www.a.com/cms/index.php,网站首页截图如图2所示:


图2

手工注入篇

1.查找注入点,判断网站是否存在SQL注入漏洞

首先打开网站,选择“企业新闻”的链接,随便选择一篇新闻,如图3所示。通过此URL(http://www.a.com/cms/new.php?id=3),我们可以确定此处存在一个参数为id,它的值等于3。


图3

现 在我们在http://www.a.com/cms/new.php?id=3后面加一个单引号,会发现返回一个和正常页面不同的页面,如图4所示,这说 明我们添加的单引号影响了程序的运行结果。此处很可能存在注入点,但有时仅用添加单引号的方法判断是否存在注入点并不准确。因为有的程序员认为只要简单过 滤了单引号就可以避免SQL注入,所以在程序参数中只是简单过滤了单引号,并没有做其他处理。这时用添加单引号的方法去探测程序是否存在SQL注入漏洞 时,是探测不到的;但实际上仍然存在SQL注入漏洞,可以通过其他方法探测到。


图4

接着我们在http://www.a.com/cms/new.php?id=3后面添加” and 1=1″和“ and 1=2”,会发现当添加and 1=1时返回的页面和正常页面是一致的,如图5所示。

图5

当添加and 1=2时返回的页面和正常页面不一致,如图6所示。

图6

现在我们可以确定此处是一个SQL注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。可以推断出在访问http://www.a.com/cms/new.php?id=3时数据库中执行的SQL语句大概是这样的:

Select * from [表名] where id=3

添加and 1=1后的SQL语句:

Select * from [表名] where id=3 and 1=1   由于条件and 1=1永远为真,所以返回的页面和正常页面是一致的

添加and 1=2后的SQL语句:

Select * from [表名] where id=3 and 1=2   由于条件1=2永远为假,所以返回的页面和正常页面不一致

2.通过SQL注入,得到我们感兴趣的信息

上面我们确定了此系统存在SQL注入漏洞,下面就让我们来体验下SQL注入强大的威力吧。我们先来判断一下数据库类型以及版本,构造如下语句:

http://www.a.com/cms/new.php?id=3 and ord(mid(version(),1,1))>51

发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0以下版本或者其他类型数据库。

接着我们再构造如下语句来暴表中字段:

a. http://www.a.com/cms/new.php?id=3 order by 10    返回错误页面,说明字段小于10

b. http://www.a.com/cms/new.php?id=3 order by 5    返回正常页面,说明字段介于5和10之间

c. http://www.a.com/cms/new.php?id=3 order by 7    返回错误页面,说明字段大于5小于7,可以判断字段数是6。下面我们再来确认一下

d. http://www.a.com/cms/new.php?id=3 order by 6     返回正常页面,说明字段确实是6
这里采用了“二分查找法”,这样可以减少判断次数,节省时间。如果采用从order by 1依次增加数值的方法来判断,需要7次才可以确定字段数,采用“二分查找法”只需要4次就够。当字段数很大时,二分查找法的优势更加明显,效率更高。

声明: 本文出自《中国蓝客联盟官方团队博客》,转载请注明版权!

转载请注明: 本文转载自中国蓝客联盟官方团队博客
本文链接地址: Web攻防 PHP + Mysql注入实战演练

发表评论

电子邮件地址不会被公开。 必填项已用*标注

人类验证码: 如果无法查看图片请刷页面