承接上文,继续介绍常见的编码漏洞:
5. 跨站点脚本
跨站点脚本漏洞(XSS)主要出现在web应用中,攻击者输入恶意数据来跳过访问控制机制,进而导致恶意数据被投射进入客户浏览器(非持久型XSS)或者被存入服务器端(持久型XSS),可被用于窃取敏感数据,比如缓存数据(基于文档目标模型DOM-based XSS)。通过利用这个漏洞,攻击者可以破坏网页,执行网络钓鱼攻击,向可信网页内注入恶意链接,或者将机密信息发送给其他不可信网站。如果没有实现一个适当的服务端输入验证,任何用于网站建设的语言(例如PHP,C#,VB.Net,ASP.NET,J2EE,以及ASPs)都可能存在这种漏洞。
/** Example of Cross-Site Scripting **/
<? php
$input_text=$_GET['input_text'];
echo "$input_text welcome to my page";
?>
上图中,代码中希望的输入是访问者的用户名,并且没有执行输入检查。这种错误可能导致跨站脚本漏洞。
6. 跨站请求伪造(CSRF)
跨站请求伪造发生在端用户被迫在已经被认证的网站应用里执行非预期的动作时。所有只采用持久身份认证的网站应用都可能存在这种漏洞。通过执行这类攻击,攻击者可以执行所有有利于自己的动作,比如说从受害者的账户转账给攻击者的账户。
跨站请求伪造不是一个简单的语句漏洞,所以举例起来比较麻烦,以下是一个实例模型:
在这个攻击场景中,受害者首先发送登陆请求和凭信给可信网站。认证成功之后,受害者的网页浏览器存储了可信网站发过来的cookie信息。现在,如果受害者不小心访问了恶意网站,则攻击站点可以对受害者执行跨站请求伪造攻击。简而言之,攻击者使用受害人存储在cookie中的凭信向可信网站发送HTTP请求。可信网站将攻击者当作已认证用户执行请求操作。
跨站点请求伪造攻击基于的假设时可信网站只对用户的浏览器而不是对用户本身进行验证。
7. 结构化查询语言(SQL)注入
SQL注入是将SQL命令/语句嵌入到用户输入数据中以此来绕过访问控制机制,完成执行,添加,删除或者篡改后端数据库等攻击动作。通过该攻击,攻击者可以从数据库中窃取包括用户个人身份信息(信用卡号,社保号,姓名,地址等)的任何数据。任何与该后台有关联的语言都会被影响,例如C#,PHP,ASP.NET 以及JSP。
/** example of SQL Injection **/
<for method="post" action="Login_Account.php">
<input type="text" name="username">
<inout type="password" name="password">
</form>
这个代码片段是最基本的认证方式。用户将凭信发送给Login_Account.php。因为没有输入验证,可以构造一种注入:从LOGIN中选择用户名为‘John_smith’,密码为‘ ’or 1=1’;因为SQL查询器只会检查用户名,第二部分语句‘or 1=1’永远是真,所以不需要正确密码也可以登录成功。
8.不安全的直接对象引用
当程序没有采用认证机制并且暴露出了对内部实现对象例如URL,形式参数,文件,目录或者数据库记录等的引用。攻击者通过篡改这些引用来访问敏感信息。所有网站应用开发用到的语言都可能存在这个漏洞。一个简单的例子:
http://www.abc.com/resources/accounts/information/getinfo.jsp?padeld=help.html
这个链接本来是用来查看帮助页面的,如果开发人员没有实现认证机制,攻击者可以通过便遍历目录的方式直接跳到网页目录的任意位置。例如:
http://www.abc.com/resources/accounts/information/getinfo.jsp?padeld=../../../imp_file.
9. 不正确的异常处理引起信息泄漏
当程序开发人员没能实现一个适当的错误处理机制时,应用可能会泄漏关于其内部状态,系统配置,或者资源的相关信息。这些信息可被攻击者用来攻击该系统。不恰当的错误处理可能导致程序冲突,放弃,结束或者重启,都有导致拒绝服务的可能性存在。所有使用异常处理或者带有返回值的程序可能出现这种问题进而导致信息泄漏。
/** Example of Improper Error handling and information Leakage **/
404 Not Found
Not Found
The requested URL /abc/xyz_help/ was not found on this server
_______________________________________________________________
Apache/2.2.3(Debian) PHP/5.2.0-8+etch13 mod_ssl/2.2.3 OpenSSL/0.9.8c server at abc.pqr.de port80
本例之中的错误信息就泄漏了网站服务器,操作系统,串口号以及使用的其他产品。
10. 不安全的存储和对密码算法的不恰当使用
不安全的存储主要指的是用明文存储口令,密钥,证书以及其他敏感数据。而使用短密钥(例如56bit的DES),弱密码算法(RC4和MD5),非标准的密码算法,密码学特性脆弱的随机数发生器(PRNG),不恰当的密钥管理(例如,密钥存储在不安全的位置),密钥硬编码都可能导致信息的泄漏或者破坏。某些通用协议例如HTTPS包含了协商密码算法,可能会允许使用不安全的算法。
11. 竞态条件攻击(TOCTTOU)
当资源为某个特殊值做了检查,数值发生了变化,然后资源在使用时却依旧认为这个值与检查的时候比没有变化。攻击者可以利用这个竞态来跳过安全检查或者使用非预期的方式侵占资源。下面是一个竞态条件攻击的实例:
/** Example of race condition attack **/
while ((ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0)) < 0){
[...] //打开调制解调器设备
}
[...]
if (fstat(ttyfd, &stabuf) < 0|| fchmod(ttyfd, statbuf.st_mode & ~(S_IWGRP | S_IWOTH)) < 0){
syslog(LOG_WARNING,"Couldn't restrict write permissions to %s: %m",devnam);
}else //禁止写权限并记录原来的状态
tty_mode = statbuf.st_mode;
[...]
if(tty_mode != (mode_t) -1)
chmod(devnam,tty_mode); //恢复对指定文件的访问权限
这段代码是pppd点对点协议守护程序的一部分,它首先禁止对该守护程序所用的端口写入广播消息(例如“UPS:系统当前使用电池操作”),端口上出现这种消息将搞乱PPP协议处理程序。在文件被打开之后,该段代码使用获得的文件描述符(ttyfd)来获取并改变对应文件的访问模式。到此为止这段代码都是正确的,它使用了fstat和fchmod系统调用来直接操作文件句柄。但是,在将文件访问模式恢复到原来值的时候,该代码错误地使用了chmod系统调用。
恶意用户可以执行一个程序,该程序在pppd调用chmod之前已经将指向原来文件的链接改为指向另一个文件,欺骗pppd去修改该文件的访问权限。
至此,关于基本代码安全漏洞的介绍结束。