SQL注入详解 sql注入超详细原理教程
yuyutoo 2024-10-24 17:53 6 浏览 0 评论
一、SQL注入
注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,
第一个是用户能够控制输入;
第二个是原本程序要执行的代码,拼接了用户输入的数据。
var sql = "select * from tableName where name='" + "test" + "'";
这个“拼接”的过程很重要,正是这个拼接的过程导致了代码的注入。
如果是一条update/delete语句,就可能会造成严重的后果。
在SQL注入的过程中,如果网站的Web应用程序抛出异常信息,比如攻击者在参数中输入一个单引号“'”,引起执行查询语句的语法错误,而错误信息显示在页面上,对于攻击者来说,构造SQL注入的语句就可以更加得心应手了。
当Web应用程序不显示异常信息,可以使用“盲注”(Blind Injection)的技巧。
二、盲注(BIind Injection)
所谓“盲注”,就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必须找到一个方法来验证注入的SQL语句是否得到执行。
最常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。
比如,一个应用的URL如下:
http://localhost:88/person.aspx?id=2
执行的SQL语句为:
select * from tableName where id=2
如果攻击者构造如下的条件语句:
http://localhost:88/person.aspx?id=2 and 1=2
实际执行的SQL语句就会变成:
select * from tableName where id=2 and 1=2
因为“and 1=2”永远是一个假命题,所以这条SQL语句的“and”条件永远无法成立。对于Web应用来说,也不会将结果返回给用户,攻击者看到的页面结果将为空或者是一个出错页面。
为了进一步确认注入是否存在,攻击者还必须再次验证这个过程。因为一些处理逻辑或安全功能,在攻击者构造异常请求时,也可能会导致页面返回不正常。攻击者继续构造如下请求:
http://localhost:88/person.aspx?id=2 and 1=1
当攻击者构造条件“and 1=1”时,如果页面正常返回了,则说明SQL语句的“and”成功执行,那么就可以判断“id”参数存在SQL注入漏洞了。
在这个攻击过程中,服务器虽然关闭了错误回显,但是攻击者通过简单的条件判断,再对比页面返回结果的差异,就可以判断出SQL注入漏洞是否存在。这就是盲注的工作原理。
三、Timing Attack
利用 MySQL的BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中被称为Timing Attack。
或者使用微软SQL Server的 waitfor delay '0:0:5' 它用来指定等待的时间。如果将该语句成功注入后,会造成数据库返回记录和Web请求也会响应延迟特定的时间。由于该语句不涉及条件判断等情况,所以容易注入成功。根据Web请求是否有延迟,渗透测试人员就可以判断网站是否存在注入漏洞。同时,由于该语句并不返回特定内容,所以它也是盲注的重要检测方法。
比如构造的攻击参数id值为 :
select * from employee where id=1 if(SUBSTRING(DB_NAME(),1,1)='t') waitfor delay '0:0:5'
这段sql判断数据库名的第一个字母是否为t。如果判断结果为真,则会通过waitfor delay '0:0:5'造成SQL执行延时;如果不为真,则该语句将很快执行完。攻击者遍历所有字母,直到将整个数据库名全部验证完成为止。
四、数据库攻击技巧
找到SQL注入漏洞,仅仅是一个开始。要实施一次完整的攻击,还有许多事情需要做。将介绍一些具有代表性的SQL注入技巧。了解这些技巧,有助于更深入地理解SQL注入的攻击原理。
比如构造的攻击参数id值为以下,则是利用union select来分别确认表名admin是否存在,列名passwd是否存在:
select * from employee where id=1 union all select 1 from amdin select * from employee where id=1 union all select 1,password from amdin
进一步,想要猜解出username和password具体的值,可以通过判断字符的范围,一步步读出来:
select *from employee where id=1 IF ASCII(SUBSTRING((select top 1 city from Customers),1,1))=49 WAITFOR DELAY '0:0:5'
这个过程非常的烦琐,所以非常有必要使用一个自动化工具来帮助完成整个过程。sqlmap.py就是一个非常好的自动化注入工具。
五、命令执行
在MS SQL Server中,则可以直接使用存储过程“xp_cmdshell”执行系统命令。
在MS SQL Server中,存储过程“xp_cmdshell”可谓是臭名昭著了,无数的黑客教程在讲到注入SQL Server时都是使用它执行系统命令:
exec master.dbo.xp_cmdshell 'cmd.exe dir c:' exec master.dbo.xp_cmdshell 'ping'
除了xp_cmdshell外,还有一些其他的存储过程对攻击过程也是有帮助的。
比如
xp_regread可以操作注册表;
xp_servicecontrol,允许用户启动、停止服务;
xp_terminate_process,提供进程的进程ID,终止此进程。
xp_ntsec_enumdomains,列举服务器可以进入的域。
xp_loginconfig,获取服务器安全信息。
xp_dirtree,允许获得一个目录树。
六、SQL自动注入工具
学习了SQL注入的相关知识和技术,当发现有SQL注入漏洞的时候,一般都需要发送大量的请求以便从Web应用程序后台的远程数据库中获取需要的信息,这种手动检测方法费时且效率较低,一些专门的软件可以帮助我们进行检测,正确运行这些软件只需要根据界面提示进行相关操作就可以了。这些软件主要有:
① Pangolin(穿山甲),其网站地址为:http://www.xmarks.com/s/site/www.nosec-inc.com/en/products/pangolin/。
② SQLMap,网站地址为:http://sqlmap.sourceforge.net。
③ Bobcat,网站地址为:http://www.northern-monkee.co.uk/projects/bobcat/bobcat.html。
④ BSQL,网站地址为:http://code.google.come/p/bsq;jacler/。
⑤ Havij,网站地址为:http://itsecteam.com/en/projects/project1.htm。
⑥ SQLInjector,网站地址为:http://www.woanware.co.uk/?page_id=19。
七、正确地防御SQL注入
从防御的角度来看,要做的事情有两件:
(1)找到所有的SQL注入漏洞;
(2)修补这些漏洞。
八、SQL注入的代码层防御:在编写Web应用程序时应该如何进行代码的防御
输入验证防御(JS前端)
输入验证是指在Web页面代码中,用户提交表单数据前,利用一定的规则对输入的数据进行合法性验证。这里的验证不仅要验证数据的类型,还应该利用正则表达式或业务逻辑来验证数据的内容是否符合要求。
Web服务器端数据验证
1、ASP.NET应用程序通过System.Web.HttpRequest类获取用户提交的输入。这个类中包含大量Web应用程序用于访问用户提交的数据的属性和方法。如下表所示:
ASP.NET平台中用于获取用户提交的数据的API.jfif
收到的参数主要有4类,分别是Form参数、URL参数、Cookies参数和Session参数。例如在Web服务器端通过ASP获取这些参数的语句如下。
① Form参数的读取:UserName= Request.Form["User1"];
② URL参数的读取:UserName= Request.QueryString["User1"];
③ Cookies参数读取:UserName=Request.Cookies["User1"];
④ Session参数读取:UserName=Session["User1"];
检查输入数据的数据类型。比如输入时间、日期时,必须严格按照时间、日期的格式,等等,都能避免用户数据造成破坏。但数据类型检查并非万能,如果需求就是需要用户提交字符串,比如一段短文,则需要依赖其他的方法防范SQL注入。
通过代码过滤防御:过滤关键词
"xp_cmdshell","truncate","dump","net user","--","/*" ,"delete","update","insert","exec","count(" ,"RESTORE","net localgroup","asc","execute","desc" ,"drop","truncate","char","grant","master","netlocalgroup administrators"
正确地防御SQL注入:
还有大量应用程序允许用户指定排序关键字(ASC或DESC)
1、参数化参数
2、使用ORM框架查询
相关推荐
- 怎么制作网站
-
制作网站主要包括四个步骤:1、规划网站:在开始制作网站之前,需要先进行规划,如定义目标用户、搭建合适的内容体系、设计出有效的导航体系以及找出正确的信息流方向。2、网站原型设计:将头部、尾部以及中间内容...
- 如何设计和编码制作个人网站?
-
许多开发人员认为擅长设计是一种天生的能力,而创造力是与生俱来的。但是设计是一项可以像其他任何东西一样学习的技能。你不必天生就可以创建一个漂亮的网站的艺术家,这需要实践。在身边的小伙伴的博客,自己的网站...
- 网站开发制作流程步骤及每个步骤的重要性#网站开发制作
-
网站开发制作流程步骤概述。网站开发是一个综合性的过程,需要经过多个步骤来完成。以下是网站开发制作流程的一般步骤:·1.需求分析。这是网站开发的第一步。开发团队与客户一起讨论和了解网站的目标、功能和要求...
- 企业网站建设流程:制作网站的基本步骤
-
企业网站建设流程:制作网站的基本步骤...
- 网站如何设计制作?基本步骤是什么?
-
网站如何设计制作?基本步骤是什么?在现在这个时代想了解一家公司一般都是通过网上搜索来进行了解,所以拥有一个网站更利于树立自己企业的形象,也可以让客户主动来了解自己,下面就和买买提科技一起来看看网站设计...
- 怎样制作一个优秀的网站?
-
想制作网站的朋友们是不是觉得一头雾水,因为网站建设和网络营销这块的学问太深了,自己又摸不着头脑,提供建站服务的公司又跟你说的云里雾里的,不知道到底应该怎么做,下面晟思小编就简单跟大家聊聊网站建设应该注...
- 2023年网站制作步骤流程详细介绍
-
2023年网站制作步骤流程详细介绍第一步:明确目标和需求在开始网站制作之前,我们需要明确我们的目标和需求。这包括确定网站的用途(是用于宣传产品还是提供在线购物等功能)、目标受众、内容等。只有明确了目标...
- 网站设计的基本流程是什么 ,网站制作的基本流程有哪些
-
网站设计的基本流程是什么,网站制作的基本流程有哪些...
- UP主赶紧收藏 超简单的在线动画制作方法
-
现在视频网站火的不要不要的,不过它的门槛也不低,自拍得有绝活或者会表演、分享科普要会找素材、申请授权,会编辑等等,把很多小伙伴挡在了门外。不过没关系,小编最近发现一个不错的办法,那就是用动画表达,特别...
- 网站制作流程步骤
-
网站制作是一个复杂而关键的过程,涉及到多个步骤和环节。以下是一个常用的网站制作流程步骤,供参考。第一步:需求分析...
- 制作网站最简单的方法是什么?
-
制作网站最简单的方法是什么?制作网站最简单的方法就是模板建站,非常方便快捷,模板平台的后台都是可以自定义框架和图片的,大家只要自主DIY进行替换就行了,下面就和买买提科技网一起来看看网站制作的相关内容...
- 如何进行网站制作?网制作站时有哪些注意事项?「延建云」
-
【延建云】中小企业自身的网站制作已成为主流趋势。即使是没有技术支持的个人也可以建立一个网站,这可以节省很多成本。今天,让我们谈谈如何进行网站制作。如何进行网站制作?你可以通过一些网站建设系统来网站制作...
- 网站建设制作流程!
-
一、网站建设的基本流程是什么?...
- 做一个网站基本流程 做公司需要的流程步骤
-
做一个网站都需要哪些具体流程?做网站的六个步骤一、注册域名我们都知道,网站都是由对应的站点域名来访问的,如果我们想要做一个网站,那么就需要注册一个,独一无二的域名,这样的话,也符合自己企业的特别,而且...
- 0基础1天学会做网站,学不会全额退款
-
亲爱的朋友们:你一定要当心了…因为…你可能会多一项技能,而这个技能不仅会提高你的职场竞争力,还会增加你的收入。我要做说的这个技能就是做网站,在很多人的眼里,做网站压根跟自己八竿子都打不着,没事浏览个...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)