网络安全 频道

Web网站程序编写中的安全软肋

    【IT168 专稿】不管你的硬件防护措施如何的强大和严密,软件程序的算法和结构如何的规范严谨、网页程序编写时过滤的如何的严格,依然会破绽百出,这是为什么呢?因为Web程序的漏洞是永远都防不胜防的。例如动网论坛,动网经历了这么多年,被人不断的发掘出这么多的漏洞,其中有很多漏洞都是一些很低级的错误。一个纯静态的网页,不知道后台,也不知道FTP帐号密码等信息,但是它还是被人拿下了,这又是为什么呢?今天就让笔者来替大家进行一次不完全归纳及简要分析。下面我们一起来看一下由于程序员在软件编写过程中的疏漏导致的漏洞。

    网站程序存在的漏洞

    1. 注入漏洞
    2. 上传文件格式验证不完善
    3. 参数可写入文件——构造一句话
    4. mdb数据库改用ASP\ASA等名字作为数据库扩展名(添加防下载代码)
    5. 后台显示数据库路径
    6. 数据库可备份修改扩展
    7. 文件管理部分传递参数过滤问题及外部提交
    8. XSS漏洞骗取cookies得到后台权限
    9. 任意文件下载漏洞
    10. 远程包含漏洞
    11. 使用未加密的cookies进行用户权限等级及权限验证
    12. session被构造欺骗

    下面就让我们来简要分析下这些漏洞的形成和解决办法:

    (1) 注入漏洞
    注入漏洞的产生原理:
    我们来手工构造一段存在注入漏洞的查询程序,这里就使用asp比较简单明了
    <!--#include file="conn.asp"-->
    <%
    Id=request("id")
    if id<>"" then
    Set rs=Server.CreateObject("ADODB.RecordSet") 
    sql="select * from news where id="&id
    rs.Open sql,conn,1,1
    response.write "标题:"&rs("title")&"<br>"
    response.write "内容:"&rs("content")
    set rs=nothing
    rs.colse
    else
    response.write "缺少参数"
    end if
    %>
    这段代码直接从浏览器接收了id的值,然后不进行任何过滤就提交进数据库查询,首先我们来判断下是否存在注入,通常使用的办法是 and 1=1返回正常


 
    and 1=2返回错误或无返回内容则认为存在注入漏洞,我个人经常偷懒直接在地址栏后面加上一个“’”,返回错误或无返回内容则认为有注入。


    构造注入语句:
    and exists (select count(*) from admin)
    将这段代码加到地址后面就是
    http://localhost/index.asp/id=1 and exists (select count(*) from admin)
    那么在程序中接收到的参数就变成了后面的联合查询语句,我们带入数据库查询部分。看看结果如何?

    sql="select * from news where id="&1 and exists (select count (*) from admin)

    结果显而易见,原来的单句查询变成了联合查询,将admin表的内容进行了查询操作,这个语句是用来判断字段是否存在的。如果字段存在则查询成功,返回正常,字段不存在就返回错误提示,表示不存在表。详细的注入方法这里就不说明了。

    另外有有一个技巧,有一些站点不是对整站进行过滤的,所以导致出现一些隐藏的注入点。比如有一个文件他对提交的id参数的值进行了过滤无法注入,但是你会留意到地址栏里的参数有很多个的,加入有一个没有进行过滤,同样可以产生注入漏洞。
例如:
http://localhost/index.asp?class=1&id=1在程序中有时候只对id这个参数进行过滤而没有对class进行过滤,所以就导致了一个隐藏注入点。我们将地址改为http://localhost/index.asp?class=1,然后再进行注入,如果这个时候程序中没有对id这个参数的非空条件进行处理的话,我们就可能顺利的进行注入了。

    另外一种情况是,有的程序员虽然处心积虑的写好了防注入的自定义函数,但是在程序编写过程中并没有进行调用,所以依然导致注入漏洞的产生。

0
相关文章