当前位置:首页 » 编程语言 » 简述sql注入原理
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

简述sql注入原理

发布时间: 2022-03-12 04:42:11

sql注入攻击原理和漏洞检测技术

SQL注入指的是当用户提交给服务器的数据不在程序员的预料范围内时,服务器返回了一些敏感信息。通常这个是参数过滤不严格造成的,是程序员的责任。 举个例子吧 比如有这个页面 http://www.xxx.com/showdetail.asp?id=1 这个地址后有个问号,后面有个id=1这就是用户提交给服务器的参数 假如给后面添加个 ',这个是非法参数地址变成 http://www.xxx.com/showdetail.asp?id=1 '然后没有过滤掉'的服务器会给我们返回如下信息 Microsoft JET Database Engine 错误 '80040e14' 字符串的语法错误 在查询表达式 'ID=1'' 中。 /showdetail.asp,行11 这些都是有用的信息,这意味着sql注入攻击的原理就是利用非法参数获得敏感信息,收集整理,分析出管理账号密码 那么如何检测网页能否注入呢 光一个'是不够的 正确的应该是这样 1, http://www.xxx.com/showdetail.asp?id=1 页面正常显示 2, http://www.xxx.com/showdetail.asp?id=1 and 1=1 页面显示正常 3, http://www.xxx.com/showdetail.asp?id=1 and 1=2 页面返回错误信息时 如果满足以上三条,基本上就可一注入攻击了 猜解管理账号密码可以手动,但是比较麻烦,得有sql语法知识和经验,算是穷举+推测的,不常用 我推荐直接使用程序猜解,网络搜搜到处有

❷ SQL注入的一般过程如何

方法1先猜表名 And (Select count(*) from 表名)<>0 猜列名 And (Select count(列名) from 表名)<>0 或者也可以这样 and exists (select * from 表名) and exists (select 列名 from 表名) 返回正确的,那么写的表名或列名就是正确 这里要注意的是,exists这个不能应用于猜内容上,例如and exists (select len(user) from admin)>3 这样是不行的 现在很多人都是喜欢查询里面的内容,一旦iis没有关闭错误提示的,那么就可以利用报错方法轻松获得库里面的内容 获得数据库连接用户名:;and user>0 这个是小竹提出来的,我这里引用《SQL注入天书》里面的一段话来讲解: ---------------------------------------------"重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarch" ---------------------------------------------看到这里大家明白了吧,报错的原理就是利用SQLserver内置的系统表进行转换查询,转换过程会出错,然后就会显示出在网页上,另外还有类似的and 1=(selet top 1 user from admin),这种语句也是可以爆出来的。;and db_name()>0 则是暴数据库名。 一旦关闭了IIS报错,那么还可以用union(联合查询)来查内容,主要语句就是 Order by 10 And 1=2 union select 1,2,3,4,5,6,7,8,9,10 from admin And 1=2 union select 1,2,3,user,5,passwd,7,8,9,10 from admin 上面的order by 10主要就是查字段数目,admin就是表名,可以自己猜,user,passwd是列名 反正就是返回正确即对,返回异常即错 另外还有十分常用的ascll码拆半法 先要知道指定列名,例如user里的内容的长度 and (select len(user) from admin)=2 就是查询长度为不为2位,返回错误的增加或减少数字,一般这个数字不会太大,太大的就要放弃了,猜也多余 后面的逻辑符号可以根据不同要求更改的, >大于 <小于 =就是等于咯,更新语句的话,=也可以表示传递符号 <>就是不等 知道了长度后就可以开始猜解了 And (Select top 1 asc(mid(user,n,1)) from admin)>100 n就是猜解的表名的第几位,最后的长度数字就是刚才猜解出来的列名长度了,And (Select top 1 asc(mid(user,1,1)) from admin)>100 就是猜解user里内容的第一位的ASCLL字符是不是大于100 正确的话,那么表示USER第一个字符的ASCLL码大于100,那么就猜>120,返回错误就是介于100-120之间,然后再一步一步的缩少,最终得到正确字符XXX,然后用ASCLL转换器吧这个转换成普通字符就可以了 然后就是第二位 And (Select top 1 asc(mid(user,2,1)) from admin)>100 一直猜下去 加在url后面,列名表名还是先猜解,返回正确的代表帐号的ascll码大于100,那么就再向前猜,指导报错,把猜出来的ascll码拿去ascll转换器转换就可以了,中文是负数,加上asb取绝对值 And (Select top 1 asb(asc(mid(user,n,1))) from admin)>15320 得到之后就记得在数字前加-号,不然ASCLL转换器转换不来的,中文在ASCLL码里是-23423这样的,所以猜起来挺麻烦 这个猜解速度比较慢,但是效果最好,最具有广泛性 方法2后台身份验证绕过漏洞 验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误 例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是 user=request("user") passwd=request("passwd") sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&''' 那么我使用'or 'a'='a来做用户名密码的话,那么查询就变成了 select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a' 这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了 这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似 sql="select * from admin where username='"&username&'&"passwd='"&passwd&' 如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。 第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了 方法3防御方法 对于怎么防御SQL注入呢,这个网上很多,我这里讲几个 如果自己编写防注代码,一般是先定义一个函数,再在里面写入要过滤的关键词,如select ; “”;form;等,这些关键词都是查询语句最常用的词语,一旦过滤了,那么用户自己构造提交的数据就不会完整地参与数据库的操作。 当然如果你的网站提交的数据全部都是数字的,可以使用小竹提供的方法 Function SafeRequest(ParaName,ParaType) '--- 传入参数 --- 'ParaName:参数名称-字符型 'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符) Dim ParaValue ParaValue=Request(ParaName) If ParaType=1 then If not isNumeric(ParaValue) then Response.write "参数" & ParaName & "必须为数字型!" Response.end End if Else ParaValue=replace(ParaValue,"'","''") End if SafeRequest=ParaValue End function 然后就用SafeRequest()来过滤参数,检查参数是否为数字,不是数字的就不能通过。

❸ sql注入原理

SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,说白了就是在表单中添加一些恶意的SQL命令,去骗取服务器的一些权限,或者查询一些重要的数据。防止SQL注入的最初级的办法就是在数据提交时屏蔽或转义大多数的SQL关键字和一些符号,比如引号什么的.

❹ 试解释 SQL 注入攻击的原理,以及对数据库可能产生的不利影响。

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注入):http://www.xxx.com/showdetail.aspx?id=49 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文件中设置

<customErrors mode="On" defaultRedirect="error.aspx">

</customErrors>

这样当发生错误时候就不会讲信息泄露给外人。

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注入字符串,这些字符串我们可以人为的设定,毕竟我们还是根据特定的环境设定我们防御措施。首先我们在MoleRewriter类中的Rewrite函数得到绝对的URL判断其中是否有危险字符,如果有我们就将它链接到一个提示用户您输入危险的URL地址。如果不是我们继续判断是否触发了其他的URL重写的规则,触发了就重写。这样就大致上能在URL上防御危险字符。

代码
<configSections>
<section name="RewriterConfig" type="URLRewriter.Config., URLRewriter" />
</configSections>
<RewriterConfig>
<Rules>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/Default_sql_error.aspx</SendTo>
</RewriterRule>
<RewriterRule>
<LookFor>~/d(\d+)\.aspx</LookFor>
<SendTo>~/Default2.aspx</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<httpMoles>
<add type="URLRewriter.MoleRewriter, URLRewriter" name="MoleRewriter" />
</httpMoles>

上面是要在web.config配置文件加上的内容,这里我加上了两个重写规则,第一个规则是专门针对满足这个正则表达式的页面URL查看是否有危险字符,有危险字符就会发送到Default_sql_error.aspx页面,来示警。这里我假定会发生危险字符注入的页面时以"d"字符开头并加上数字的页面(这里我们可以根据实际情况自己定义,看哪些页面URL容易发生我们就制定这些页面的正则表达式),第二个是一般URL重写。因为这里我采用的是HTTP模块执行URL重写,所以加上<httpMoles></httpMoles>这一块。

第二步就是要在重写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 循环
}
}
}
}

那么下一步就是检验例子了

首先我们输入http://localhost:4563/web/Default.aspx?id=1;--

这样http://localhost:4563/web/Default.aspx?id=1;-- 没有改变,就会显示Default_sql_error.aspx里内容“您输入了危险字符”。
再输入http://localhost:4563/web/D11.aspx就会显示 Default2.aspx内容,因为这里触发了第二个重写规则

❺ 什么是SQL注入及它的注入原理

这个是网络的答案:http://ke..com/link?url=CetA0cg30r-C4BYkLgKRqoBkIeJaNjeAf_GvH_rt5hckRxrrV_

❻ 什么是sql注入攻击,请结合实例简述其原理

作为一名学生,大家都经历过考试,既然有考试,那将需要时间地点科目:
____月____日____时____分,第____教学楼____层____教室,考________,时长____分。
一个考试应该是这样的:
6月23日9时30分,第13教学楼6层601教室,考高等数学,时长120分。
你是一个学生,你按照学校安排执行:到了6月23号9.30,然后拿着证件和笔去13教学楼6层601考高等数学。
但是如果空格里填写了不正常的值,甚至包含了指令:
6月23日9时30分,第13教学楼6层601教室,考英语,时长90分钟。6月24日9时30分,第13教学楼6层601教室高等数学,时长120分。
作为一名人类,可以轻易发现科目处添了一串指令,但是如果是机器呢?

❼ 网页sql注入是什么原理

比如最简单的登陆,一般是填用户名和密码

假如代码里面是这样写的
if select count(*) from users where 用户名='填写的用户名' and 密码='填写的密码' >0
假如填写的密码写成 1 or 1=1 ,那就是 恒成立,就不需要密码都可以登陆。

❽ 谁能告诉我sql注入的原理

这些问题 其实就利用sql语句 例如: select * from T where name='dd' and paw=''
这一句在程序执行中这样的是这样的 你可以这样 ' or 1=1 -- 这样 这一句让你输入name
变成了 select * from T where name=' or 1=1 -- 这样就永远正确了 这是最简单的,基本就这样。还有复杂的原理是一样的。

❾ 请问sql注入的工作原理是什么(详解)

sql注入
现在sql都防注入的了,你研究干什么?

❿ 请问网页代码产生sql注入的原理

SQL注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。这是定义,从应用来讲就是没有对用户输入的特定数据进行过滤或筛选,也就是没有对用户输入的数据合法性进行判断;又或者对程序中本身的变量处理不当,造成安全隐患。就这样,一些夹杂在用户提交的数据中的特定字符或字符串被放进动态构造的sql命令提交给数据库服务器进行执行,当执行后返回结果中会包含一些数据库中用户的信息。措施呢你可以参见如下链接: