找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 1272|回复: 2

[【原创】] 对莫名其妙转向到某读书网站的分析[开发员版]

[复制链接]
发表于 2006-3-31 17:53:58 | 显示全部楼层 |阅读模式
[声明]您现在看到的帖子为: 开发员版

因为此贴过长, 并且并非所有用户都要通读,
考虑再三, 还是将其切割开来. 如此, 本贴共分三版, (链接如下)
其一为用户版, 其二为开发员版, 其三为管理员版.
如果您为普通用户, 则您仅需阅读用户版.
如果您为开发人员, 建议您阅读用户版+开发员版.
而管理人员, 则仅需阅读管理员版[如有兴趣可通读].

==============================================
(上接用户版)

如果您是开发人员, 则您肯定不想就这样束手就擒,
毙掉那可爱的 Flash. 那就让我们从编程入手吧!

我们知道 PHPWind 是用 PHP 写的(风影:孔南灌水,扣稿费!).
那我们需要一款较好支持 PHP 的文本编辑器来编辑它.
我使用的是 EditPlus, 大家可以用自己顺手的软件.
因为是回复时候的 Bug , 理所当然从回复页面入手.
仔细想想在回复页面下部, 帖子列表开始的标志是什么?
想不起来的话, 就看下面的图片吧!


这下清楚了吧, 是\"主题回顾\"四个字.
而这四个字以下的页面, 就是一些回复内容了.
如果能找到这些字在代码中的位置, 分析起来就会事半功倍.
(PS: FPE用户和爆破工作者们可能最熟悉不过了. )

打开 EditPlus, 点击搜索菜单->在文件中查找,
在查找内容中输入上面四个字: 主题回顾,
文件类型选择网页文件(PHP, HTM, HTML, INC...);
再选择 PHPWind 源码文件夹, 最后记得选定\"包含子文件夹\",
点击\"查找\"按钮就可以了.


搜索结束, 只找到一个结果(最好的情况). 双击进去看看吧!


\"主题回顾\"所在的页面为 HTM 页面, 看起来很像一个模板.
紧挨着它的是一个 $post_reply (英文, 译为: 帖子_回复).
看来这个东西非常可疑啊! ~
孔南没啥别的本事, 就顺藤摸瓜呗!
按和上面相同的方式, 在文件中查找\"$post_reply\".


搜索结果如下:


从搜索结果中可以看出这次一共找到3处匹配, 其中之一是刚才那个,
而另外两处均位于 require\\postreply.php , 且靠得很近(86 和 92行).
86行代码仅仅是: $post_reply=\"\"; 这是在做初始化, 对我们没用.
看来为其赋值的代码是在 92 行了. 双击搜索结果转向该匹配项.

$query = $db->query(
  
\"SELECT author,subject,postdate,content FROM pw_posts WHERE tid='$tid'
  AND ifcheck='1' ORDER BY postdate DESC LIMIT 0 ,
$db_showreplynum\");
while ($oldsubject = $db->fetch_array($query))
{
  
$oldsubject['subject'] = stripslashes($oldsubject['subject']);
  
$oldsubject['content'] = stripslashes($oldsubject['content']);
  
$tpc_author = $oldsubject['author'];
  
$post_reply. =
   
\"$oldsubject[author]:$oldsubject[subject]
\"
.convert($oldsubject['content'],
   
$db_windpost).\"$tablecolor width=80%>\";
}


在代码中可以清楚地看到 $post_reply 后面的部分是一些 HTML 代码,
而该变量又位于 while 循环体中, 每次执行均通过 \".=\" 运算符连接起来.
(.=为PHP的自连接运算符, 已在上图标出, 不要以为显示器沾了墨水哦~)
那么当该循环执行完毕时, $post_reply 应该保存了所有的回复.

我们知道, 数据是从数据库(db)里查询(query)出来的(风影: 你小子第二次了!)
上文有条查询语句: Select..... 但它查询了哪些内容呢? 顾名思义一下吧!
author=作者,subject=主题,postdate=发贴日期,content=主要内容.
这些东西确实能够组合出主题回顾来, 看来俺 YY 的本领还是不错地嘛!

看起来似乎一切正常. 但是且慢, 凭上面几条是无法做出禁言处理的.
这让我们想起了另一点: 正常浏览时是可以禁言的, 这儿为什么不行?

问得好! 不过具体原因我也不清楚, 还是让我们一起来探索一下吧!
使用本人惯用的伎俩: 搜索大法! 搜索什么(自己想想禁言时显示什么)?
想不起来就看答案: 请拖动鼠标 |→No Permission←|

搜索过程我就不再详细描述了, 搜索出来结果一共是两条,
其中之一位于 replypost.php (回复帖子), 另一条位于 read.php (阅读帖子).
具体是哪个页面, 使用和上面一样的思路 YY 一次就知道了. 嘿嘿.

我们直接转到 read.php页面的相应位置. 截图如下:


个人认为, 如果(if)作者被禁言, 且读者无权浏览, 则该代码会被执行,
(注意上面的两个条件)而执行的结果就是本来的帖子内容被一张黄纸捂起来了.
该代码恰位于 if 语句体中, 那么 if 后面的东西就应当是判断的条件.
根据 PHPWind 官方的解释, 管理员组的用户可以查看被禁言的帖子.
所以判断条件应为作者是否属于\"禁言用户组\", 及读者是否属于\"管理员组\".

但是据说在当前复杂的局势下, 光靠 YY 是不行的, 得动真格的.
所以我们做个测试. 创建一个\"测试\"用户, 发一个内容为\"发言内容\"的帖子.
使用管理员登录, 对\"测试\"用户实施永久禁言. 管理员退出登录.
(其后有无其它用户发贴都无所谓. 比如我就用\"还测试\"用户回了它的贴.)

以上步骤完成后, 我们开始跟踪. 我使用的工具为 NuSphere PhpED 4.0.
在 No Permission 行设置断点, 从 index.php 开始调试(F9)....[过程略]
代码即将执行该行时被拦截, 这时我们可以用\"监视\"工具来分析执行结果.
因为上文中, No Permission 的赋值对象为 $read['content'], 所以监视 $read.
[为什么? 这叫连坐. 你一人坏了, 全家肯定也都跟着坏了. 嘿嘿!]
http://www.q5.cn/blog/10080/upload/20063317429.swf
注: Flash 中的目录图标可以通过点击左侧的三角箭头来展开.

从 Flash 的 $read 中我们可以看到被禁言的作者为\"测试\", 内容为\"发言内容\",
这和我们想像的一样. 它的主题却为空, 因为上一行代码的执行已经清空了它.
大家可浏览 $read 中的其它数据, 对我们有用的是 $read['groupid'], 值为6.
同时如果我们监视 $groupid(全局), 将得到当前用户的 groupid, 示例中为 8.
那么这个 6 和 8 代表什么含义? 还是看一下数据库吧:


可见组编号对于管理员为 3, 禁言用户为 6, 普通用户为8.

现在已经很明显了, 在浏览帖子时系统会检测上述变量 (注意 && 短路作用),
如果作者被禁言($read['groupid'] == 6), 就检测当前用户是否为管理员;
如果当前用户不是管理员($groupid != 3), 就执行屏蔽代码将内容替换掉.

知道了原理, 想改代码就很容易了. 因为前任代码先天不足难当大任(没查够),
我们需要修改 select 语句, 使之到 pw_members(会员) 表中查询作者的组别,
另外像前文一样加上两个判断语句就可以了.

1.原: SELECT author,subject,postdate,content FROM pw_posts WHERE tid='$tid' AND ifcheck='1' ORDER BY postdate DESC LIMIT 0 ,$db_showreplynum
改为: SELECT m.groupid, author,subject,postdate,content FROM pw_members m, pw_posts p WHERE tid='$tid' AND ifcheck='1' AND m.uid = p.authorid ORDER BY postdate DESC LIMIT 0 ,$db_showreplynum

2.原:
$oldsubject['subject']=stripslashes($oldsubject['subject']);
$oldsubject['content']=stripslashes($oldsubject['content']);
改为:

if($oldsubject['groupid'] == '6' && $groupid != 3)
{
   $oldsubject[&#39;subject&#39;]=\"<span style=&#39;background-color:yellow&#39;>Forbidden!</span>\";   
   $oldsubject[&#39;content&#39;]= \"<span style=&#39;background-color:yellow&#39;>No permission to view this article! </span>\";     
}
else
{

   $oldsubject[&#39;subject&#39;]=stripslashes($oldsubject[&#39;subject&#39;]);
   $oldsubject[&#39;content&#39;]=stripslashes($oldsubject[&#39;content&#39;]);
}


改完后的代码如下:
  1.    $query = $db->query("SELECT m.groupid, author,subject,postdate,content FROM pw_members m, pw_posts p WHERE tid=&#39;$tid&#39; AND ifcheck=&#39;1&#39; AND m.uid = p.authorid ORDER BY postdate DESC LIMIT 0 ,$db_showreplynum");
  2.    while($oldsubject=$db->fetch_array($query)){
  3.       if($oldsubject[&#39;groupid&#39;] == &#39;6&#39; && $groupid != 3)
  4.       {
  5.         $oldsubject[&#39;subject&#39;]="<span style=&#39;color:black;background-color:#ffff66&#39;>Forbidden!</span>";   
  6.         $oldsubject[&#39;content&#39;]= "<span style=&#39;color:black;background-color:#ffff66&#39;>No permission to view this article! </span>";     
  7.       }
  8.       else
  9.       {
  10.         $oldsubject[&#39;subject&#39;]=stripslashes($oldsubject[&#39;subject&#39;]);
  11.         $oldsubject[&#39;content&#39;]=stripslashes($oldsubject[&#39;content&#39;]);
  12.       }      
  13.       $tpc_author=$oldsubject[&#39;author&#39;];
  14.       $post_reply.="<table align=center width=70% cellspacing=1 cellpadding=2 style=&#39;TABLE-LAYOUT: fixed;WORD-WRAP: break-word&#39;><tr><td width=100%>   $oldsubject[author]:$oldsubject[subject]<br><br>".convert($oldsubject[&#39;content&#39;],$db_windpost)."</td></tr></table><hr size=1 color=$tablecolor width=80%>";
  15.    }
复制代码
回复

使用道具 举报

发表于 2006-4-10 22:40:03 | 显示全部楼层
php真可恶
还是喜欢vbs和js
回复

使用道具 举报

 楼主| 发表于 2006-4-11 18:06:16 | 显示全部楼层
引用第1楼raogy2006-04-10 22:40发表的“”:
php真可恶
还是喜欢vbs和js

可恶吗? 可恶的话就把这个论坛干掉

我也比较喜欢 js, 但有时用 PHP 写写东西还是不错的,
安全性和性能方面比 asp 都好点, 更主要是LAMP都免费.
并且通过上文的描述可以发现调试 php 也应该不算太难.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-5-23 11:17 , Processed in 0.413102 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表