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

sql注入过滤关键字

发布时间: 2023-03-28 00:21:17

A. sql注入 form过滤怎么绕过

我常用的三种方法:
1,参数过滤,过滤掉 单引号,or,1=1 等类似这样的 。
2,使用 参数化方法格式化 ,不使用拼接SQL 语句。
3,主要业务使用存储过程,并在代码里使用参数化来调用(存储过程和方法2结合)

B. ASP.NET 实现SQL注入过滤

一 什么是SQL注入式攻击 所谓SQL注入式攻击 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串 欺骗服务器执行恶意的SQL命令 在某些表单中 用户输入的内容直接用来构造(或者影响)动态SQL命令 或作为存储过程的输入参数 这类表单特别容易受到SQL注入式攻击 常见的SQL注入式攻击过程类如 ⑴ 某个ASP NET Web应用有一个登录页面 这个登录页面控制着用户是否有权访问应用 它要求用户输入一个名称和密码 ⑵ 登录页面中输入的内容好尘将直接用来构造动态的SQL命令 或者直接用作存储过程的参数 下面是ASP NET应用构造查询的一个例子 System Text StringBuilder query = new System Text StringBuilder( SELECT * from Users WHERE login = ) Append(txtLogin Text) Append( AND password= ) Append(txtPassword Text) Append( ) ⑶ 攻击者在用户名字和密码输入框中输入 或 = 之类的内容 ⑷ 用户输入的内容提交给服务器之后 服务器运行上猛袜清面的ASP NET代码构造出查询用户的SQL命令 但由于攻击者输入的内容非常特殊 所以最后得到的SQL命令变成 SELECT * from Users WHERE login = or = AND password = or = ⑸ 服务器执行查询或存储过程 将用户输入的身份信息和服务器中保存的身份信息进行对比 ⑹ 由于SQL命令实际上已被注入式攻击修改 已经不能真正验证用户身份 所以系统会错误地授权给攻击者 如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询 他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能 欺骗系统授予访问权限 枝前 系统环境不同 攻击者可能造成的损害也不同 这主要由应用访问数据库的安全权限决定 如果用户的帐户具有管理员或其他比较高级的权限 攻击者就可能对数据库的表执行各种他想要做的操作 包括添加 删除或更新数据 甚至可能直接删除表 二 如何防范 好在要防止ASP NET应用被SQL注入式攻击闯入并不是一件特别困难的事情 只要在利用表单输入的内容构造SQL命令之前 把所有输入内容过滤一番就可以了 过滤输入内容可以按多种方式进行

⑴ 对于动态构造SQL查询的场合 可以使用下面的技术 第一 替换单引号 即把所有单独出现的单引号改成两个单引号 防止攻击者修改SQL命令的含义 再来看前面的例子 SELECT * from Users WHERE login = or = AND password = or = 显然会得到与 SELECT * from Users WHERE login = or = AND password = or = 不同的结果 第二 删除用户输入内容中的所有连字符 防止攻击者构造出类如 SELECT * from Users WHERE login = mas AND password = 之类的查询 因为这类查询的后半部分已经被注释掉 不再有效 攻击者只要知道一个合法的用户登录名称 根本不需要知道用户的密码就可以顺利获得访问权限 第三 对于用来执行查询的数据库帐户 限制其权限 用不同的用户帐户执行查询 插入 更新 删除操作 由于隔离了不同帐户可执行的操作 因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT UPDATE或DELETE命令 ⑵ 用存储过程来执行所有的查询 SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击 此外 它还使得数据库权限可以限制到只允许特定的存储过程执行 所有的用户输入必须遵从被调用的存储过程的安全上下文 这样就很难再发生注入式攻击了 ⑶ 限制表单或查询字符串输入的长度 如果用户的登录名字最多只有 个字符 那么不要认可表单中输入的 个以上的字符 这将大大增加攻击者在SQL命令中插入有害代码的难度 ⑷ 检查用户输入的合法性 确信输入的内容只包含合法的数据 数据检查应当在客户端和服务器端都执行 之所以要执行服务器端验证 是为了弥补客户端验证机制脆弱的安全性 在客户端 攻击者完全有可能获得网页的源代码 修改验证合法性的脚本(或者直接删除脚本) 然后将非法内容通过修改后的表单提交给服务器 因此 要保证验证操作确实已经执行 唯一的办法就是在服务器端也执行验证 你可以使用许多内建的验证对象 例如RegularExpressionValidator 它们能够自动生成验证用的客户端脚本 当然你也可以插入服务器端的方法调用 如果找不到现成的验证对象 你可以通过CustomValidator自己创建一个 ⑸ 将用户登录名称 密码等数据加密保存 加密用户输入的数据 然后再将它与数据库中保存的数据比较 这相当于对用户输入的数据进行了 消毒 处理 用户输入的数据不再对数据库有任何特殊的意义 从而也就防止了攻击者注入SQL命令 System Web Security FormsAuthentication类有一个 非常适合于对输入数据进行消毒处理 ⑹ 检查提取数据的查询所返回的记录数量 如果程序只要求返回一个记录 但实际返回的记录却超过一行 那就当作出错处理

以上资料参考与 赛迪网资料 但是我觉得在我们的ASP NET程序里防止SQL 注入 首先应该尽量使用存储过程 关于使用存储过程的好处在这里就不展开讨论了 使用参数传递变量 最不妥当的方法就是认为判断SQL注入信息 尽管如此 可能日常开发中由于种种原因不能做的面面具道 存在各种各种的实际问题 现在是最近在一个项目中没有考虑SQL注入项目补救写的一个组件库 资料也参考来源与网络 实现很简单 下面是具体实现的源程序 using System; using System Text RegularExpressions; using System Web; namespace FSqlKeyWord …{ /**//// <summary> /// SqlKey 的摘要说明 /// </summary> public class SqlKey …{ private HttpRequest request; private const string StrKeyWord = @ select|insert|delete|from|count(|drop table|update|truncate|asc(|mid(|char(|xp_cmdshell|exec master|netlocalgroup administrators|:|net user| |or|and ; private const string StrRegex = @ [ |;| |/|(|)|[|]|}|{|%|@|*|!| ] ; public SqlKey(System Web HttpRequest _request) …{ // // TODO: 在此处添加构造函数逻辑 // this request = _request; } /**//// <summary> /// 只读属性 SQL关键字 /// </summary> public static string KeyWord …{ get …{ return StrKeyWord; } } /**//// <summary> /// 只读属性过滤特殊字符 /// </summary> public static string RegexString …{ get …{ return StrRegex; } } /**//// <summary> /// 检查URL参数中是否带有SQL注入可能关键字 /// </summary> /// <param name= _request >当前HttpRequest对象</param> /// <returns>存在SQL注入关键字true存在 false不存在</returns> public bool CheckRequestQuery() …{ if (request QueryString Count != ) …{ //若URL中参数存在 逐个比较参数 for (int i = ; i < request QueryString Count; i++) …{ // 检查参数值是否合法 if (CheckKeyWord(request QueryString[i] ToString())) …{ return true; } } } return false; } /**//// <summary> /// 检查提交表单中是否存在SQL注入可能关键字 /// </summary> /// <param name= _request >当前HttpRequest对象</param> /// <returns>存在SQL注入关键字true存在 false不存在</returns> public bool CheckRequestForm() …{ if (request Form Count > ) …{ //获取提交的表单项不为 逐个比较参数 for (int i = ; i < request Form Count; i++) …{ //检查参数值是否合法 if (CheckKeyWord(request Form[i])) …{ //存在SQL关键字 return true; } } } return false; } /**//// <summary> /// 静态方法 检查_sword是否包涵SQL关键字 /// </summary> /// <param name= _sWord >被检查的字符串</param> /// <returns>存在SQL关键字返回true 不存在返回false</returns> public static bool CheckKeyWord(string _sWord) …{ if (Regex IsMatch(_sWord StrKeyWord RegexOptions IgnoreCase) || Regex IsMatch(_sWord StrRegex)) return true; return false; } /**//// <summary> /// 反SQL注入 返回 无注入信息 否则返回错误处理 /// </summary> /// <returns>返回 无注入信息 否则返回错误处理</returns> public string CheckMessage() …{ string msg = ; if (CheckRequestQuery()) //CheckRequestQuery() || CheckRequestForm() …{ msg = <span style= font size: px; >非法操作!<br> ; msg += 操作IP: + request ServerVariables[ REMOTE_ADDR ] + <br> ; msg += 操作时间 + DateTime Now + <br> ; msg += 页面 + request ServerVariables[ URL ] ToLower() + <br> ; msg += <a # onclick= history back() >返回上一页</a></span> ; } return msg ToString() } } } lishixin/Article/program/net/201311/11680

C. SQL注入步骤和常用函数以及中文处理方法

第一节 SQL注入的一般步骤 首先 判断环境 寻找注入点 判断数据库类型 这在入门篇已经讲过了 其次 根据注入参数类型 在脑海中重构SQL语句的原貌 按参数类型主要分为下面三种 (A)ID= 这类注入的参数是数字型 SQL语句原貌大致如下 Select * from 表名 where 字段= 注入的参数为ID= And [查询条件] 即是生成语句 Select * from 表名 where 字段= And [查询条件](B) Class=连续剧 这类注入的参数是字符型 SQL语句原貌大致概如下 Select * from 表名 where 字段= 连续剧 注入的参数为Class=连续剧 and [查询条件] and = 即是生成语句 Select * from 表名 where 字段= 连续剧 and [查询条件] and = (C) 搜索时没过滤参数的 如keyword=关键字 SQL语句原貌大致如下 Select * from 表名 where 字段like %关键字% 注入的参数为keyword= and [查询条件] and % = 即是生成语句 Select * from 表名 where字段like % and [查询条件] and % = % 接着 将查询条件替换成SQL语句 猜解表名 例如 ID= And (Select Count(*) from Admin)>= 如果页面就与ID= 的相同 说明附加条件成立 即表Admin存在 反之 即不存在(请牢记这种方法) 如此循环 直至猜到表名为止 表名猜出来后 将Count(*)替换成Count(字段名) 用同样的原理猜解字段名 有人会说 这里有一些偶然的成分 如果表名起得很复杂没规律的 那根本就没得玩下去了 说得很对 这世界根本就不存在 %成功的黑客技术 苍蝇不叮无缝的蛋 无论多技术多高深的黑客 都是因为别人的程序写得不严密或使用者保密意识不够 才有得下手 有点跑题了 话说回来 对于SQLServer的库 还是有办法让程序告诉我们表名及字段名的 我们在高级篇中会做介绍 最后 在表名和列名猜解成功后 再使用SQL语句 得出字段的值 下面介绍一种最常用的方法-Ascii逐字解码法 虽然这种方法速度很慢 但肯定是可行的方法 我们举个例子 已知表Admin中存在username字段 首先 我们取第一条记录 测试长度 ?id= and (select top len(username) from Admin)> 先说明原理 如果top 的username长度大于 则条件成立 接着就是> > > 这样测试下去 一直到条件不成立为止 比如> 成立 > 不成立 就是len(username)= 当然没人会笨得从 一个个测试 怎么样才比较快就看各自发挥了 在得到username的长度后 用mid(username N )截取第N位字符 再asc(mid(username N ))得到ASCII码 比如 id= and (select top asc(mid(username )) from Admin)> 同样也是用逐步缩小范围的方法得到第 位字符的ASCII码 注意的是英文和数字的ASCII码在 之间 可以用折半法加速猜解 如果写成程序测试 效率会有极大的提高 第二节 SQL注入常用函数 有SQL语言基础的人 在SQL注入的时候成功率比不熟悉的人高很多 我们有必要提高一下自己的SQL水平 特别是一些常用的函数及命令 Access asc(字符)SQLServer unicode(字符)作用 返回某字符的ASCII码Access chr(数字)SQLServer nchar(数字)作用 与asc相反 根据ASCII码返回字符Access mid(字符串 N L)SQLServer substring(字符串 N L)作用 返回字符串从N个字符起长度为L的子字符串 即N到N+L之间的字符串Access abc(数字)SQLServer abc (数字)作用 返回数字的绝对值(在猜解汉字的时候会用到)Access A beeen B And CSQLServer A beeen B And C作用 判断A是否界于B与C之间 第三节 中文处理方法 在注入中碰到中文字符是常有的事 有些人一碰到中文字符就想打退堂鼓了 其实只要对中文的编码有所了解 中文恐惧症 很快可以克服 先说一点常识 Access中 中文的ASCII码可能会出现负数 取出该负数后用abs()取绝对值 汉字字符不变 SQLServer中 中文的ASCII为正数 但由于是UNICODE的双位编码 不能用函数ascii()取得ASCII码 必须用函数unicode ()返回unicode值 再用nchar函数取得对应的中文字符 了解了上面的两点后 是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意 猜解范围大一点外 方法是没什么两样的 lishixin/Article/program/SQLServer/201311/22039

D. 什么是sql注入,怎么防止注入

sql注入其实就是在这些不安全控件内输入sql或其他数据库的一些语句,从而达到欺骗服务器执行恶意到吗影响到数据库的数据。防止sql注入,可以在接受不安全空间的内容时过滤掉接受字符串内的“'”,那么他不再是一条sql语句,而是一个类似sql语句的zifuc,执行后也不会对数据库有破坏。

如:

username = request("username") //获取用户名 这里是通过URL传值获取的。

password = request("password") //获取密码 也是通过URL传值获取的。

sql="select * from userlist where username = '" & username & "' and password = '" & password & "'"--------如果某个人知道某个用户名是admin,常常有人网站的管理员用户名就是admin,这是密码可以选用'or 1 or ',

那么sql="select * from userlist where username = 'admin' and password = '' or 1 or ''",显然1是恒真的,那么验证密码就通过了。

防止的方式比较多,比如可以限制username,password中出现"'"这些字符,一般网站都是只允许数字,字符,下划线的组合,这可以通过javascript验证。也可以采取用存储过程代替sql拼接,等等。

E. 求教高手------Asp。Net中如何防止SQL注入,即如何过滤关键字

最简单的方法

你用ORM来做
就不存在SQL语句了

比如.net
3.5以后的linq
就是不错的办法

F. SQL注入 当or、and等常用字符被过滤(less-25)

当常用字符被注释无法使用时,通常采取以下方法(可自行搜索sql注入绕开过滤等):

如:Or、OR、oR等

如:通过hex、urlencode、url等编码
举例:如果or被过滤时,我们可以采用url编码(其相当于把ascii编码的0x给替换成%,比如o的ascii为0x6f,url编码就是%6f),这个时候我们可以试试%6fr,即把o换成url编码,也可以全换,也可以大小写的换,如果没被过滤就成功了,(如果%被过滤了的话…)
【注:这个可以积极的去使用,比如测试时and被注释,使用&&替换也失败,这个时候不妨试试%26%26(&的url编码)】

如: /* */ (这个不止可以应对字母被注释)
举例:某个过滤器能够过滤的字符如下——“select ”、”from ”、”limit ”等,注意这些字符最后面都有一个空格,这个时候我们就能通过内联注释来绕过这个过滤器,如:

【注:这个注释甚至可以穿插在关键字当中,例如被过滤了or,我们可以把 order by 改成 o/**/rder by ,参考的资料上是这么说,但本人试了没成功,不知是否依旧实用】

比如or被过滤了,我们可以往里面加or,即注入:oorr,这个时候里面的or就被删去了,剩下的组成新字符,也就是or,是个很好用的绕过方法,像这种类似的还有很多,需要我们去思考

如:&&、||
举例:

如盲注时经常用到比较,这时候要是比较符号被注释了不能用平常的方法了,所以需要用某些函数如 greatest() 【 greatest(n1,n2,n3,...) 函数返回输入参数(n1,n2,n3,...)的最大值】、least()等,比如语句: select * from users where id=1 and ascii(substr(database(),0,1))>64 就可以替换成 select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
【注:当or被注释时,像order by这种含有相关字符的语句也同样无法使用,这个时候如果改变大小写也无用时,可以使用上述的内联注释 /**/ ,或者用别的编码形式,如果不行的话,那就只能放弃使用order by,可以尝试使用group by语句等】

G. 【web安全】怎么进行sql注入

1.POST注入,通用防注入一般限制get,但是有时候不限制post或者限制的很少,这时候你就可以试下post注入,比如登录框、搜索框、投票框这类的。另外,在asp中post已被发扬光大,程序员喜欢用receive来接受数据,这就造成了很多时候get传递的参数通过post/cookie也能传递,这时如果恰好防注入程序只限制了get,因此post注入不解释
2.cookie注入,原理同post注入,绕过相当多通用防注入
3.二次注入,第一次注入的数据可能不会有效,但是如果将来能在某个页面里面被程序处理呢?注入来了……
4.csrf,适合后台地址已知并且存在已知0day,可以试试用csrf劫持管理员来进行操作(这招其实不属于sql注入了)
5.打碎关键字,比如过滤select,我可以用sel/**/ect来绕过,这招多见于mysql
6.有时候也可以sELeCT这样大小写混淆绕过
7.用chr对sql语句编码进行绕过
8.如果等于号不好使,可以试试大于号或者小于号,如果and不好使可以试试or,这样等价替换
9.多来几个关键字确定是什么防注入程序,直接猜测源码或者根据报错关键字(如"非法操作,ip地址已被记录")把源码搞下来研究
10.记录注入者ip和语句并写入文件或数据库,然而数据库恰好是asp的,插马秒杀

H. sql注入过程中单引号和多个关键字被过滤怎么办

很高兴回答你的问题
SQL注入成功机率和选择注入目标程序安全性有直接关系.单就你的问题和你的思路来说的话,你还可尝试利用 ANSI 字符代码变体来达到目的 比如 " 号对应 chr(34) .
是否成功取决于他本身程序是否也做了过滤.
另:还有很多方法同样可以达到目的的.比如旁注、跨站、截取cookie 等

I. 如何对网站进行SQL注入

首先你要了解什么是SQL注入漏洞,SQL注入漏洞就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
简单来说,网站一般都是由web应用程序,数据库,服务器等组成的,网站的所有用户数据,密码表单等等都是保存在数据库当中的,数据库的内容按到常理来说是只能在服务器内部进行查询,当然,但是,开发人员对客户端用户向客户端提交的参数没有进行过滤,那么,黑客就可以从客户端【浏览器,等等,详细可以学习http协议】向服务器提交查询数据库的SQL语句,如果提交的语句成功的被服务器给接收到并且执行么,那么黑客岂不是想怎么查询数据库里面的内容就怎么查询,不是么?那些管理账号密码,会员数据不是分分钟就到手了?SQL注入漏洞危害是非常大的。

当然,这种漏洞是根据提交参数没过滤而产生的,那么除了浏览器的get提交参数,http协议中还有,post提交,cookie提交,等等。注入漏洞不是网上那些所谓的黑阔,用什么啊D,明小子之类的乱检测一气而找出来的,如果楼主想研究这个漏洞的产生,原理,利用和防御,是需要进行代码审计,SQL注入语句基础,等等。

现在一般常用的工具:SQLmap【这是一款神器,现在是公认最强大的开源注入工具】

建议楼主去看几本书:《SQL注入天书》《SQL注入漏洞的产生与防御》

这个漏洞的利用不是几句话就能说清楚的,详细的可以追问,纯手工打字,望楼主采纳。

J. 如何关闭bootstrap里的sql注入过滤

1. 建议关闭或删除不必要的交互式提交表单页面,因为他们是黑客进行SQL注入的途径,关闭这些交互式页面可有效的阻止某些XSS跨站脚本的攻击与注入。而最有效的防治注入及跨站脚本攻击的方法,是在代码层就屏蔽掉不安全的script等危险字符。
2.. 对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性。
3. 不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点,比如index1.asp index2.asp procts1.asp等。