Asp教程

通过asp实例结合结合ACCESS,MSSQL来更好的深入Asp学习 - 爬坡者

« asp安全-ASP中SQL不完全思路与防注入程序 ASP六大对象常用语句示范 »

[转]轻松突破通用防注入程序

作者:剑心
上次在检测一个网站漏洞的时候,看到动态页面后面有提交的参数,于是很习惯的就在后面加了个',结果弹出了个对话框,偶当然不服了,提交;,提交and,结果无一例外的弹出了这样的东东,如图一。以前遇到过这样的情况很多次,因为是asp+access的结构就没有去研究,可是今天遇到的可是asp+sql的啊,要是让他这么防注入了还混个P啊。这样的程序应该是类似于简单的IDS入侵检测性质的东西,遇到指定情况的情况就采取一些动作防止入侵。于是上网用sql防注入程序搜索了一下,哈哈,信息还真不少,不管了,拿回来看看再说。
看了下几个防注入程序的源代码,发现大致的思路是一样的,先遍历提交的Form集合看看有不有Sql注入的关键字,也就是检查用户提交的表单有没有问题,然后遍历Get的QueryString部分,也就是地址栏里有不有问题,没有检测到意外就将数据放行,检测到的话就将恶意提交者的一些信息写到数据库里并且显示,以达到阻止入侵者的目的。代码如下:

<%
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 \"Script Language=JavaScript>alert('Cnami信息发布系统防注入系统提示↓\\n\\n请不要在参数中包含非法字符尝试注入!');/Script\"
Response.Write \"非法操作!系统做了如下记录↓<br>\"

…………        //处理部分,类似于IDS响应//
…………

If Request.QueryString<>\"\" Then
For Each Fy_Get In Request.QueryString      //取得QueryString对象并检测//

For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>0 Then


Response.Write \"Script Language=JavaScript>alert('Cnami信息发布系统防注入系统提示↓\\n\\n请不要在参数中包含非法字符尝试注入!');/Script\"
Response.Write \"非法操作!系统做了如下记录↓<br>\"
…………
…………
%>


现在我们来分析下。我们提交的变量里不能有',这就是说如果是字符型的变量是没有办法了,因为你肯定先要分隔他前面的字符然后才能进行我们的操作。然后是过滤了;,我们多个SQL语句执行的愿望也没有了,现在就只能注入数字型的变量了(搜索型的本质上也是字符型的)。但是看看注入数字型的话我们有多大的余地发挥吧!不能用and就已经死翘翘了,更别说所有的关键字基本都过滤了,看来程序本身过滤得很好的哦!一般对付这样的检测,我的方法是看能不能转换代码饶过去。首先是大小写切换,看看程序里的这个LCase()函数,过滤了。那Sql的代码转换呢?这样的情况下,好象不可能,如果谁知道的转告下偶哦!
是不是就没有办法了呢?等等,我们看看这个程序检测的只是Form和QueryString部分哪!我们知道asp从客户提取的参数远远不只这些的!譬如Cookie,譬如这里程序处理恶意用户的Request.ServerVariables都属于request内容的!作者的确是过滤了,但是并没有将所有提交的参数都进行过滤,所以如果我们有除了Form和QueryString之外的变量被程序获得并且进入了Sql查询的话漏洞就产生了。不要以为除了Form和QueryString之外的变量就是少数,并不是那样的,譬如记录用户访问情况的Referer和User-Agent参数都是从浏览器传过来的,一般情况下不会有什么问题,但是像BCT这样的人就喜欢搞些其他的方式提交譬如NC抓包提交,还有一些黑客浏览器也可以随意更改这些值。如果你觉得这些陌生的话,那么Cookie你总该熟悉的吧!他就经常在我们不知道的情况下和服务器进行数据的交换,很多的地方都是用Cookie记录客户的信息的。譬如用户登陆验证的时候取出了Cookie的内容并且直接送到了Sql查询中我们就可以在Cookie里面加特殊的语句如构造名字为admin' and user>0--这样的形式往往就能导致sql出错从而渗透数据库,好的安全还是靠网络程序员的努力啊,不是一个防注入程序能搞好的!这里没有现成的例子,不过大家要是记得Oblog2.5 sql版本的Cookie注入漏洞的话应该能体会一点。
本来是想到这里就不能前进了,是感觉程序应该还是有问题的,直到后来看asp的资料才知道,原来这些变量都可以用request来直接取得的,并且是有先后顺序的,譬如你用这样的语句request(\"jnc\")取得jnc变量,asp会先从Form过来的数据找变量,然后是QueryString部分,然后是Cookie部分。但是如果你指定了request.cookies(\"jnc\")就只会从cookie里找变量内容,没有的话就为空,同理,如果用的是request.form(\"jnc\")就会只从表单里取变量而不会理会其他提交方式中的内容。这三个取得变量的地方也是是我们经常提交数据的地方,并且都是很容易就能修改的。嘿嘿,看到没有,这个注入检测程序并没有检测Cookie但是Cookie在一定条件下是能传递变量内容的哦,这个一定条件就是程序取变量时是这样用的:

…………
id=request(\"id\")
keyword=request(\"keyword\")
…………

呵呵,看到了吧!不过悄悄告诉你,用通用sql防注入程序的程序多数都有问题的,譬如我今天遇到的这个!看看我怎么突破Sql防注入程序的吧!看看一般情况,访问搜索页面,关键字选的是jnc',如果程序有漏洞但是没有防止注入的话应该能直接暴出来,但是我们看到了防注入程序的功能,被拦截了如图二。这里我们提交的变量是get过去的Request.QueryString,现在我们直接访问search.asp,不给任何变量赋值,发现正常返回。好了,跟我来,试试饶过防注入程序用cookie传递keyword过去吧!很简单,在浏览器里执行:

javascript:alert(document.cookie=\"keyword=1' and user>0--\") //设置Cookie的值keyword=1' and user>0--,我们会把and user>0--注入到查询语句中//

回车弹出对话框如图三后可以刷新页面了,如图四吧!成功了!呵呵,你要执行什么语句现在就怎么修改你的Cookie,会了吧!不过有的时候空格在Cookie似乎有点问题,所以你需要把空格转换成/**/。也许这样大家还有点不习惯,那么你也可以用NV提交。首先用IE访问这个页面,同时抓包,注意的是我们提交的内容保存下来如图五,然后修改其中的Cookie段,在一个分号的后面加上%27%20%61%6E%64%20%75%73%65%72%3E%30%2D%2D;注意,要做Url转换哦!你的可能跟我的不一样,但是格式不能错的哦!这里是1' and user>0--的转换。

Cookie: PJBlog2Setting=ViewType=normal;keyword=%27%20%61%6E%64%20%75%73%65%72%3E%30%2D%2D; ASPSESSIONIDQQQGQVMU=CNMLPPNANAOEHPIBBCJBCOLL

保存为jnc.txt后用

NC -vv ip 80 < jnc.txt > c:\\1.html

的命令提交,然后看看C盘的1.html就是结果,成功了哦!这两个方法都可以,你还可以直接用可以修改Cookie的浏览器,哪个顺手随便你了!看看,突破了防sql注入的程序后很容易就能挖掘程序的漏洞了吧,剩下来的是拿webshell就看给位的了!这里是我的机器,可是sa权限的哦,祝你好运!
尽管这里说的系统是asp+sql的,但是其他的系统如access其实都是一样的,关键在于程序员是不是偷懒用request(\"jnc\")这样的形式取得变量,然后又没有做什么处理就去查询了。感觉上这对于sql用处大些是因为Sql猜表很简单,像access的就很麻烦了,但是如果你对系统的Sql语句和数据库熟悉也能很快union出来结果的!以前的杂志就有很多这样的介绍。对了,偷偷的告诉你,lcx的海洋顶端网以前是有个搜索的sql注入的,现在加了防注入系统,也是可以用cookie传递的方法饶过的哦!难道他也是用request(\"jnc\")这样的形式取得变量的?大家去试试,PS:lcx大叔不要PK我啊!呵呵。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2007-2008 papozhe.com [asp教程] All Rights Reserved.
浙ICP备07030537号
免责申明:所有文章除特别声明,均来自网上,主要为学习用!内容仅供参考,版权归原作者。如侵犯您利益,请来信告知.
Email:papozhe$Gmail.com QQ:76336503