关于Web安全漏洞的心得及解决方案.docx
《关于Web安全漏洞的心得及解决方案.docx》由会员分享,可在线阅读,更多相关《关于Web安全漏洞的心得及解决方案.docx(11页珍藏版)》请在冰豆网上搜索。
关于Web安全漏洞的心得及解决方案
关于Web安全漏洞的心得及解决方案
赵铁甲2010-9-23
这两天在解决安徽Web项目的安全漏洞时遇到一些以前没有考虑的问题,但通过查阅一些
资料,最后还是基本解决了问题。
现在将在安全漏洞解决过程中的一些心得做下整理。
1.常见的安全漏洞
SQL注入
跨站脚本
PHP错误泄露系统信息
日志等信息文件泄露
服务器目录列表泄露
未捕获异常泄露系统信息
2.漏洞扫描工具可能扫描出的不确定漏洞
系统目录泄露
使用默认目录
存在邮箱地址泄露
存在无效链接
由于扫描工具给出的解释不太详细加之我们对Web安全的积累较少,对于这些漏洞存在的隐患
是如何被利用还无法获知。
所以暂时认为是不确定漏洞。
以下是我对以上漏洞的理解及其解决方案说明。
3.SQL注入
SQL注入是指黑客通过Web输入特殊字符,从而构建与我们程序预期不同的SQL语句,以达
到特殊目的。
3.1.引发原因
在我们的项目中SQL语句都是通过字符串拼接完成的,字符串有引号匹配的问题,如果不加以
处理,黑客就可利用这种字符串匹配关系实现特殊的SQL语句。
32实例
3.2.1.注入方式1(轻微)
functionaction5ql(){
$nair.e=$_GET[1nair.e*];
$sql="select-*fromawherenaTne=,Snaxe',r;$pdQ->geLRs($sql):
}
以上是一个简单的FleaPHP的action。
其功能是通过获取用户的输入name,来查询数据。
用户输入:
a'OR1=1ORrowid='2。
产生的SQL语句就是:
**select*fromawherenair.e-*a1OR1~1ORrowid-'11"
这样就会把整个数据取出来。
3.2.2.注入方式2(绕过登陆)
functionQu匸ionLogin(){
$loginN&me=$_GET[1lcginnair.e*];
Spasswd=$(jET[1passwd'];
"一种可能使甬的验证登陆方式
$sql=,Fselect*frcirr.userwherelogin=1$lQginName1andpasswd=,$pa3swd'
$user■$pdo->g&cRs;
if(err^ty($uger)}{
echo陆失败
}else{
echofr®陆成功h
}
}
以上是一个简单的登陆验证Action。
登陆名和密码由用户输入。
用用户名和密码作为条件查询,
如果存在则认为登陆成功。
用户输入:
用户名:
a'OR1=1OR(rowid='1
密码:
a')ORrowid='1
这时候产生的SQL语句是:
select*fromuserv^herelogin-a'OR1=1OR(rovHd二Tandpass^vd^'a1)ORrowid-T
这样用户就绕过了登陆验证。
3.2.3.注入方式3(可能产生致命后果)
在3.2.1中实例中,如果用户输入改为:
"a*;deletefromuserwhereTa'=1a
#■Lr11・,i4fc_TJL、a——』&I'
产生的SQL语句是:
select*&omuserxvheirname='a:
deletefromuserwherea—'a'
而且刚好你的数据库驱动直接采用query方式处理。
那后果就是会将整个数据表清除。
3.3.解决方案
3.3.1.输入过滤
SQL注入利用的是字符串的单引号和双引号匹配关系实现攻击的。
因此我们在用户输入端做数
据过滤就可避免。
其原理是对单双引号做转义,需要注意的是这种转义需要与数据库的转义规则相关。
3.3.2.针对FleaPHP的临时补丁
针对目前的情况,我写了一个临时方法来过滤输入。
如下(这段代码在附件中有)
/
*針对OEUkCLE数据庫的输入注入转义
*9paramRvalue
*gparaio.$lrey
*&return
functionsecureSuperGlobalGEI(4Svalue^Skey)
{
$_3ET[$Itey]•htmlspeaialchars(S^GET[$key])?
$_GET[Sftreyj=3xr_Eeplace(■''"1■str_replace(rr,■","1nr3trlp3la3h.es{$_3ETli^keyj}));
}一一一-
functionsecure呂up色HGlcibaLlFO呂T(4Svaluef$key)
{
$_POST[SlteyJ=htmlspeciialchars(5_£^051[Skey]j:
S_POST|[Slrey]=3tr_xeplace(fMR,,H11"3tr_replace(ffP,'p,rF,1wstrips1ashes(S_POST[SJcey])J)j
}~--~
functionsecuredobals(>{
arrayGET**aecureSuperGlobalGET*):
array^walk($_POSTrpaecureSuperGlobalPOSTpJ;
J
在FleaPHP的入口文件中,在FLEA:
:
runMVC()之前调用secureGlobals函数。
可以转义用户
输入的单双引号,避免了以上提到的几种SQL注入漏洞。
对于其他非单一入口语言,就只能在所有接收用户输入的地方做输入过滤。
注意:
输入过滤不单要在有用户输入窗口的文件中处理,所有有GET和POST的地方都要处理,
因为我们还要考虑到用户有可能会篡改url来达到某种目录。
4•跨站脚本攻击
跨站脚本是指用户通过在连接地址中携带script脚本代码或是flash等实现的攻击。
4.1.实例
functionaccionXSS(){
Snanie=$_GET['nair®1];
SBitarty->aB5ign(n^air.eT,rSnaire);Ssrrarty->display("index,htmlr,);
站攻击V/匸
{
以上是一个FleaPHP简单的action和一个模板文件。
4.1.1.攻击方式1(嵌入VSCRIPT〉标签)
当用户输入的name值为:
k(a>alerjL(MXSSfl);3criptXa>
那么模板就会被编译为含有一个javascript脚本的html。
用户页面中会产生弹出窗口。
以上只是简单的实例。
4.1.2.攻击方式2(嵌入远程脚本加载,Flash等)
与上面实例相同如果开发人员将用户输入存入数据库中,然后再查询渲染模板,并且这个页面可能是一个公共页面。
那黑客相当于就可以借助我们的网站在页面中挂木马,挂危害脚本来实现对我们网站用
户的攻击。
42解决方案
4.2.1.输入过滤
与SQL注入中的过滤类似,只是要将html标记做转义。
4.2.2.针对FleaPHP的临时补丁
在上面的SQL注入补丁中同时包括了html转义的操作。
直接使用即可。
注意:
输入过滤不单要在有用户输入窗口的文件中处理,所有有GET和POST的地方都要处理,
因为我们还要考虑到用户有可能会篡改url来达到某种目录。
5.PHP错误泄露系统信息
这个问题比较普遍,用户通过更改URL来制造错误信息,然后通过错误信息中显示的系统信
息来了解目标服务器的目录结构等。
5.1.解决方案
酉己置php.ini
将display_errors设为Off。
记得重启服务器使其生效。
6.日志等含重要信息的文件泄露
目前我们的Web项目整体都是放置在Apache可访问的目录内。
这也就说明我们项目中所有内容都是Web可见的。
在不更改目录结构的情况下,我们只能通过访问控制来放置用户访问这些文件。
(Qeb__
6.1.解决方案
6.1.1.通过apache配置文件httpd.conf
Apache有一个FilesMatch指令,通过这个指令可以实现对某些文件的访问控制。
如下:
OrdsTallow,dDenyfromall
在apachehttpd.conf文件中加入这条指令。
指令的意义是,所有log,sql,sh,bin等后缀的文件均不允许用户访问。
apache的酉己
注意:
这个指令生效的前提是已经打开apache的allowoverride开关,这个开关在
置文件中完成,如下:
当设置AllowOverride为All的时候这个开关就打开了。
Options
AllowOverride
需要注意的是配置的AllowOverrideAll对Directory所指定的目录才有效。
也就是说修改配置时去对照Directory指令的参数。
6.1.2.通过.htaccesS文件实现访问控制
.htaccess文件与httpd.conf不同之处是.htaccess是针对不同目录配置的,而且配置修改后,不用
重启服务器,所以比较灵活。
这里举一个示例:
我们的所有目录都被暴露在apache可访问目录内,而我们需要通过apache访问的只有少数文
件(在FleaPHP中只有index.php和js、css和图片)。
这时候,有些目录我们就要禁止用户访问。
如,我们不允许用户访问Themes下的Html模板文件,只需在themes下增加一个.htaccess文件,然后配置为:
Ipweouserappz:
*/wwwaamtn;mmsp/in
fromal1
/FilesMatch>
这样,用户访问这个目录内的html文件都会被提示无权限。
.htaccess
注意:
.htaccess文件会对其下的所有子目录和文件都生效,如果某个子目录需要重写这种规则,只需在这个子目录中添加一个.htaccess文件加入相应的规则,就会覆盖父级以上目录的
配置规则。
6.2.最好的解决方案
我认为以上提到的解决方案不是最佳方案。
首先通过这种方式比较繁琐,开发人员需要对每个目录进行配置。
.htaccess文件会对网站性能产生影响,这对于有较大访问量的网站会有较大弊端。
这种方式类似于补丁,如果目录结构庞大会让配置无法进行或是很难维护。
所以最好的解决方案我认为是这样的:
分离用户可访问和不可访问的目录或文件。
在部署时将apache的目录指向可访问目录。
这样就可以避免用户获得不应该获得的信息,这也极大地降低了安全风险。
当然这种架构方式还需要进一步深入讨论。
7.服务器文件列表泄露
7.1.解决方案
配置apache配置文件httpd.conf
将对应目录的Option后的indexes删除即可。
8.未捕获异常泄露的信息
这也是我们可能普遍存在的问题。
由于调试需要,当出现异常时会打印一些调试信息。
而这种信息可能包括了程序信息。
很容易成为黑客攻击的引路人。
8.1.解决方案
尽可能处理所有异常,在生产环境中移除调试语句等可能含有重要信息的语句,女口SQL,路劲
9.针对不确定的漏洞
这些不确定漏洞应该不太具备攻击性,而且有部分有扫描软件误报的嫌疑。
但是这也对我们以后的开发有一些警示作用。
9.1.泄露内网IP邮箱地址等
这其实是部署项目时没有Js等文件中的注释而被扫描出来的。
我们是否应该在部署版本中将一
些注释给删除呢?
9.2.默认目录
这要求我们在给目录命名时采用一些不太普遍的名称,如何命名,我觉得还需考虑。
但是如果将不可访问目录做了分离,那这应该就不是问题了。
10.关于PHP配置文件和Apache配置文件的一些心得
前段时间安徽也扫描过一次,当时也暴露出了一些漏洞,那时主要是针对服务器软件的。
这里就分享几个可能常用的php和apache的配置项。
10.1.Apache
Timeout超时时间
这个配置项是指http请求的超时时间,指服务端无输出到断开连接的时间。
单位是秒。
如:
我们请求一个页面,超过5s仍然无结果,那这个连接就会断开了。
如何设置该项?
我的理解是这样的:
对于管理网站可以设置稍微长一些,因为有些请求可能比较耗时。
但请求项相对较少,而且无并发压力。
对于用户网站可以设置短一些。
设置得长与短的坏处?
设置过长可能会产生比较严重的后果,如设置为100。
当用户请求一个不存在URL时,这个请
求会在100s后才断开,这样用户只要同时发起4,50个请求,就有可能让Apache崩溃。
设置短可能会使一些比较复杂的数据库查询没执行完就断开连接了。
Directory指令
该指令是配置一个Apache可访问的目录信息
其中有以下几个常用的指令
Options这个指令后可以有Indexes,Indexes是指当用户进入一个目录时,目录内如果没有默认
可访问的文件,就列出列表。
这个配置在开发环境中可以使用,但在现网中应该关闭。
AllowOverride值有AllNone等。
All是指,用户可以覆盖这个目录内的配置项。
如我们前面提到的。
Htaccess要在All开启的时候才能生效就是这个原因。
Order这个指令是检测的顺序,先检测allow后检测deny。
我的理解是如果针对同一个目录有
多个配置,那后面检测的覆盖前面的。
Denyfromall阻止所有访问
AllowFromall允许所有访问
Denyfrom和Allowform后还可以跟ip等,实现对某些IP的访问控制。
FilesMatch指令
该指令是文件匹配指令,匹配规则采用的正则表达式。
通过这个指令可以完成对某一个或某一类文件的访问控制和操作。
Files指令
与FliesMatch指令不同的是Files默认情况下不是正则匹配文件,如果要用作正则匹配,匹配式前要添加~符号
对于模块的配置需要参照模块的说明来完成
还有一些简单的缺省文件等配置就不在此说明了
ApacheRewrite
这个部分在目前拍悦中已经使用,东西比较多。
等拍悦网完成后,再做添加。
10.2.PHP
max_execution_time
这个配置项是指php脚本最大的运行时间。
如,一个程序运行超过这个时间还未结束,php就会触发错误。
这个配置项的值与前面的apachetimeout的配置思路一样,根据实际情况修改即可。
memory_limit
PHP内存限制。
我们可能会要到的问题是,当查询一些大数据时会提示内存不够,这种时候可以修改这个数值。
error_reporting
显示错误类别有ERRORNOTICE等。
可以根据需要配置。
但是关闭display_errors后这些错误就不会显示了。
display_errors
是否显示错误,现网环境中要设置为Of。
原因见前面的漏洞说明。
post_max_size
POST的最大容量。
这个与上传文件也有关系,因为上传文件会通过POST传给PHP。
在需要上传大容量文件时,不仅要修改Max_upload_size项,还要修改这一项。
upload_max_filesize
上传文件的最大容量。
与上一选项也有关系。
Session开头的配置
这些配置与Session有关
PHP的配置时可以通过ini_get()和ini_set()函数动态配置的,因此这些配置项可以在程序中完成。
这样做可以增强程序的移植性,因为它对环境的依赖降低了。
11.建议
在程序中增加对开发环境和生产环境切换的支持
这种切换不单单是数据库连接数据的切换,还应该是Debug模式到deploy模式的切换。
将程序中的js、css、image、index.php分离出来
将服务器目录直接指向这些,隐藏Lib,控制器等无需通过Http访问的目录。
在使用第三方软件时,删除其中的实例和其他无用文件。
因为从这次扫描来看很多扫描漏洞都是从这些第三方软件的列子中触发的。
项目上线之前对JS等做无注释、最小化处理
从目前来看,注释也是扫描软件关注的地方,而且注释一般也会为黑客提供理解业务逻辑的渠道。
当然做最小化处理就更能降低这种风险了。
数据库操作层应该逐步统一
这样可以在攻击发生时,降低问题解决的难度。
Web项目的部署应该逐渐建立统一机制
现在的部署只是简单的复制、上传、修改配置。
以后应该逐步增加无用文件的删除、代码最小化等部署处理。
同时应该对Apache和PHP中的缺省配置做修改,注释无用配置项,降低安全风险。
关注Apache、PHP等官网
定期更新官方补丁,大部分漏洞在补丁中都会解决。