渗透攻防Web篇-SQL注入攻击初级
时间:2016-11-25 08:50 来源:转载 作者:zusheng 点击:次
作者:zusheng 时间:2016年8月3日 12:11:50 社区:i春秋 前言 不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数 是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解 SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入。 目录 ![]() 第一节 注入攻击原理及自己编写注入点
第二节 寻找及确认SQL注入
![]() 正文 ![]()
1.1、什么是SQL? SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。 1.2、什么是SQL注入? 看起来很复杂,其实很简单就能解释,SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。 1.3、SQL注入是怎么样产生的? 构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句。开发人员可以使用动态SQL来创建通用、 灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么 字段(如SELECT语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用。 在PHP中动态构造SQL语句字符串:
[PHP] 纯文本查看 复制代码
看上面代码我们可以控制输入参数ichunqiu,修改所要执行SQL语句,达到攻击的目的。 1.4、编写注入点 为了照顾一下新人,这里先介绍一下涉及到的基础知识:
[SQL] 纯文本查看 复制代码
[SQL] 纯文本查看 复制代码
下面的运算符可在 WHERE 子句中使用: ![]() 了解了以上基础知识就让我们来自己编写注入点把。 第一步:我们使用if语句来先判断一下变量是否初始化
[PHP] 纯文本查看 复制代码
第二步:在if语句里面,我们连接数据库。在PHP中,这个任务通过 mysql_connect() 函数完成。
[PHP] 纯文本查看 复制代码
第三步:连接成功后,我们需要选择一个数据库。
[PHP] 纯文本查看 复制代码
第四步:选择完数据库,我们需要执行一条 MySQL 查询。
[PHP] 纯文本查看 复制代码
第五步:执行完查询,我们再对结果进行处理
[AppleScript] 纯文本查看 复制代码
题外话:我们使用echo将执行的SQL语句输出,方便我们查看后台执行了什么语句。
[PHP] 纯文本查看 复制代码
最终代码如下:
[PHP] 纯文本查看 复制代码
MySQL数据库实验环境配置: 代码层工作已经做好,但是在数据库里面,我们还没有ichunqiu这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。 第一步:创建数据库 ![]() 第二步:创建表users和列id,username,password ![]() ![]() 第三步:我们插入几条数据 ![]() 同样的道理,大家多插几条数据。到此我们整个任务就完成了。 最终成果如下: ![]()
2.1、推理测试法 寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个:
了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。 我们现在参数后面加个单引号,如下图: ![]() sql语句最终变为
[SQL] 纯文本查看 复制代码
执行失败,所以mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出的参数值却是一个布尔值。 我们修改代码在
[PHP] 纯文本查看 复制代码
可以发现: ![]() 为了更好的了解MySQL错误,我们在
[PHP] 纯文本查看 复制代码
加上
[PHP] 纯文本查看 复制代码
[SQL] 纯文本查看 复制代码
然后借助这些错误,我们这可以推断应该存在SQL注入。还有其他数据库错误信息,以及MySQL其他错误信息,由于篇幅问题就不一一讲解了。 2.2、and大法和or大法 页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1和and 1=2看看有什么不同 ![]() 可以发现and 1=1 返回了数据,而and 1=2没有,这是由于1=1是一个为真的条件,前面的结果是true,true and true 所以没有任何问题,第二个 1=2 是个假条件, true and false还是false,所以并没有数据返回。 好,讲完and,我们自来看看 or ,or就是或者,两个都为假,才会为假。我们先把id改为5,可以发现id=5是没有数据的。 ![]() 可以发现我们加上or 1=1就成功返回了数据,这是因为1=1为真,不管前面是不是假,数据都会返回,这样就把表里面数据全部返回,我们没看见,是因为代码中并没有迭代输出。这样,我们来修改一下代码。
[PHP] 纯文本查看 复制代码
然后你就可以发现: ![]() 2.3、加法和减法 这里我们需要区分一下数字型和字符串型:
加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。 ![]() 减法是同样的道理,不过我们不需要对-号进行url编码了。 ![]() 结束语 感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。 系列文章预告及导航 渗透攻防Web篇-SQL注入攻击中级(状态:已更新)
渗透攻防Web篇-SQL注入攻击高级(状态:已更新)
|