您的位置:首页 > 编程语言 > ASP

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

2010-07-25 04:52 423 查看
作者:lake2
来源:http://blog.csdn.net/lake2/

  目前似乎都流行把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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: