目錄
一、跨站腳本攻擊(XSS)
1.1 漏洞簡介
1.2:類型
1.3 XSS危害
1.4XSS防御規則
二、環境搭建
三、xsst通關記錄
Level 1:文本解析為 HTML
Level 2:htmlspecialchars;input 標簽 value 注入
定義和用法
字符過濾繞過
Level 3:
level 4:雙引號閉合+添加事件
level 5:新建標簽
level 6:大小寫繞過
level 7 雙寫繞過
level 8 編碼繞過
level 9 檢測關鍵字
level 10 隱藏信息
level 11 Referer信息
level 12 user-agent信息
level 14
level 15(ng-include包含)
level 16 空格實體轉義?
level-17(參數拼接)
level-18(參數拼接)
level-19(Flash XSS)
level-20(Flash XSS)
四.總結:
幾種注入方式
on事件屬于點擊觸發事件
?收集信息的方法
xss常見注入點
參考
一、跨站腳本攻擊(XSS)
? ? ? ? 1.1 漏洞簡介
? ? ? ? XSS又叫CSS(Cross Site Script)跨站腳本攻擊,是指惡意攻擊者往web頁面中插入惡意代碼,當用戶瀏覽該網頁時,嵌入其中的惡意代碼會被執行,從而達到惡意的特殊目的。XSS屬于被動式的攻擊。
? ? ? ? XSS最大的特點就是能注入惡意的HTML/JavaScript代碼到用戶瀏覽的網頁上,從而達到劫持用戶會話的目的。由于HTML代碼和客戶端JavaScript腳本能在受害者主機上的瀏覽器任意執行,這樣等同于完全控制了Web客戶端的邏輯,在這個基礎上,黑客或攻擊者可以輕易地發動各種各樣的攻擊。
? ? ? ? xss漏洞通常是通過php的輸出函數將javascript代碼輸出到html頁面中,通過用戶本地瀏覽器執行的,所以xss漏洞關鍵就是尋找參數未過濾的輸出函數。
常見的輸出函數有: echo printf print print_r sprintf die var-dump var_export。
? 1.2:類型
從攻擊代碼的工作方式可以分為三個類型:
(1)持久型跨站:最直接的危害類型,跨站代碼存儲在服務器(數據庫)。
(2)非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問服務器-跨站鏈接-返回跨站代碼。
(3)DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。
基于DOM的XSS漏洞是指受害者端的網頁腳本在修改本地頁面DOM環境時未進行合理的處置,而使得攻擊腳本被執行。在整個攻擊過程中,服務器響應的頁面并沒有發生變化,引起客戶端腳本執行結果差異的原因是對本地DOM的惡意篡改利用。
1.3 XSS危害
? ?(1)盜取管理員cookie
? ? ? ? 竊取用戶的cookie非法登錄,使得入侵者具有惡意操縱后臺數據的能力,包括讀取、更改、添加、刪除一些信息。
(2)網站掛馬。
? ? ? ? 先將惡意攻擊代碼嵌入到Web應用程序之中。當用戶瀏覽該掛馬頁面時,用戶的計算機會被植入木馬。
(3)發送廣告或者垃圾信息
? ? ? ? 攻擊者可以利用XSS漏洞植入廣告,或者發送垃圾信息,嚴重影響到用戶的正常使用。
1.4XSS防御規則
- – 不要在允許位置插入不可信數據
- – 在向HTML元素內容插入不可信數據前對HTML解碼
- – 在向HTML常見屬性插入不可信數據前進行屬性解碼
- – 在向HTML JavaScript Data Values插入不可信數據前,進行JavaScript解碼
- – 在向HTML 樣式屬性值插入不可信數據前,進行CSS解碼
- - 在向HTML URL屬性插入不可信數據前,進行URL解碼
二、環境搭建
xss-labsxss-labsxss-labs?是一套基于 PHP 的 XSS 靶場,以闖關的形式讓我們體驗各種 XSS 漏洞利用方式。雖然已經是很多年前的了,但其中基本的 XSS 漏洞依然很有意義。
一共有 20 關,每一關的目標都是實現彈窗(alert(1)
),如果成功就會自動進入下一關。
克隆這個代碼倉庫的代碼,其中是 xss-labs 的 PHP 源文件。只要放在 PHP 環境下即可.本機使用phpstudy_pro,將將文件放在phpstudy_pro下的www文件里邊就歐克了。
部署完成后,訪問 index.php,就可以看到入口了:
??
?
三、xsst通關記錄
Level 1:文本解析為 HTML
URL 為?level1.php?name=test
?時,傳入的參數是 test,顯示的是「歡迎用戶 test」。顯然,這個頁面會將我們傳入的名字顯示出來。
?
我們打開開發者工具(F12)
這里name=test,放到了<h2>這個標簽里,前端是可以執行JS代碼的,我們執行如下代碼
http://127.0.0.1/xsslabs/level1.php?name=<script>alert(1)</script>
Level 2:htmlspecialchars;
input 標簽 value 注入
定義和用法
htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體編碼。
預定義的字符是:
- & (和號)成為 &
- " (雙引號)成為 "
- ' (單引號)成為 '
- < (小于)成為 <
- > (大于)成為 >
這關多了一個文本框。如果依然嘗試傳入?<script>alert(1)</script>
,會發現在 h2 元素中符號被轉義了(查看網頁源代碼能看到),<h2>⁢script>alert(1)</script;></h2>,所以不會被解析成 HTML。
頁面上能夠正常顯示是htmlspecialchars()給轉換為HTML實體編碼后HTML又給解析為正常顯示。
然而,可以看到后面的文本框?input
?元素,其 value 值并沒有被轉義。
<input name=keyword value="<script>alert(1)</script>">
既然如此,我們可以閉合 value 的內容的后引號,然后閉合這個 input 標簽,接下來再加入我們想要注入的?<script>alert(1);</script>
。只需要在其之前加上?">
?即可。
Level 3:字符過濾繞過
這一關的代碼好像和第二關有點像,我們輸入上一個看一下行不行
這里沒有逃逸出來,這一招好像不管用了?
這是因為用的單引號閉合🤣既然單引號不會被轉義,我們可以閉合 value 這個字符串。
但是,<>
?都會被轉義,似乎不能閉合這個標簽。有什么辦法能夠不用?<script>
?標簽來注入 JavaScript 代碼呢?答案是使用觸發器,比如?onfocus
?或者?onclick
。
可以看到這樣就逃逸出來了,然后我們隨便找個js代碼就可以通關了。
level 4:雙引號閉合+添加事件
第一處<
和>
被實體轉碼
第二處地方<
和>
被替換成空?
同樣使用上一關方法:通過<input>標簽的一些特殊事件來執行js代碼
payload?" onclick=alert(12) //
左邊的">去閉合原先的"?
level 5:新建標簽
雖然input被閉合了,但是script和on被過濾掉?
現在on和script都被過濾掉了,那就用一個不含on和script的標簽來執行
level 6:大小寫繞過
這里和上一關一樣,script被過濾,
雖然input被閉合了,但是被關鍵字過濾就很難受;不行了那就試一下大小寫
很明顯成功了。。。換一個試一下也是可以的
level 7 雙寫繞過
1.<script>alert(‘xss’)</script>
2."οnfοcus=javascript:alert('xss')"
3.?keyword="> <a href=javascript:alert('xss') > xss</a> //
4. " οnclick=alert(12) //
嘗試之后都是被過濾,就很難受,大小寫在這也不靈了,那還有什么辦法?
他過濾一個script,那我寫一個這個呢?oonnclick,試一下
level 8 編碼繞過
可以看到這里有被過濾,那就想辦法繞過就行了么
之前使用過的方法都試了一遍還是不行,只能另找思路:
這里將javascript:alert(1)轉換為實體編碼試一下
這是轉換之后的編碼javascript:alert(1)
可以看到當添加了友情鏈接之后a標簽里的連接直接轉換成我們想要的東西,這就歐克了。
level 9 檢測關鍵字
可以看到不管你寫啥都是鏈接不合法,這是咋回事?那我寫個合法的:比如https://baidu.com,這合適的吧;
還不合法,那我試一下http?
這一下就合適了,看來是要加http呀,那我加上再看
又被過濾,那我轉一下碼(javascript:alert(1)http://)
javascript:alert(1)//http://
備注:后邊的//注釋一定要加,不然它就驢唇不對馬嘴,自然瀏覽器也懵逼,所以要把后邊的網址注釋掉。
level 10 隱藏信息
我們看到第十關沒有輸入框了所以我們在url欄里輸入?
沒有用;而且下邊我們看不到有傳進來值,我猜測應該是被隱藏起來了,但是有3個input,試著給這三個分別傳一個值看一下
?t_link=qqqq&t_history=wwwww&t_sort=eeee
這里傳進來了,那好像就有思路了
我的<>又被過濾了,那就換一個試一下
這里好像是好了,但是我的onclick沒有顯示,那沒地方點啊,所以給后邊再加點東西
歐克,下一關
level 11 Referer信息
和上一關有點像,先試一下之前的辦法
?t_link=qqq&t_history=www&t_sort=eee&t_ref=rrr?
發現t_sort傳進來值了,那不就簡單了
這雙引號沒有閉合,沒能逃逸出來,這個辦法不行。那就在找找,回過頭來仔細一看,剛開始咱們的t_ref里邊是有值的啊,而且是咱們上一關的url,
那這個咱們能利用嗎?猜測ref又可能是http頭中的referer屬性
抓包嘗試修改一下
傳個值試一下?
這里將值真的傳進來了,那就試一下這個
referer:111" onclick ='javascript:alert(1)'// type=button
歐克了就
level 12 user-agent信息
到了t_ua這樣一個標簽,并且其中的value屬性的值怎么看起來那么
像抓取數據包中User-Agent頭的值?!
抓包嘗試修改
發現雙引號沒有被過濾,我們嘗試閉合引號構造事件彈窗
" onclick ='javascript:alert(1)'// type=button
level 13 cookie信息
還是四個隱藏框
t_cook可能是cookie
抓包仍然是相同的方式
發現雙引號沒有被過濾,我們嘗試閉合引號構造事件彈窗
level 14
自動跳轉到那個網址,但是失效了
level-14參考文章
level 15(ng-include包含)
后臺源碼:
window.alert = function() ?
{ ? ??
confirm("完成的不錯!");
?window.location.href="level16.php?keyword=test";?
}
</script>
<title>歡迎來到level15</title>
</head>
<h1 align=center>歡迎來到第15關,自己想個辦法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php?
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
觀察源碼發現短短的幾行,實體轉義了src的值
使用了ng-include這個表達式的意思是當HTML代碼過于復雜時,可以將部分代碼打包成獨立文件,在使用ng-include來引用這個獨立的HTML文件。
ng-include指令一般用于包含外部HTML文件,ng-include屬性的值可以是一個表達式,返回一個文件名,但是默認情況下,包含的文件需要包含在同一域名下,也就是要調用同一域名下的其他網頁。因為默認情況下,包含的文件需要包含在同一個域名下。很有可能這個指令就是突破口,我們看看源代碼,果然有ng-include,并且對其輸入做了過濾,所以我們可以包含一個有漏洞的頁面
定義和用法
ng-include 指令用于包含外部的 HTML 文件。
包含的內容將作為指定元素的子節點。
ng-include 屬性的值可以是一個表達式,返回一個文件名。
默認情況下,包含的文件需要包含在同一個域名下。
引用文件名要加單引號 即 ng-include=" 'index.html' "
所以可構造以下payload
去包含其他關卡的漏洞:
http://127.0.0.1/xsslabs/level15/.php?src='level1.php?name=<img src=1 οnerrοr=javascript:alert(1)>'
level 16 空格實體轉義?
源代碼:
<title>歡迎來到level16</title>
</head>
<body>
<h1 align=center>歡迎來到level16</h1>
<?php?
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace("?? ?"," ",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php?
echo "<h3 align=center>payload的長度:".strlen($str5)."</h3>";
?>
通過源碼發現,過濾了script,/,空格等(替換空格,script,/,再次替換空格)在html中是可以將%0a和%0d作為空格使用的
因為尖括號沒被過濾掉,所以我們就用<a>
標簽,因此我們構造語句
可對script進行個拆分
payload:
/level16.php?keyword=<a%0dhref='javas%0acript:alert(1)'>xss
level-17(參數拼接)
查看源代碼:
<title>歡迎來到level17</title>
</head>
<body>
<h1 align=center>歡迎來到level17</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
<h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>點我進入下一關</a></h2>
</body>
</html>
通過代碼發現,本關卡有兩個參數:arg01、arg02,當我們發送的時候,發現他們是會互相拼接起來的,那么我們就容易想到這里會不會就是突破口,發現這兩個參數是在embed上,embed標簽定義嵌入的內容,并且做了尖括號過濾,那么我們可以加入一個屬性進去,生成惡意代碼。(發現其兩個變量使用=符號拼接的形式被加入到<embed>標簽中,該標簽用于一些插件如flash等的插入,那這就是一個突破口)
HTML embed src 屬性 | 菜鳥教程
輸入點在url中,過濾了尖括號和雙引號,用on事件觸發。
常規加尖括號的語句會被轉為html實體字符,那就只有用事件觸發來寫,而且事件觸發剛好是用等號來連接。
使用on事件,但是沒有反應,后來發現是瀏覽器中不支持flash
payload:
/level17.php?arg01=a&arg02=b οnmοuseοver=javascript:alert(1)
或
/level17.php?arg01=a&arg02=b 666 οnmοuseοver=javascript:alert(1)
onmouseover(鼠標移動到上方觸發)觸發器來進行惡意語句利用
火狐不支持flash(火狐瀏覽器中,發現該組件根本不顯示,完全不給我們事件觸發的機會,無法利用了),嘗試沒有反應,切換瀏覽器,在edge上試一下
level-18(參數拼接)
這個和上一關有點像,我們看一下源代碼
</script>
<title>歡迎來到level18</title>
</head>
<body>
<h1 align=center>歡迎來到level18</h1>
<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>
</body>
</html>
通過代碼發現,和上一關基本差不多,我們繼續使用上一關的代碼進行測試,看是否彈窗
payload:
/level18.php?arg01=a&arg02=b οnmοuseοver=alert(1)
或
/level18.php?arg01=a&arg02=b ?8888 οnmοuseοver=alert(1)
level-19(Flash XSS)
后臺源碼:
<title>歡迎來到level19</title>
</head>
<body>
<h1 align=center>歡迎來到level19</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>
這關是flash xss,涉及到反編譯,暫時搞不懂
payload:
?arg01=version&arg02=<a href='javascript:alert(/xss/)'>xss</a>
level-20(Flash XSS)
后臺源碼:
<title>歡迎來到level20</title>
</head>
<body>
<h1 align=center>歡迎來到level20</h1>
<?php
ini_set("display_errors", 0);
echo '<embed src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>
</body>
</html>
觀察源碼發現,和上面19關差不多,就是插件不同。
payload:
?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//&width&height
四.總結:
幾種注入方式
- ?keyword=<script>alert('xss')</script>
- ?keyword='οnfοcus=javascript:alert('xss') >
- 當某些字符串被刪掉時,用雙寫繞過
- ?keyword="oonnfocus=javascrscriptipt:alert('xss') "
- ?keyword="> <a href=javascript:alert('xss') > xss</a>
- src錯的話,觸發onerror,然后處理alert
- ?name=<img src=111 οnerrοr=alert('xss')
- http前面必須要//,將后面的注釋掉
- ?keyword=javascript:alert('xss')//http://www.baidu.com
- ?t_sort=" type="text" οnclick="alert('xss')
- 不需要閉合的標簽`img`
- ?keyword=<img%0Dsrc=1%0Dοnerrοr=alert('xss')>
- b后面有空格,后面就相當于一個新的屬性
- ?arg01=a&arg02=b οnmοuseοver=alert(‘xss’)
on事件屬于點擊觸發事件
繞過的方法
1.img標簽src出錯時用onerror注入
2.將a標簽閉合,用script標簽進行注入
3.用onmoseover等焦事件可以實現繞過執行腳本,焦事件可以用到input標簽,a標簽中的href屬性,img標簽等標簽處。
4.可以嘗試將代碼進行unicode編碼等瀏覽器可以解析的編碼方式進行注入
5.可用轉義序列實現繞過,轉義序列是SGML類語言如xml、html中的中的一個設定,標志就是在一個數字前有 ”&#“ 這個字符后面可以跟十進制數或十六精進制,在構造語句時可以使用這種方法,從而實現繞過。
6.不只是轉義序列,當你碰到刪除空格的過濾時可以常識使用url編碼,用%0a換行
?收集信息的方法
<1>查看網頁源碼,留意源碼中常見存在注入的語句,并留意可以向服務器傳遞的參數
<2>向服務器傳遞參數,并判斷,哪些參數被用到了網頁上,并且初步記錄
<3>將用了傳遞參數的語句總結出來之后,將常見存在注入的語句挑出,并且對它們的閉合方式進行記錄
<4>對初步記錄進行分析,并總結結論,結論的標準是
我要在哪些語句上用哪些xss繞過方法進行注入
xss常見注入點
1.<input>
2.<script>
3.<embed>等
這些標簽都有一個特點就是都有src屬性,如果網頁可以發送form表單且其中的參數被用在了這些標簽的屬性中,那么我們注意閉合之后,加入onerror、onmouseover、onclick、onfocus等焦點之后觸發腳本內容。
4.<h1>、<h2>、<h3>、<h4>、<h5>、<h6>
5.<div>等
這些標簽的特點是只有對網頁顯示的編輯功能,或者說有分割網頁源碼文本的功能,如果網頁傳回去的參數有被用于這些標簽的參數,我們可以將完整的dom節點傳進去,因為一般這些標簽都有包含的功能。
參考
以xss-labs舉例反射型xss注入的方式及基本思路_span標簽xss-CSDN博客https://blog.csdn.net/m0_53061933/article/details/114755460nj.rs---Tiny XSS Payloads