• 回答数

    4

  • 浏览数

    326

转角的夏天xia
首页 > 期刊论文 > sql注入检测技术论文

4个回答 默认排序
  • 默认排序
  • 按时间排序

北京美克

已采纳

8.26:web安全基础及手工判断sql注入漏洞点

231 评论

三石太保

Title : the Information Security Detection and Prevention of University Database Abstract: With the increase of network security awareness, the single method of penetration test is unable to satisfy the need of remote penetration. The more effective way of remote penetration test uses comprehensively progressive attack techniques to intrude the internal network and get the target computer's authorization via horizontal privilege escalation so as to obtain the confidential information finally. As the preferred way of intruding an internal network, web scriting attack that mainly uses SQL injection attack has become one of the most important techniques in remote penetration test.SQL injection attack represents the common method that hackers use to attck databases. Like general access to a web page, It accesses the page via normal WWW ports in which case the firewall doesn't sound the alarm. Due to the flexibility of SQL injection, unexpected conditions often occure when using it. This article takes a PHP+MySQL website based on B/S architecture as a good example to deeply analyze the detection and prevention measures of SQL injection.Key Words: DataBase information security SQL injection solutions

158 评论

虾子王0001

在最近两年中,安全专家应该对网络应用层的攻击更加重视。因为无论你有多强壮的防火墙规则设置或者非常勤于补漏的修补机制,如果你的网络应用程序开发者没有遵循 安全代码进行开发,攻击者将通过80端口进入你的系统。广泛被使用的两个主要攻击技术是SQL注入[ref1]和CSS[ref2]攻击。SQL注入是指:通过互联网的输入区域,插入SQL meta-characters(特殊字符 代表一些数据)和指令,操纵执行后端的SQL查询的技术。这些攻击主要针对其他组织的WEB服务器。CSS攻击通过在URL里插入script标签,然后 诱导信任它们的用户点击它们,确保恶意Javascript代码在受害人的机器上运行。这些攻击利用了用户和服务器之间的信任关系,事实上服务器没有对输入、输出进行检测,从而未拒绝javascript代码。 这篇文章讨论SQL注入和CSS攻击漏洞的检测技术。网上已经有很多关于这两种基于WEB攻击的讨论,比如如何实施攻击,他们的影响,怎样更好的编制和设计程序防止这些攻击。 然而, 对如何检测这些攻击并没有足够的讨论。我们采用流行的开源的IDS Snort[ref 3],组建根据检测这些攻击的规则的正则表达式。附带,Snort默认规则设定包含检测CSS的方法,但是这些容易被避开检测。比如大多通过hex进制编码,如%3C%73%63%72%69%70% 74%3E代替避开检测。 依赖level of paranoia组织的能力,我们已经编写了多种检测相同攻击的规则。如果你希望检测各种可能的SQL注入攻击,那么你需要简单的留意任何现行的SQL meta-characters,如单引号,分号和双重破折号。同样的一个极端检测CSS攻击的方法,只要简单地提防HTML标记的角括号。但这样会检测 出很多错误。为了避免这些,这些规则需要修改使它检测更精确些, 当仍然不能避免错误。 在Snort规则中使用pcre(Perl Compatible Regular Expressions)[ref4]关键字,每个规则可以带或不带其他规则动作。这些规则也可以被公用软件如grep(文档搜索工具)使用,来审阅网络服务器日志。 但是,需要警惕的是,用户的输入只有当以GET提交请求时,WEB服务器才会记录日记,如果是以POST提交的请求在日记中是不会记录的。 2. SQL注入的正则表示式 当 你为SQL注入攻击选择正则表示式的时候,重点要记住攻击者可以通过提交表单进行SQL注入,也可以通过Cookie区域。你的输入检测逻辑应该考虑用户 组织的各类型输入(比如表单或Cookie信息)。并且如果你发现许多警告来自一个规则,请留意单引号或者是分号,也许些字符是你的Web应用程序创造的 合法的在CookieS中的输入。因此, 您需要根据你的特殊的WEB应用程序评估每个规则。 依照前面提到,一个琐细的检测SQL射入攻击的正则表达式要留意SQL特殊的meta-characters 譬如单引号(’)双重扩则号(--),为了查出这些字符和他们hex等值数, 以下正则表达式适用: 2.1 检测SQL meta-characters的正则表达式 /(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix 解释: 我 们首先检查单引号等值的hex,单引号本身或者双重扩折号。这些是MS SQL Server或Oracle的字符, 表示后边的为评论, 随后的都将被忽略。 另外,如果你使用MySQL,你需要留意 ’#’和它等值的hex的出现。注意我们不需要检查双重破折号等值的hex, 因为这不是HTML meta-character, 浏览器不会进行编码。 并且, 如果攻击者设法手工修改双重破折号为它的hex值%2D(使用代理像Achilles[ref 5]), SQL注入将失败。 加入上述正则表达式的新的Snort规则如下: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SQL Injection - Paranoid"; flow:to_server,established;uricontent:".pl";pcre:"/(\%27)|(\’)|(\-\-)|(%23)|(#)/i"; classtype:Web-application-attack; sid:9099; rev:5;) 在本篇讨论中, uricontent关键字的值为".pl ", 因为在我们的测试环境里, CGI 程序是用Perl写的。uricontent关键字的值取决于您的特殊应用, 这个值也许是".php ", 或" .asp ", 或" .jsp ", 等。 从这点考虑, 我们不显示对应的Snort 规则, 但是我们会给出创造这些规则的正则表达式。 通过这些正则表达式你可以很简单的创造很多的Snort规则.在前面的正则表达式里, 我们检测双重破折号是因为:即便没有单引号的存在那里也可能是SQL射入点[ref 6]。 例如, SQL查询条目只包含数值,如下: select value1, value2, num_value3 from database where num_value3=some_user_supplied_number 这种情况,攻击者可以执行额外的SQL查询, 示范提交如下输入: 3; insert values into some_other_table 最后, pcre的修饰符’ i’ 和’ x ’ 是用于分别匹配大小写和忽略空白处的。 上面的规则也可以另外扩展来检查分号的存在。然而,分号很可以是正常HTTP应答的一部分。为了减少这种错误,也是为了任何正常的单引号和双重扩折号的出 现,上面的规则应该被修改成先检测=号的存。用户输入会响应一个GET或POST请求,一般输入提交如下: username=some_user_supplied_value&password=some_user_supplied_value 因此, SQL 注入尝试将导致用户的输入出现在a = 号或它等效的hex值之后。 2.2 修正检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i 解释: 这个规则首先留意 = 号或它的hex值(%3D),然后考虑零个或多个除换行符以外的任意字符,最后检测单引号,双重破折号或分号。 典 型的SQL注入会尝试围绕单引号的用途操作原来的查询,以便得到有用的价值。讨论这个攻击一般使用1’or’1’=’1字符串. 但是, 这个串的侦查很容易被逃避,譬如用1’or2>1 --. 然而唯一恒定的部分是最初的字符的值,跟随一单引号,再加’or’。随后的布尔逻辑可能在一定范围上变化,可以是普通样式也可能是非常复杂的。这些攻击可 以相当精确被侦测,通过以下的正则表达式。2.3章节讲解。 2.3 典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 解释: \w* - 零个或多个字符或者下划线。 (\%27)|\’ - 单引号或它的hex等值。 (\%6 F)|o|(\%4 F))((\%72)|r|-(\%52) -‘or’的大小写以及它的hex等值。 ’union’SQL 查询在SQL注入各种数据库中攻击中同样是很常见的。如果前面的正则表达式仅仅检测单引号或则其他的SQL meta characters ,会造成很多的错误存在。你应该进一步修改查询,检测单引号和关键字‘union’。这同样可以进一步扩展其他的SQL关键字,像’select’, ’insert’, ’update’, ’delete’, 等等。 2.4 检测SQL注入,UNION查询关键字的正则表达式 /((\%27)|(\’))union/ix (\%27)|(\’) - 单引号和它的hex等值 union - union关键字 可以同样为其他SQL查询定制表达式,如 >select, insert, update, delete, drop, 等等. 如 果,到这个阶段,攻击者已经发现web应用程序存在SQL注入漏洞,他将尝试利用它。如果他认识到后端服务器式MS SQL server,他一般会尝试运行一些危险的储存和扩展储存过程。这些过程一般以‘sp’或‘xp’字母开头。典型的,他可能尝试运行 ‘xp_cmdshell’扩展储存过程(通过SQL Server执行Windows 命令)。SQL服务器的SA权限有执行这些命令的权限。同样他们可以通过xp_regread, xp_regwrite等储存过程修改注册表。 2.5 检测MS SQL Server SQL注入攻击的正则表达式 /exec(\s|\+)+(s|x)p\w+/ix 解释: exec - 请求执行储存或扩展储存过程的关键字 (\s|\+)+ - 一个或多个的空白或它们的http等值编码 (s|x) p- ‘sp’或‘xp’字母用来辨认储存或扩展储存过程 \w+ - 一个或多个字符或下划线来匹配过程的名称 3. 跨站脚本(CSS)的正则表达式 当 发动CSS攻击或检测一个网站漏洞的时候, 攻击者可能首先使简单的HTML标签如(粗体),(斜体)或(下划线),或者他可能尝试简单的 script标签如alert("OK"). 因为大多数出版物和网络传播的检测网站是否有css漏洞都拿这个作为例子。这些尝试都可以很简单的被检测出来。 然而,高明点的攻击者可能用它的hex值替换整个字符串。这样标签会以%3C%73%63%72%69%70%74%3E出 现。 另一方面,攻击者可能使用web代理服务器像Achilles会自动转换一些特殊字符如换成%3E.这样攻击发生时,URL 中通常以hex等值代替角括号。 下列正则表达式将检测任何文本中包含的html的。它将捉住试图使用、、或。这正则表达式应该忽略大小写。我们需要同时检测角括号和它的hex等值(% 3C| 3.1 一般 CSS 攻击的正则表达式 /((\%3C)|)/ix 解释: ((\%3C)|) -检查>或它的hex等值 Snort 规则: alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NII Cross-site scripting attempt"; flow:to_server,established; pcre:"/((\%3C)|)/i"; classtype:Web-application-attack; sid:9000; rev:5;) 跨站脚本同样可以使用技术。现行默认的snort规则可以被轻易避开。 3.2章节提供了防止这种技术的方法。 3.2 " /((\%3C)|)/I 解释: (\%3 C)|) ->或它的hex等值 3.3 CSS 攻击的极端的正则表达式 /((\%3C)|)/I 解释: 这个规则简单寻找。由于你的web服务器和web应用程序的构架,这个规则可能产生一些错误。但它能保证捉住任何CCS或者类似CSS的攻击。 一个不错避开过滤的CSS方法请参考Bugtraq投稿的 http://www.securityfocus.com/archive/1/272...rchive/1/272037. 但是请注意最后一种极端的规则将能检测这所有的攻击。 总结: 在 这篇文章中,我们提出了不同种类的正则表达式规则来检测SQL注入和跨站脚本攻击。有些规则简单而极端,一个潜在的攻击都将提高警惕。但这些极端的规则可 能导致一些主动的错误。考虑到这点,我们修改了这些简单的规则,利用了另外的样式,他们可以检查的更准确些。在这些网络应用成的攻击检测中,我们推荐将这 些作为调试你IDS或日志分析方法的起点。再经过几次修改后,在你对正常网交易部分的非恶意应答进行评估以后,你应该可以准备的检测那些攻击了。

186 评论

lalack1987

SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据或破坏的目的。 当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。SQL注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或者作为存储过程的输入参数,这些表单特别容易受到SQL注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是SQL注入就发生了。一般SQL注入 在Web 应用程序的登录验证程序中,一般有用户名(username) 和密码(password) 两个参数,程序会通过用户所提交输入的用户名和密码来执行授权操作。我们有很多人喜欢将SQL语句拼接起来。例如: Select * from users where username =’ txtusername.Text ’ and password =’ txtpassword.Text ’ 其原理是通过查找users 表中的用户名(username) 和密码(password) 的结果来进行授权访问, 在txtusername.Text为mysql,txtpassword.Text为mary,那么SQL查询语句就为: Select * from users where username =’ mysql ’ and password =’ mary ’ 如果分别给txtusername.Text 和txtpassword.Text赋值’ or ‘1’ = ‘1’ --和abc。那么,SQL 脚本解释器中的上述语句就会变为: Select * from users where username =’’or ‘1’ = ‘1’ -- and password =’abc’ 该语句中进行了两个条件判断,只要一个条件成立,就会执行成功。而'1'='1'在逻辑判断上是恒成立的,后面的"--" 表示注释,即后面所有的语句为注释语句这样我们就成功登录。即SQL注入成功. 如果我们给txtusername.Text赋值为:’;drop table users--即: Select * from users where username =’’;drop table users-- and password =’abc’ 整个用户表就没有了,当然这里要猜出数据表名称。想想是多么可怕的事情。 好我想大家在这里已经大致明白了一般SQL注入了,试想下您的登录程序会不会出现我上述的情况。防范SQL注入 那么现在大家都在思考怎么防范SQL注入了这里给出一点个人的建议1.限制错误信息的输出 这个方法不能阻止SQL注入,但是会加大SQL注入的难度,不会让注入者轻易得到一些信息,让他们任意破坏数据库。SQL Server有一些系统变量,如果我们没有限制错误信息的输出,那么注入着可以直接从出错信息获取,例如(假定这里用的string即字符类型并可以发生SQL注入): and user>0 这句语句很简单,但却包含了SQL Server特有注入方法的精髓,。首先看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQL Server的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQL Server的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,注入着就拿到了数据库的用户名。 众所周知,SQL Server的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。 当然注入者还可以输入不同的信息来得到他们想要的信息 ,上面只是其中一个例子,所以我们要限制错误信息的输出,从而保护我们的数据库数据,这里我给出.NET限制错误信息的方法: 在Web.Config文件中设置 这样当发生错误时候就不会讲信息泄露给外人。2.限制访问数据库帐号的权限 对于数据库的任何操作都是以某种特定身份和相应权限来完成的,SQL语句执行前,在数据库服务器端都有一个用户权限验证的过程,只有具备相应权限的帐号才可能执行相应权限内的SQL语句。因此,限制数据库帐号权限,实际上就阻断了某些SQL语句执行的可能。不过,这种方法并不能根本解决SQL注入问题,因为连接数据库的帐号几乎总是比其他单个用户帐号拥有更多的权限。通过限制贴帐号权限,可以防止删除表的攻击,但不能阻止攻击者偷看别人的信息。3.参数化使用命令 参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的数据,它们通过Command对象Parameters集合来传送。能导致攻击的SQL代码可以写成:Select * from employee where userID=@userID; 如果用户输入: 09105022’OR ‘1’=’1,将得不到何记录,因为没有一个用户ID与文本框中输入的’ 09105022’OR ‘1’=’1’相等。参数化命令的语法随提供程序的不同略有差异。对于SQL SERVER提供程序,参数化命令使用命名的占位符(具有唯一的名字),而对于OLE DB提供程序,每个硬编码的值被问号代替。使用OLE DB提供程序时,需要保证参数的顺序和它们出现在SQL字符串中的位置一致。SQL SERVER提供程序没有这样的需求,因为它们用名字和占位符匹配。4.调用存储过程 存储过程是存储在数据库服务器上的一系列SQL代码,存储过程与函数相似,有良好的逻辑封装结构,可以接收和返回数据。使用存储过程可以使代码更易于维护,因为对存储过程的更改不会导致应用程序的重新编译,使用存储过程还可以节省带宽,提高应用程序性能。因为存储过程是存储在数据库服务端的独立的封装体,调用存储过程可以保证应用程序只执行存储过程中的固定代码,从而杜绝SQL语句注入的可能。结合上述所讲的参数化命令,可以实现SQL代码可以实现的任何功能,并进一步提高应用程序的安全等级。5.限制输入长度 如果在Web页面上使用文本框收集用户输入的数据,使用文本框的MaxLength属性来限制用户输入过长的字符也是一个很好的方法,因为用户的输入不够长,也就减少了贴入大量脚本的可能性。程序员可以针对需要收集的数据类型作出一个相应的限制策略。6.URL重写技术 我们利用URL重写技术过滤一些SQL注入字符,从而达到防御SQL注入。因为许多SQL注入是从URL输入发生的。7.传递参数尽量不是字符 假设我们显示一篇新闻的页面,从URL传递参数中获得newid我们可能会随手写下下面的代码: string newsid = Request.QueryString["newsid"]; string newssql = "select * from news where newsid=" + newsid; 如果传递过来的参数是数字字符就没有问题。但是如果传递过来的newsid是“1 delete from table ”的话,那么sql的值就变成了“select * from table where newsid=1 delete from news”。发生注入成功。但是这里改为 int newsid=int.Parse(Request.QueryString["newsid"].ToString()); string newssql = "select * from news where newsid=" + newsid.Tostring(); 这里如果还是上面"1 delete from table "会发生错误,因为在转换时候出现了错误 从上面的一个小例子,我们得出在传递参数时候尽量不要用字符,免得被注入。最后是我想扩展下利用URL重写技术来过滤一些SQL注入字符,首先这里有一篇关于URL重写的文章,我的基本思想是可以利用它,屏蔽一些危险的SQL注入字符串,这些字符串我们可以人为的设定,毕竟我们还是根据特定的环境设定我们防御措施。首先我们在ModuleRewriter类中的Rewrite函数得到绝对的URL判断其中是否有危险字符,如果有我们就将它链接到一个提示用户您输入危险的URL地址。如果不是我们继续判断是否触发了其他的URL重写的规则,触发了就重写。这样就大致上能在URL上防御危险字符。代码

~/d(\d+)\.aspx ~/Default_sql_error.aspx ~/d(\d+)\.aspx ~/Default2.aspx 上面是要在web.config配置文件加上的内容,这里我加上了两个重写规则,第一个规则是专门针对满足这个正则表达式的页面URL查看是否有危险字符,有危险字符就会发送到Default_sql_error.aspx页面,来示警。这里我假定会发生危险字符注入的页面时以"d"字符开头并加上数字的页面(这里我们可以根据实际情况自己定义,看哪些页面URL容易发生我们就制定这些页面的正则表达式),第二个是一般URL重写。因为这里我采用的是HTTP模块执行URL重写,所以加上这一块。 第二步就是要在重写Rewrite函数了代码 protected override void Rewrite(string requestedPath, System.Web.HttpApplication app) { // 获得配置规则 RewriterRuleCollection rules = RewriterConfiguration.GetConfig().Rules; //获得绝对的URL Uri url = app.Request.Url; // 判断url 中是否含有SQL 注入攻击敏感的字符或字符串,如果存在,sqlatFlag = 1 ; string urlstr = url.AbsoluteUri; int sqlatFlag = 0; //这里我们根据实际情况随便编写,我这里这是随便列举了几个 string words = "exec ,xp ,sp ,declare ,cmd ,Union ,--"; string[] split = words.Split(','); foreach (string s in split) { if (urlstr.IndexOf(s.ToUpper()) > 0) { sqlatFlag = 1; break; } } if (sqlatFlag == 1) { // 创建regex Regex re = new Regex(rules[0].SendTo, RegexOptions.IgnoreCase); // 找到匹配的规则,进行必要的替换 string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.ToString()); // 重写URL RewriterUtils.RewriteUrl(app.Context, sendToUrl); } else { // 遍历除rules[0 ]以外的其他URL 重写规则 for (int i = 1; i < rules.Count; i++) { // 获得要查找的模式,并且解析URL (转换为相应的目录) string lookFor = "^" + RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules[i].LookFor) + "$"; // 创建regex Regex re = new Regex(lookFor, RegexOptions.IgnoreCase); // 查看是否找到了匹配的规则 if (re.IsMatch(requestedPath)) { // 找到了匹配的规则, 进行必要的替换 string sendToUrl = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules[i].SendTo)); // 重写URL RewriterUtils.RewriteUrl(app.Context, sendToUrl); break; // 退出For 循环 } } } }那么下一步就是检验例子了首先我们输入 这样 没有改变,就会显示Default_sql_error.aspx里内容“您输入了危险字符”。 再输入就会显示 Default2.aspx内容,因为这里触发了第二个重写规则

147 评论

相关问答

  • sql注入研究论文分享

    SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入到应用程序中,从而通过执行非程序员预期的SQL代码,达到窃取数据或破坏的目的。 当应用程序使用输

    winwing168 5人参与回答 2023-12-11
  • 网站检测技术论文

    大概当今所有的研究生毕业论文都会经过中国知网的“学术不端检测”,即便最后不被盲审。这个系统的初衷其实是很好的,在一定程度上能够对即将踏入中国科研界的硕士研究生们

    花usahana兔 8人参与回答 2023-12-08
  • 入侵检测技术论文文献

    入侵检测技术论文篇二 浅析入侵检测技术 摘 要 入侵检测系统是一个能够对网络或计算机系统的活动进行实时监测的系统,它能够发现并报告网络或

    嘚啵嘚啵的sissi 4人参与回答 2023-12-06
  • 结构检测技术论文

    钢结构的焊接技术的好坏,在一定程度上会影响到建筑本身的质量。下面我整理了钢结构焊接技术论文,欢迎大家阅读!钢结构焊接技术论文篇一:《钢结构安装焊接施工技术》

    秀之美--艳梅 1人参与回答 2023-12-10
  • 测控技术期刊检测

    《测控技术》的主要栏目有:仪表与传感器,数据采集与处理 ,控制系统,总线与网络,软件纵横,理论与实践,科技动态,理论与实践。中图分类号TK表示动力工程,在《测控

    恋上这个冬 3人参与回答 2023-12-08