当前位置:文档之家› 程序代码注入

程序代码注入


PHP示例
$action = 'login'; if (__isset( $_GET['act'] ) ) $action = $_GET['act']; require( $action . '.php' ); 这个代码相当危险,攻击者有可能可以干这 些事:
/test.php?act=evil/exploit - 注入远程机器上有漏洞的文件。 /test.php?act=/home/www/bbs/upload/exploit - 从一个已经上载、
SQL注入
SQL injection,是发生于应用程序之数据库层的安全漏洞。简而言之, 是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了 检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL指令而运行,因此遭到破坏。
在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection 的高风险情况下:
程序员疫苗:代码注入
几个月在我的微博上说过要建一个程序员疫苗 网站,希望大家一起来提交一些错误示例的代 码,来帮助我们新入行的程序员,不要让我们 的程序员一代又一代的再重复地犯一些错误。 很多程序上错误就像人类世界的病毒一样,我 们应该给我们的新入行的程序员注射一些疫苗, 就像给新生儿打疫苗一样,希望程序员从入行 时就对这些错误有抵抗力。 我的那个疫苗网站正在建议中(不好意思拖了 很久),不过,我可以先写一些关于程序员疫 苗性质的文章,也算是热热身。希望大家喜欢, 先向大家介绍第一注疫苗——代码注入。
过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输 入的数据做潜在指令的检查。
例程
某个网站的登录验证的SQL查询代码为 strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and
(pw = '"+ passWord +"');" 用户在登录时恶意输入如下的的用户名和口令: userName = "' OR '1'='1"; passWord = "' OR '1'='1"; 此时,将导致原本的SQL字符串被解析为: strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = ''
叫做exploit.php文件运行其代码。 /test.php?act=../../../../etc/passwd%00 - 让攻击者取得该UNIX系统目
录检索下密码文件的内容。一个使用空元字符以解除.php扩展名限制, 允许访问其他非 .php 结尾文件。 (PHP默认值”magic_quotes_gpc = On”可以终止这种攻击) 这样的示例有很多,只要你的程序有诸如:system()、StartProcess()、 ng.Runtime.exec()、System.Diagnostics.Process.Start()以及 类似的应用程序接口,都是比较危险的,最好不要让其中的字符串去 拼装用户的输入。 PHP提供escapeshellarg()和escapeshellcmd()以在调用方法以前进行 编码。然而,实际上并不建议相信这些方法是安全的 。
Shell注入
我们先来看一段perl的代码: use CGI qw(:standard); $name =
param('name'); $nslookup = "/path/to/nslookup"; print header; if (open($fh, "$nslookup $name|")) { while (<$fh>) { print escapeHTML($_); print "<br>\n"; } close($fh); }如果用户输入的参数 是: coolshell%20%3B%20/bin/ls%20-l那么,这 段perl的程序就成了: /path/to/nslookup coolshell ; /bin/ls -l
在应用程序中使用字符串联结方式组合SQL指令(如:引号没有转 义)。
在应用程序链接数据库时使用权限过大的帐户(如:很多开发人员都 喜欢用sa(最高权限的系统管理员帐户)连接Microsoft SQL Server数 据库)。
在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预 存程序等)
我们再来看一段PHP的程序
$myvar = 'somevalue'; $x = $_GET['arg']; eval('$myvar = ' . $x . ';');“eval“的参数将会视同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权限了。
OR '1'='1');" 也就是实际上运行的SQL命令会变成下面这样的,因此导致无帐号密码,也可
登录网站。 strSQL = "SELECT * FROM users;" 这还不算恶劣的#34;' ; DELETE FROM users; --";这样一来,要么整个数据库的表被人
相关主题