mysql注入过滤逗号,突破 Sql 防注入过滤程序继续注入的一点方法

现在网上流传很多防注入代码。这些真的有用吗?这是在网上找的一个防注入代码

例如:

''''--------定义部份------------------

Dim Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr

''''自定义需要过滤的字串,用 "|" 分隔

Fy_In = "''''|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare||||-|_"

Fy_Inf = split(Fy_In,"|")

If Request.Form<>"" Then

For Each Fy_Post In Request.Form

For Fy_Xh=0 To Ubound(Fy_Inf)

If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>0 Then

Response.Write "

网站在conn.asp插入上述代码把基本上能过滤的查询语句都过滤了。带式仔细找,貌似一个=(等号)没有过滤。。大家再找找。。。

等等。。

一个等号就可以。。。。当我们我们输入and 1=1和和1=2时出现对话框。。记录了我们的ip和提交方式什么的。

我们是不是可以吧 and变成没有这些字符的语句呢?找了想到 base64字符。我们接着实验。。。成功。这里

又找了几个站,发现有的可以用这种方法注入。有的不可以。。大家不妨在注入的时候试一下。

这段过滤代码所存在的问题如下:

1、目测没有过滤Get、cookie提交方式,只过滤了post,而asp程序员最喜欢使用 Request("a") 这种方式获取数据,这种语句是不限定数据提交方式的,可以是get、cookie、post中任意一种,都可以获得数据(如果多个方式同时提交,则按照先后优先级获取数据,我记得默认优先级顺序为:Request.QueryString → Request.Form → Request.cookies → Request.ServerVariable),所以形同虚设。

2、Response.Write 后边如果没有 Response.End,也形同虚设,禁用js或其他发包方式即可,原理很简单不解释了,由于你代码不全(写这个文章的时候,楼主只是贴了一小段代码,后来补全了,这个不是重点,关键在于这篇文章所讲的方法),所以无法判断是否存在该缺陷。

3、大略的看了一下,他过滤的字符集没有关键词:or,这是一个严重的失误。

4、……

这几个缺点,稍微好一点的防注入过滤程序应该都不存在,除非作者太白痴了。。。

至于你说的把and变成“没有”这些字符的语句,可以参照以下方法:

1、变通法,例如他没有过滤 or,那么可以用:test.asp?id=999 or exists(select * from admin)、test.asp?id=999 or 1>2,注意:这个999必须是一个不存在的ID,让or前边的表达式运算值为false,这样整个语句的返回值就以or后的表达式运算值为准了。

2、“替换”大法,如果碰到直接替换的那种过滤程序,可以使用:test.asp?id=1 aandnd 1>2,这样执行一次替换后,结果就变成了:test.asp?id=1 and 1>2,其他关键词同理,很简单易懂的方法,大多数过滤程序都存在这个缺陷。

3、还可以使用打乱大小写字母的写法,因为在 Asp 中,Replace、Instr 等处理字符串函数默认是大小写敏感的,例如:sEleCT <> select,这是个极容易被忽视的问题。

4、使用注释方法,例如过滤了空格的话,可以用:test.asp?id=1/**/and/**/1=1,再例如,当过滤select时,可以:union/**//*!select*/1,2,3,4,或:union/**/s/**/elec/**/t/**/1,2,3,4,甚至还可以:union/**//*!5100select*/1&id=2,3&id=4,5100为mysql的版本号。

5、打碎关键词,原理很简单,如果你提交:test.asp?id=127/*&id=*/an&id=d/**/1=1 时,Asp 接收到的结果是:127/*, */an, d/**/1=1,注意中间的空格,再过滤掉逗号和空格就变成了:127/**/and/**/1=1,然后你懂的……php 的无效,直接覆盖了。这个使用条件比较苛刻,需要过滤逗号和空格,但我估计存在这种问题的站点依然不少。

6、过滤了空格还可以用:/**/、 (这是汉字空白字符)、chr(10)、chr(13),等字符充当空格。

7、……

关于 Sql 语句中的注释符,再补充一点知识:

Access 中没有专门的注释符号,因此“/**/”“--”“#”都没法使用,但是可以使用空字符 "NULL" (%00) 代替,例如:' UNION SELECT Count(*) FROM admin%00

突破防注入过滤,继续 Sql 注入,这方面的技巧、经验相当的多,这里只是略提一下,实际上都可以写成一本书,大家发散思维,方法很多的,欢迎补充。

在 Asp 中彻底封死注入的方法:

1、数字型:

Dim Tmp

Tmp = Request("test")

IF Len(Tmp) > 9 then

Response.Write "fuck you!"

Response.End

ElseIF IsNumber(Tmp) = False Then

Response.Write "fuck you!"

Response.End

ElseIF Instr(Tmp, "+") > 0 Then

Response.Write "fuck you!"

Response.End

ElseIF Instr(Tmp, "-") > 0 Then

Response.Write "fuck you!"

Response.End

ElseIF Instr(Tmp, ".") > 0 Then

Response.Write "fuck you!"

Response.End

Else

Response.Write "ok!"

End IF

2、字符型:

Dim Tmp, I

Tmp = Request("test")

Tmp = Replace(Tmp, "'", "'")

Tmp = Replace(Tmp, """", """")

Tmp = Replace(Tmp, chr(10), "")

Tmp = Replace(Tmp, chr(13), "")

Response.Write "ok!"

这样完全就可以封死了,不用搞什么过滤关键词,弄一堆字符集,那种方法太恶心了,效率又底……

Sql 注入漏洞的产生原因,就是因为程序员的不细心、缺乏安全意识,若是程序员平时写程序的时候,就注意了并避免了这些细节问题,那么为什么还需要用第三方防注入程序,进行所谓的修补呢?

再唠叨一下,经过这几年的发展,如今的防注入程序已经做得非常好了,已经不是很容易就可以突破了,但是稍微细心一下,有些还是可以再利用的。

楼主后来补充的完整的代码:

<%

dim sql_injdata ,SQL_inj,SQL_Get,SQL_Post,SQL_Cookies,SQL_Data

SQL_injdata = "<%|script|insert|select|delete|exec|cast|update|chr|master|truncate|declarei|eval"

if stopwords<>"" and instr(LCase(Request.ServerVariables("PATH_INFO")),"siteconfig.asp")=0 then

SQL_injdata= SQL_injdata&"|"&stopwords

end if

SQL_inj = split(SQL_Injdata,"|")

if checksqlin="Yes" then

If Request.Form<>"" Then StopInjection(Request.Form)

If Request.QueryString<>"" Then StopInjection(Request.QueryString)

If Request.Cookies<>"" Then StopInjection(Request.Cookies)

end if

Function StopInjection(values)

For Each SQL_Get In values

For SQL_Data=0 To Ubound(SQL_inj)

'if instr(LCase(request(SQL_Get)),Sql_Inj(Sql_DATA))>0 Then

if instr(LCase(replace(request(SQL_Get),chr(34),"'")),Sql_Inj(Sql_DATA))>0 Then

'“"”无法直接写入到变量“SQL_injdata”中,在这里替换“"”为“'”提示之

Response.Write ""

Response.end

end if

next

Next

end function

%>

转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/3205.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值