《Linux黑客大曝光》读书笔记 > 第十二章 Web服务..

生成HTTP请求
machine$telnet localhost 80
输入
HEAD / HTTP/1.0
它向服务器请求其文档树根目录“/”的头部信息。
头部信息会给黑客提供一些有用的信息,如服务器版本,操作系统,安装的模块等。
可以修改默认的头部信息以防止信息泄露。
编辑src/include/httpd.h文件,将下面这些行
#define SERVER_BASEPRODUCT "Apache"
#define SERVER_BASERVISION "1.3.14"
修改成
#define SERVER_BASEPRODUCT "myweb"
#define SERVER_BASERVISION "xx.xx.xx"
然后编译安装就可以了。并且在启动服务器前,在httpd.conf中添加如下指令:ServerTokens Min


限制IP以保护数据
在.htaccess中添加如下内容:
Order Deny,Allow
Deny from All
Allow from 192.168.1.100
Allow from 192.168.1.101

使用http身份认证
可控制结web服务器特定目录和子目录的访问。以base64格式将用户名和口令组合编码。但仍是明文。可给黑客劫取。并用perl程序破解:
hacker$perl -MMIME::Base64 -le > `print decode_base64"监听到的密码串"'
为了把黑客监听到用户名和口令可能性减少,应当使用安全的http连接,SSL.下面例子使用stunnel连接站点所监听的ssl端口443。在发送数据前,首先建立加密连接,之后所发送数据都以加密方式发送。
machine$stunnel -f -D7 -c -r www.example.com:443

ssl version2所要求的算法是一项2000年9月20日到期的美国专利,可以使用RESREF库。而不要使用RSAREF库(存在安全和稳定性问题)。
TSL(transport layer security传输层安全协议)协议基于SSLv3.0由internet engineering task force(IEIF)D 1998年提出,主要用途和ssl相同,提供安全的传输层。目标:密码安全性,互操作性,扩展性,相对的高效性。对ssl的改进:对安全性略有增强,规范定义更清晰,为将来的协议提供更广泛的基础。

在URL中允许..(double dot)
早期的apache存在巨大的安全漏洞,在URL中允许..指向上层目录。Apache在很早期就补上了这个漏洞。但仍会影响CGI程序。

不应该以root用户运行apache。这样服务器就可读取属于root的文件,由其执行的CGI程序也拥有root权限。

危险的符号链接
如果允许服务器使用符号链接,就有潜在的安全威胁。将web服务器访问的文件限制在文档树范围内是最重要的安全策略。如果存在符号链接,如某用户在其html目录下放置了一个指向/etc的符号链接link_to_etc,则黑客就可以如下请求/etc/passwd文件:
http://localhost/~hack/link_to_ect/passwd。
允许符号链接的配置如下
Options FollowSymLinks
更为严格的配置是只允许符号链接指向属于同一个用户的文件或目录
Options SymlinkIfOwnerMatch
如果要使用链接应把它们集中放置于只有授权用户如root才能写入的目录中,拒绝普通用户创建符号链接限能限制敏感信息被链接的数量。目录许可为rwxr-xr--x,使用Directory指令限制apache只使用给定的目录下的符号链接。
<Directory /usr/local/apache/htdocs/links_dir>
    Options FollowSymLinks
</Directory>

防止获得目录内容列表
apache中配置服务返回目录内容列表的指令为Option Indexes。在所有Option指令中去掉该指令可防止返回目录内容列表。


将CGI限制在某些目录下,允许CGI运行于任何目录有潜在的安全问题,一般APACHE配置CGI程序只能在CGI目录下执行。这些目录通常被命名为cgi-bin or bin。这些目录下的所有文件被看作是可执行的。并以运行web的用户(通常是nobody)的身份运行。应当关注这个目录下的内容,因为它们被请求时执行。
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin"

不要基于文件名来启用CGI。服务器可以基于特定的扩展名(.cgi, .pl, .php)。这样就允许程序员将程序放在服务器目录结构下,而不仅仅是特定目录,这样会造成潜在安全问题。基于文件名来启动CGI的配置命令是:AddHandler cgi-script .cgi。不要用以上命令。注意,有些系统默认是打开该功能的,要检查系统配置,注释该选项或删除它。

不要在CGI目录下保存一个程序的多个版本。

根据文件名限制对文件的访问,应当使用Files or FilesMatch指令。如果使用Files,则应当使用“~”号来表示引号内的字符串为正则表达式。下面的例子给出了拒绝访问所有以.bak结尾的文件的设置方法:
<Files ~ "\.bak$">
    Order allow,deny
    Deny from all
</Files>
使用FilesMatch时,字符串直接被认为是正则表达式。

不安全的CGI对其他web站点的影响。如果服务器以同一个用户(通常是nobody)运行虚拟主机,则某个虚拟主机上的CGI程序漏洞可能会危及所有的虚拟主机。所以要使用SuEXEC配置每个虚拟机以不同用户运行CGI程序。

安全地使用.htaccess文件配置http身份认证
配置服务器允许使用.htaccess文件是实施身份认证的一个便利方法,此时,只需在需要身份认证的目录下放置一个名为.htaccess的文件,就可以控制访问。为将服务器配置为启用.htaccess文件,可以使用AllowOverride and AccessFileName。
下面是一个配置HTTP身份认证的例子,将下列指令写入httpd.conf,以启用.htaccess文件。
AllowOverride指令设定.htaccess可以取代的项目(用于身份认证应设为AuthConfig)。
AllowOverride    AuthConfig
为指定由名为.htaccess的文件控制文件访问,应使用AccessFileName指令
AccessFileName    .htaccess
应用.htaccess文件时,它本身决不应被服务器提供给客户端,因此必须使用Files命令来配置服务器,使其拒绝浏览器对.htaccess的访问。
<Files .htaccess>
    Order allow,deny
    Deny from all
</Files>

.htaccess文件内容告诉服务器口令文件的位置和其它信息,例如:
<LIMIT GET>
require user login jdoe
</LIMIT>
AuthUserFile指令指向包含用户名和口令组合的文件,该文件用htpasswd创建。这个文件决不能放在文档树目录下。

安全地使用httpd.conf文件来配置身份认证。这种方法会更安全一些,它不需要创建和管理.htaccess文件。配置例子如下:
<Directory /usr/local/apache/htdocs/private_dir>
    AuthType    Basic
    AuthName    "my private directory"
    AuthUserFile    /usr/local/apache/misc/my_private_dir.htpasswd
    require        valid-user
</Directory>

利用默认配置的漏洞,安装系统时,都有一个默认的配置,这个默认的配置可能是不安全的,建议关闭所有没用的默认配置。
1、删除联机手册
2、删除默认欢迎页面
3、删除根据文件名执行CGI程序。
4、安全配置parsed HTML文件,也叫SSIs(Server Side Includes),是需要预处理的HTML文件,允许服务器通过包含其它文件或执行外部命令来生成HTML,配置指令是:
AddType text/html .shtml
AddHandler server-parsed .shtml
AddHandler server-parsed .html
SSIs允许用户(包括某些能力低下的用户)上传能够执行的程序的HTML文件。所以只有必要时才配置。否则关闭它。

安全配置服务器状态和信息显示
<Location /server-status/>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
</Location>

<Location /server-info/>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from .example.com
</Location>
应当只对可信主机才显示该信息,所以应当确保上述命令中包含Deny from all.并且在Allow from中列出可信主机。但更好的做法是关闭它。

配置public_html目录
通过适当配置apache可将http://www.example.com/~jdoe/等类似URL指向~jdoe/public_html或相应文件:
UserDir public_html

<Directory /home/*/public_html>
....
</Directory>
如果不需要这个功能,则注释或删除它。更加安全的方法是为需要放置HTML文件的用户在web文档树下创建一个目录。并且将这一目录设置为只有相应用户或组才能够写入。

如果不需WEB代理,请删除或注释掉以下指令
<Directory proxy:*>
    Order deny,allow
    Deny from all
    Allow from .example.com
</Directory>

CGI程序问题
不要信任预装和下载的CGI,应当遵循3个简单的规则:
1、删除web服务器附带的CGI程序;
2、删除那些不是自已编写或没有彻底检查过和CGI程序;
3、不要从流行的脚本库(免费或收费)下载和使用脚本,应该自已写。

不安全的CGI程序大部分可归为以下两类:
1、作不正确假设。
2、执行操作系统程序和找开连向操作系统的管道。

在写CGI时应该
1、总是检查接收到的字段。
2、使用MD5来校验隐藏字段。使用隐藏字段是在CGI之间传递数据的天真做法,更为成熟的做法是创建cookie以保存随机会话ID,并在服务器上将会话相关数据保存到数据库中,以会话ID作为相应数据库的主键。
3、总是检查数据的长度。
4、不要依赖于referer头部信息。
5、不要依赖cookie。将cookie与ssl一起使用。
6、以显式读模式打开文件。检查文件名中字符。如果存在允许范围之外的字符,就不要把这个文件名传给open()。
7、绝不要假设预处理会被执行。CGI程序决不能假设所收到的数据必定处于正确的格式。必须在CGI程序中检查数据格式,并在必要时修改它。
8、使用系统调用或管道时绝对不要相信来自表单的参数。应当验证变量只包含合法字符。而不是检查其中是否包含非法字符。这样才能确保$file中文件名正确。即只包含字母,数字,下划线各点号。
if ($file =~ /^[\w\.]+$/)) {   all is well   }  else {  all is not well  }
9、以序列方式执行system()。如:system("wc -c $file"),如果$file是a.dat;rm -rf / 就问题严重。变成wc -c a.dat;rm -rf /。可写成system 'wc','-c',$file。如果要在程序内部以反引号方式或管道方式得到相应结果,使用fork() and exec()。
如:$num_chars =`wc -c $file'; 安全实现为:if (open PIPE,'-|') { $num_chars =<PIPE>;} else { exec 'wc','-c',$file; }。如果要用管道实现如下:open P,"wc -c $file |"; print <P>; 可安全实现为:if (open PIPE, '-|') { print <PIPE> } else { exec 'wc','-c',$file; }

利用WEB农场,现在,将web服务器建立在大型ISP服务器上情形很常见,因此,你的站点可能同时和几百上千个站点一起被“放牧”在“WEB农场上。如果其中一个站点出现漏洞,那么就可能受到攻击,并使黑客获得root权限。那你也不能幸免。所以要明智地选择ISP.最好自已建站。

其它web服务器
Jigsaw(www.w3.org/Jigsaw)是由w3c开发,并用java实现,它的设计目的更着重于技术示范,示范将要流行的功能和技术,不建议使用。

thttpd是一个简单,小型,可移植,快速和安全的HTTP服务器。它内建调节功能,允许用户指定URL OR URL GROUP的最大字节流量。

AOL服务器。基于Tcl的多线程服务器。适用大型动态站点。由大型商业公司开发,但遵循GPL。

bash-httpd。是一个用bash编写的web服务器。但它没有其它大多数web服务器的功能,运行缓慢而且不安全,不适合于工作环境。

awk-httpd。一个用AWK写的web服务器。运行缓慢,不安全,而且只实现了http的一个子集。不适合于工作环境。

小结
采用以下几个措施可以帮助管理员保护web站点的安全。
1、选择一个安全的服务器,确保每当出现安全漏洞时都能够快速升级(apache能很好地满足这个要求)。这个要求也针对在基础软件中添加的其它部件,如mod_perl,mod_php4。
2、 正确配置服务器,使其拒绝列出目录内容,只执行特定目录下的CGI程序,并禁止使用 “..”(指向上层目录)。
3、绝不使用来处INTERNET的CGI程序,并且在编写这类程序时避免作任何假设。
4、除非使用序列方式,否则不要调用system() or exec()函数。也不要打开管道。
5、定时检查服务器的日志文件。

作者: yehua911   发布时间: 2010-10-11