DVWA--XSS(stored)

XSS

0X01

一、簡介

跨站腳本(cross site script)爲了不與樣式css混淆,因此簡稱爲XSS。javascript

XSS是一種常常出如今web應用中的計算機安全漏洞,也是web中最主流的攻擊方式。那麼什麼是XSS呢?php

XSS是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去。使別的用戶訪問都會執行相應的嵌入代碼。css

從而盜取用戶資料、利用用戶身份進行某種動做或者對訪問者進行病毒侵害的一種攻擊方式。html

XSS攻擊的危害包括:前端

一、盜取各種用戶賬號,如機器登陸賬號、用戶網銀賬號、各種管理員賬號java

二、控制企業數據,包括讀取、篡改、添加、刪除企業敏感數據的能力mysql

三、盜竊企業重要的具備商業價值的資料web

四、非法轉帳正則表達式

五、強制發送電子郵件sql

六、網站掛馬

七、控制受害者機器向其它網站發起攻擊

首先咱們先來了解一下什麼叫XSS XSS原名CSS 因與htmlcss框架同名 因此後來更名爲XSS

二、緣由解析

主要緣由:過於信任客戶端提交的數據!

解決辦法:不信任任何客戶端提交的數據,只要是客戶端提交的數據就應該先進行相應的過濾處理而後方可進行下一步的操做。

進一步分析細節:

  客戶端提交的數據原本就是應用所須要的,可是惡意攻擊者利用網站對客戶端提交數據的信任,在數據中插入一些符號以及javascript代碼,那麼這些數據將會成爲應用代碼中的一部分了。那麼攻擊者就能夠肆無忌憚地展開攻擊啦。

  所以咱們絕不能夠信任任何客戶端提交的數據!!!

那麼咱們今天講的storedXSS是什麼類型的吶?

又稱爲持久型跨站點腳本,它通常發生在XSS攻擊向量(通常指XSS攻擊代碼)存儲在網站數據庫,當一個頁面被用戶打開的時候執行。每當用戶打開瀏覽器,腳本執行。持久的XSS相比非持久性XSS攻擊危害性更大,由於每當用戶打開頁面,查看內容時腳本將自動執行。谷歌的orkut曾經就遭受到XSS。

簡單例子:

從名字就可瞭解到存儲型XSS攻擊就是將攻擊代碼存入數據庫中,而後客戶端打開時就執行這些攻擊代碼。例如留言板

留言板表單中的表單域:<input type=「text」 name=「content」 value=「這裏是用戶填寫的數據」>

正常操做:

用戶是提交相應留言信息;將數據存儲到數據庫;其餘用戶訪問留言板,應用去數據並顯示。

非正常操做:

攻擊者在value填寫<script>alert(‘foolish!’)</script>【或者html其餘標籤(破壞樣式。。。)、一段攻擊型代碼】;

將數據存儲到數據庫中;

其餘用戶取出數據顯示的時候,將會執行這些攻擊性代碼

0X02

LOW.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();
}

?>

相關函數的介紹http://www.w3school.com.cn

https://www.runoob.com/

trim函數移除字符串兩側的空白字符或其餘預約義字符,預約義字符包括、\t、\n、\x0B、\r以及空格,可選參數charlist支持添加額外須要刪除的字符。
mysqli_real_escape_string對字符串特殊符號(\x00,\n,\r,\,‘,「,\x1a)等進行轉義。
stripslashes函數刪除字符串中的反斜槓。\
htmlspecialchars把預約義的字符 "<" (小於)和 ">" (大於)轉換爲 HTML 實體:
<!DOCTYPE html>
<html>
<body>
This is some <b>bold</b> text.
</body>
</html>
以上代碼的瀏覽器輸出:

This is some <b>bold</b> text.
PDO::prepare — 準備要執行的SQL語句並返回一個 PDOStatement 對象(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 

好了 那咱們大概來說一下這些函數的做用

未對輸入數據進行xss檢測編碼,直接寫入到數據庫中,存在存儲型xss漏洞。

如下是測試代碼

https://www.cnblogs.com/baocheng/p/4919691.html

 

這裏前端元素對錶單提交的name進行了過濾  咱們這裏能夠用burpsuite繞過

具體繞過方法

 

 

0X03愛之深刻了解Medium級別

OK 咱們來看看源碼 多了些什麼東西

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $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)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $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();
}

?>

相關的函數介紹

教程來自 http://www.w3school.com.cn/

strip_tags()函數剝去字符串中的HTML、XML以及PHP的標籤,但容許使用<b>標籤
PHP addslashes() 函數

addslashes() 函數返回在預約義字符以前添加反斜槓的字符串。

 
 

預約義字符是:

 
 
  • 單引號(')
  • 雙引號(")
  • 反斜槓(\)
  • NULL
<?php
$str = addslashes('Shanghai is the "biggest" city in China.');
echo($str);
?>

 

PHP htmlspecialchars() 函數  http://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

這裏由於message裏面有htmlspecialchars函數  因此沒法經過message函數進行XSS注入 只有從name處進行

注入 可是name只是簡單過濾了 <script>字符串

構造語句

<<script>alert("XSS")</script>

 

 成功繞過

0X04愛之究極撫摸High

首先來看看源代碼

 <?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $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)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $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();
}

?>

 

能夠看見這裏用正則表達式過濾了<script>標籤 可是卻忽略了imgiframe等其它危險的標籤,所以name參數依舊存在存儲型XSS

展開咱們的攻擊吧

 

 

 

成功繞過

0X05愛的總結

這裏XSS固然只是只有繞過 方法 具體利用方法可沒有這麼簡單啊吶

具體的利用方法下次寫的詳細點吧 😃

少就是多 慢就是快

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息