网站常见漏洞以及解决办法
1
问题
远端WWW服务支持TRACE请求
①开启Apache mod_rewrite功能:
Apahce的配置文件f中把#LoadModule rewrite_module
modules/mod_rewrite.so前的#去掉
f中到下面这段
<Directory />Options FollowSymLinks  AllowOverride None  </Directory>
AllowOverride None 改成 AllowOverride ALL
这样Apachemod_rewrite就开启了。
②在f最后加上
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F] 禁用URL,返回403HTTP状态码
mod_rewrite模块提供了一个基于规则的(使用正则表达 式分析器的)实时转向URL请求的引擎。支持每个规则可以拥有不限数量的规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以取决于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查数据库。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^xxx\$ [NC]
RewriteRule ^/(.*)$ /$1 [R=301,L]
对于unixRed Hat Linux运行的Apache是编译好的程序,提示信息被编译在程序里,
要隐藏这些信息需要修改Apache的源代码,然后,重新编译安装程序,以替换里面
的提示内容。
2
问题
远端HTTP服务器类型和版本信息泄漏
apache版本信息泄漏解决方法:
在配置文件Apache2.2/f中加入
ServerTokens Prod[uctOnly](等级[Prod,Major, Minor, Min, OS]
ServerSignature Off
重启 apache 现在 http 头里面只看到: Server: Apache[/2, /2.0, /2.0.41, /2.0.41 (Unix)]
㈡服务器类型泄漏解决办法:
Tomcat:
①方法一:修改ServerInfo.properties里的版本信息
Tomcat4\5tomcat_home \server\lib\catalina.jar
org\apache\catalina\util\ServerInfo.properties
Tomcat6tomcat_home \lib\catalina.jar
org\apache\catalina\util\ServerInfo.properties
操作:用WinRAR打开catalina.jar ServerInfo.properties 解压并修改 再拖入即可。
②方法二:使用WEB容器捕获异常进行处理
l文件头部加上:
<error-page>
<exception-type>java.lang.Exception</exception-type><location>/system_error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code><location>/system_error.jsp</location>
</error-page>
<error-page>
<error-code>400</error-code><location>/system_error.jsp</location>
</error-page><error-page><error-code>500</error-code><location>/system_error.jsp</location>
</error-page>
3
问题
1 Apache MPM worker.c 远程拒绝服务漏洞。
Apache 2worker模块在处理中止的TCP连接时存在内存泄漏,远程攻击者可以反复触发这种情况耗尽所有可用的内存,最终导致拒绝服务
2 Apache.htaccess本地PCRE整数溢出权限提升漏洞。
PCRE在处理字符类时存在缓冲区溢出漏洞,如果用户发送了codepoint大于255的超长UTF-8字符类的话,就可能触发这个溢出,导致执行任意指令。
3 Apache mod_imagemapmod_imap模块跨站脚本漏洞。
Apachemod_imagemapmod_imap模块中没有正确地过滤某些用户输入,允许远程攻击者提交恶意的HTTP请求执行跨站脚本攻击。
4 Apache mod_rewrite模块单字节缓冲区溢出漏洞。
Apachemod_rewrite模块在转义绝对URI主题时存在单字节缓冲区溢出漏洞,攻击者可能利用此漏洞在服务器上执行任意指令。mod_rewrite模块的escape_absolute_uri()函数分离LDAP URL中的令牌时,会导致在字符指针数组以外写入指向用户控制数据的指针,这样就可能完全控制受影响的主机。
这些问题都是由于Apache 自身的缺陷引起的。
解决方法:
1 apache补丁可解决
2 升级apache到最新版本。
建议最好用升级apache到最新版本。
4
问题
SQL 注入攻击
SQL注入的原理:
就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。
1、单引号法。通过错误提示,判断获取服务器的信息。
2、经典的1=11=2测试法。这只是传入参数是数字型的时候用的判断方法。
3、判断数据库类型及注入方法。and user>0 userSQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。
1、数据库访问用预定义会话  PreparedStatement代替Statement 从根本上防止SQL截断
2、后台过滤(为输入的信息提供反馈信息,只要验证数据格式/长度正确就可以了,不必子自作主张的去过滤/转义各种特殊符号)
3、前台过滤(这只是一个幌子,谁也不能指望前台过滤能防止什么,不过可以减少服务器压力) 
4、敏感信息提交(比如帐号密码)设置验证码(因为除了注入,还有穷举)
5、数据库安全设置(每种数据库的弱点不太一样)。
Java 也提供了防止 SQL 注入攻击的方法。由于 JDBC 都是基于接口的设计,所以对于不同的数据库,代码基本一样。
Connection conn =&Connection(url, user, password);
String query = "select * from table_user where user_name=?";
PreparedStatement preState = conn.prepareStatement(query);
preState.setString(1, "aaa");
ResultSet rs =&uteQuery();
查询了表 table_user 中字段 user_name  "aaa" 的数据,由于采用了参数化查询的方式, JDBC 底层已经防止了 SQL 注入攻击。在 Java 中,对于所有的数据库,参数化查询的方式都和上面类似,区别在于数据库连接字符串。
5
问题
Apache升级过程
1 从网上下载 mod_jk.so/1.2.27apachetomcat的连接文件)
2 备份Apache目录下的conf目录及modules目录下的mod_jk.so/1.2.14文件
3 停掉Apache的相关服务
4 卸栽Apache 并把原来的apache目录整体删除
5 安装apache_2.2.11 IE 浏览器访问 Apache 安装后的网站,要能访问 Apache 的默认首页。
6 mod_jk.so文件拷贝到 %Apache_Home%/modules 目录下。
7 配置虚拟主机,包括 ApacheTomcat
对于 Apache 版本升级操作,建议参照原来的f文件,改动新的f文件几个地方即可。强烈建议:先备份系统默认安装后的 f 文件。
主要修改位置:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile "D:/Apache Group/Tomcat/conf/workers.properties"
JkLogFile "D:/Apache Group/Tomcat/logs/mod_jk2.log"
JkLogLevel info
#默认服务
ServerName v:80 
#默认首页设置
DirectoryIndex index.html index.html.var index.jsp index.htm index.do 
# 禁止访问目录设置
<Directory ~ "/WEB-INF/"> AllowOverride None  Deny from All </Directory>
NameVirtualHost ××.××.××.××:80
#虚拟目录配置
<VirtualHost ××.××.××.××:80>
    ServerName "www.××.gov"  #域名地址
DocumentRoot "D:/??/??"  #工程路径
# apache日志文件配置
    ErrorLog logs/××.gov-error_log 
    CustomLog logs/××.gov-access_log common
    JkMount /servlet/* ajp13
    JkMount /*.jsp ajp13
</VirtualHost>
<VirtualHost ××.××.××.××:80>
    ServerName "www.××" #域名地址
DocumentRoot " D:/??/??"  #工程路径
# apache日志文件配置
ErrorLog logs/××.gov-error_log  86400 480
    CustomLog logs/××.gov-access_log  86400 480 common
  JkMount /servlet/* ajp13
    JkMount /*.jsp ajp13
</VirtualHost>当前页面脚本发生错误
<VirtualHost ××.××.××.××:80>
    ServerName "××.××.gov" #域名地址
DocumentRoot "D:/??/??"  #工程路径
# apache日志文件配置
    ErrorLog logs/××.gov-error_log
    CustomLog logs/××.gov-access_log common
    JkMount /servlet/* ajp13
    JkMount /*.jsp ajp13
    JkMount /*.do ajp13
    JkMount /*.ftl ajp13   
    JkMount /*.htm ajp13
    JkMount /*.js ajp13
    JkMount /*.dwr ajp13
</VirtualHost>
远端HTTP服务器类型和版本信息泄漏
1ServerTokens 指令
语法 - ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
默认值 - ServerTokens Full
这个指令控制了服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息。
ServerTokens Prod[uctOnly]  服务器会发送(比如): Server: Apache
ServerTokens Major        服务器会发送(比如): Server: Apache/2
ServerTokens Minor        服务器会发送(比如): Server: Apache/2.0
ServerTokens Min[imal]      服务器会发送(比如): Server: Apache/2.0.41
ServerTokens OS          服务器会发送(比如): Server: Apache/2.0.41 (Unix)
ServerTokens Full (或未指定) 服务器会发送(比如): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
此设置将作用于整个服务器,而且不能用在虚拟主机的配置段中。
2.0.44版本以后,这个指令还控制着ServerSignature指令的显示内容。
2ServerSignature 指令
说明: 配置服务器生成页面的页脚
语法: ServerSignature On|Off|Email
默认值: ServerSignature Off
ServerSignature 指令允许您配置服务器端生成文档的页脚(错误信息、mod_proxy的ftp目录列表、mod_info的输出)。您启用这个页脚的原因主要在于处于一个代理服务器链中的时候,用户基本无法辨识出究竟是链中的哪个服务器真正产生了返回的错误信息。
默认的Off设定没有错误行(这样便与Apache 1.2及更旧版本兼容)。
采用On会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,
而EMail设置会如文档中说明的那样额外创建一个指向ServerAdmin的"mailto:"部分。
跨站攻击
1、定义
即Cross Site Script Execution(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
业界对跨站攻击的定义如下:“跨站攻击是指入侵者在远程WEB页面的HTML代码中插入具有恶意目的的数据,用户认为该页面是可信赖的,但是当浏览器下载该页面,嵌入其中的脚本将被解释执行。”
2、跨站攻击有多种方式,典型的方式有两种:
其一,由于HTML语言允许使用脚本进行简单交互,入侵者便通过技术手段在某个页面里插入一个恶意HTML代码——例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。
其二,XST攻击描述:攻击者将恶意代码嵌入一台已经被控制的主机上的web文件,当访问者浏览时恶意代码在浏览器中执行,然后访问者的cookie、http基本验证以及ntlm验证信息将被发送到已经被控制的主机,同时传送Trace请求给目标主机,导致cookie欺骗或者是中间人攻击。
  XST攻击条件:
  1、需要目标web服务器允许Trace参数;
  2、需要一个用来插入XST代码的地方;
3、目标站点存在跨域漏洞。
3XSTXSS的比较
 相同点:都具有很大的欺骗性,可以对受害主机产生危害,而且这种攻击是多平台多技术的,我们还可以利用Active控件、FlashJava等来进行XSTXSS攻击。
  优点:可以绕过一般的http验证以及NTLM验证
  用apache+mysql+phpwin2003架设web服务器,扫描服务器:
  提示 www (80/tcp)
  http TRACE 跨站攻击
  你的webserver支持TRACE / TRACK 方式。 TRACETRACK是用来调试web服务器连接的HTTP方式。
  支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST
  攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。
  解决方案: 禁用这些方式。
  如果你使用的是Apache, 在各虚拟主机的配置文件里添加如下语句:
  RewriteEngine on
  RewriteCond % ^(TRACE|TRACK)
RewriteRule .* - [F]
4XSS和脚本注射的区别
  并非任何可利用脚本插入实现攻击的漏洞都被称为XSS,因为还有另一种攻击方式:“Injection”,即脚本注入或者是讲脚本注射,他们之间是有区别的,他们的区别在以下两点:
  1( Injection)脚本插入攻击会把我们插入的脚本保存在被修改的远程WEB页面里,如:sql injection,XPath injection.这个很常见,好象前几个月很多安全网站被黑就是因为脚本里存在注入漏洞,而被一些人利用的。
  2、跨站脚本是临时的,执行后就消失了。这个就不同于我们现在讨论的XSS/CSS 了,今天讲的是在页面中插入脚本,这样谁来访问谁的浏览器就执行,如果不被删掉或者是修改编辑的话,就一直存在的。
  什么类型的脚本可以被插入远程页面?
主流脚本包括以下几种:HTML Java VB ActiveX Flash
5、如何防范XSS跨站攻击
在你的WEB浏览器上禁用java脚本,具体方法,先打开你的IEinternet选项,切换到安全页,有个自定义级别,点他出现如下窗口,禁用就可以了。但是好象不太可能,因为一旦禁用,很多功能就丧失了,这个方法是下策。
  还有不要访问包含〈〉字符的连接,当然一些官方的URL不会包括任何脚本元素。
  如果你的站点程序含论坛,留言板,以及其他程序中含提交数据格式的,没有很好过滤机制,请马上下载升级程序或是停止使用ubb这样的功能,避免造成更多的问题。
  跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧
  【漏洞成因】
  原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换。
  【漏洞形式】
  这里所说的形式,实际上是指CGI输入的形式,主要分为两种:
  1.显示输入  2.隐式输入
  其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通过输入数据来进行干涉。
  显示输入又可以分为两种:
  1 输入完成立刻输出结果
  2 输入完成先存储在文本文件或数据库中,然后再输出结果
  注意:后者可能会让你的网站面目全非!
  而隐式输入除了一些正常的情况外,还可以利用服务器或CGI程序处理错误信息的方式来实施。
  【漏洞危害】
  大家最关心的大概就要算这个问题了,下面列举的可能并不全面,也不系统,但是我想应该是比较典型的吧。
  1 获取其他用户Cookie中的敏感数据
  2 屏蔽页面特定信息
  3 伪造页面信息
  4 拒绝服务攻击
  5 突破外网内网不同安全设置
  6 与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等
  7 其它
  一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。
  【隐藏技巧】
  出于时间的考虑,我在这里将主要讲一下理论了,相信不是很难懂,如果实在有问题,那么去本书看吧。
  1 URL编码
  比较一下:
  www.5460/txl/login/login.pl?username= &passwd=&ok.x=28&ok.y=6