XSS又叫跨站腳本攻擊,是一種對網站應用程序的安全漏洞攻擊技術。它容許惡意用戶將代碼注入網頁,其餘用戶在瀏覽網頁時就會受到影響。XSS分爲三種:反射型,存儲型,和DOM型。下面我會構造有缺陷的代碼,從代碼分析這三種類型。
若是想要了解XSS基礎的能夠看個人這篇文章:XSS(跨站腳本攻擊)簡單講解
若是想要了解SQL注入原理的能夠看個人這兩篇文章:SQL注入原理及代碼分析(一)
SQL注入原理及代碼分析(二)
參考文獻:《Web安全攻防》javascript
反射型XSS又叫非持久型XSS,這種攻擊方式每每具備一次性。
先看代碼php
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <title>xss利用輸出的環境構造代碼</title> </head> <body> <center> <h6>把輸入的字符串輸出</h6> <form action="#" method="get"> <h6>請輸入</h6> <input type="text" name="xss" value="請輸入"><br /> <input type="submit" value="肯定"> </form> <hr> <?php if (isset($_GET['xss'])) { echo '<input type="text" value="'.$_GET['xss'].'">'; }else{ echo '<input type="text" value="輸出">'; } ?> </center> </body> </html>
在代碼中,經過GET獲取參數xss的值,而後經過echo輸出一個input標籤,並將xss的值放入input標籤的value中。
接下來咱們看一下頁面,例如咱們輸入123,會在下面的輸出框中輸出123。
那麼下面,咱們當咱們輸入"><script>alert(1)</script>
時,輸出到頁面的HTML代碼變爲<input type="text" value=""><script>alert(1)</script>">
咱們發現,輸入的雙引號閉合了value屬性的雙引號,輸入的>閉合了input的標籤<,致使咱們後面輸入的惡意代碼成爲另外一個HTML標籤。
當瀏覽器渲染時執行了,JS函數alert()致使瀏覽器彈窗。
html
先看代碼,參考dvwa的核心代碼。java
<?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>' ); } ?>
在上面代碼中,獲取POST參數mtxMessage和txtName,而後將將參數插入到數據庫的表中,並顯示到頁面上。
頁面的功能是獲取用戶名字和內容並插入到數據庫中,若是咱們輸入惡意代碼,那麼也會插入到數據庫中,只有用戶訪問這個頁面,那麼惡意代碼就會執行。
打開數據庫發現插入了咱們構造的惡意代碼。
mysql
先看代碼web
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" />; <title>測試</title> <script type="text/javascript"> function tihuan() { document.getElementById("id1").innerHTML =document.getElementById("dom_input").value; } </script> </head> <body> <center> <h6 id="id1">這裏顯示輸入的內容</h6> <form action="#" method="post"> <input type="text" id="dom_input" value="輸入"><br /> <input type="button" value="替換" onclick="tihuan()"> </form> <hr> </center> </body> </html>
DOM型XSS程序只有HTML代碼,並不存在服務端代碼,因此此程序並無與服務端進行交互。程序存在JS函數tihuan(),該函數得做用是經過DOM操做將元素id1得內容修改成元素dom_input的內容。
這個頁面得功能是輸入框中輸入什麼,上面得文字就會被替換成什麼。
若是咱們輸入惡意代碼,好比,單擊替換按鈕,頁面彈出消息框,因爲隱式輸出,因此查看源代碼時是看不到XSS代碼的。
sql