《改mdb为asp所带来的灾难》之狗尾续貂


    现在好像都流行把mdb格式的数据库改成asp/asa防止被下载,不过大多数时候是不行的。因为我们用浏览器访问数据库会得到乱码,ok,此时我们用网际快车就可以轻松的下到数据库。不过下数据库只是一点点皮毛,入侵者还可以利用这个asp数据库得到webshell,要是你不清楚的话建议你先看看《改mdb为asp所带来的灾难》。

    呵呵,怕了吧,那你还改不改mdb为asp呢?答案是要的,我们总不能因噎废食是吧。《改》文最后说:“……对数据库里加入了<%=’a’-1%>等非法的asp代码来彻底防止下载的数据库,由于里面存在了非法的asp代码,插入我们的webshell代码后运行,将只会显示前面非法代码的错误,而不去执行我们shell的代码……”。网上也有文章说在数据库里新建一个表,内容随便填上一句错误的asp代码(比如“<%asd%>”),那么访问这个asp数据库时就会出错,也就不能用网际快车下载了。

    真的吗?其实asp是解释执行的,如果我们插入的shell在他的错误代码之前的话就会先于错误代码执行……嘿嘿,看我做个试验先。

    在web目录新建一个Access数据库,随意添加几个表、字段和内容,改后缀为asp,浏览器访问,看到乱码。现在向表的某个字段里添加内容“<%lake2%>”,再访问之,呵呵,出错了!见图1。

    继续在同一个表添加内容“<%execute(request("lake2"))%>”(模拟插入webshell),再访问asp数据库,仍然出错,看图2,注意与图1对比错误提示。

    看到没有,第二个错误“类型不匹配: 'execute'”是execute函数参数为空的错误,而第一个却是由于字符“lake2”不符合asp语法产生的错误。说明我们后插入的webshell先于以前错误的代码执行。你可以用UltraEdit打开数据库,看看“<%execute(request("lake2"))%>”与“<%lake2%>”的位置就明白了。

    所以现在我们得到的结论是:access数据库同一表中新增的数据的物理位置总是在旧的数据之前。

    我们就可以利用这个突破一些限制。比如服务端要求输入的数据只能20个字节,想想怎么注入shell代码?呵呵,我们可以分成两句来写:“<%Y=request("x")%>;<%execute(Y)%>”。你自己想想顺序。

    一般我们插入错误代码是新建一个表,那么新建一个表又是什么情况呢?

    你自己试试吧,我的结论是:新建的表的内容物理位置在旧的表之后。哈哈,那种简单的新建一个表插入的错误代码实际位置是在数据库其他字段内容的后面,我们完全可以提交shell代码到数据库然后拿到webshell!

    上述问题的防御办法也简单,只要你的错误代码在数据库里的位置先于其他字段的内容就是了。不过这样子好像不现实,因为这要求你最先建立把防下载的表……嗯,我们可以借鉴一下动网的方法。

    动网数据库里有一个名为Dv_notdownload的表,表类型是“OLE对象”,里面的数据是长二进制数据。看名字就知道是用于防下载的。

    我测试时发现即使向比Dv_notdownload更早创建的表里插入shell可是始终不能执行,莫非前面的结论错了?后来才知道它表里的内容是“<%”,由于缺少关闭符“%>”,asp文件会首先报错,根本不执行任何语句(最前面提到的问题是一句完整的句子)。呵呵,知道怎么做了吧:p

2005-4-1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值