HTML注入是一種漏洞,一種網路攻擊方式,當網頁無法清理使用者提供的輸入或驗證輸出時,攻擊者就可以偽造自己的有效負載,並透過易受攻擊的欄位將惡意HTML程式碼注入應用程序,從而修改網頁內容,甚至取得一些敏感資料。
本教學操作環境:windows7系統、HTML5版、Dell G3電腦。
HTML注入(Hypertext Markup Language Injection)中文意思是“超文本標記性語言注入”,眾所周知HTML含有各種標籤,如果Web應用程式對使用者輸入的資料沒進行徹底的處理的話,那麼一些非法用戶提交的數據可能含有HTML其他標籤,而這些數據又恰好被伺服器當作正常的HTML標籤顯示,那麼最終的結果是非法標籤被解析(可以應用於釣魚、社會工程學等) ,對其他用戶造成很大影響。
攻擊者可以偽造自己的有效負載,並透過易受攻擊的欄位將惡意HTML程式碼注入應用程序,從而修改網頁內容,甚至取得一些敏感資料。
XSS(Cross-site Scripting)中文翻譯是“跨站腳本攻擊”,XSS本質上是HTML注入攻擊,但又不同於HTML注入,XSS利用腳本標記運行JavaScript等腳本程序,可以透過JavaScript取得機密資料和一些欄位危險操作,而HTML注入只是使用HTML標籤修改頁面內容。
反射型HTML注入(GET方式)
First name填入html,Last name填入test,發現html字母變成紅色,表示我們寫入的html程式碼成功執行了,此網站存在html注入。
反射型HTML注入(POST方式)
#附註:GET方式提交資料後瀏覽器網址列會把提交的資料顯示出來,POST則不會顯示。
與上面GET方式一樣
Firstname填入
html2
,Last name填入test,發現html2字母變成綠色,說明我們寫入的html程式碼成功執行了,此網站存在html注入。
反射式HTML注入(Current URL)
#首先,我們分析下原始碼
核心程式碼
<div> <h1>HTML Injection - Reflected (URL)</h1> <?php echo "<p align=\"left\">Your current URL: <i>" . $url . "</i>";?> </div>
#這段程式碼中有一段PHP程式碼,執行html語句,輸出一段“Your current URL:”字符,並調用$url變量,將輸出的內容跟在後面。
防護程式碼
$url= ""; switch($_COOKIE["security_level"]) { case "0" : // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; //$url= ''接受的参数来自请求头HOST和URL break; case "1" : $url = "<script>document.write(document.URL)</script>"; break; case "2" : $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]); break; default : // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; break; } <select name="security_level"> <option value="0">low</option> <option value="1">medium</option> <option value="2">high</option> </select>
閱讀防禦程式碼可以了解到根據設定的難度不通,呼叫的防禦程式碼也不同。
將等級設為Low時,執行下面的語句
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
這裡的$_SERVER [「HTTP_HOST」]表示取得目前網域名稱
這裡的$_SERVER[「REQUEST_URI」]」是取得網域名稱後面的完整的位址路徑
透過burp抓包修改host參數,可以發現頁面上發生了變化
將等級設為medium時,執行下面的語句
$url = "<script>document.write(document.URL)</script>";
這裡的document物件代表整個HTML文檔,可用來存取頁面中的所有元素;
document.write()是動態向頁面寫入內容
document.URL是設定URL屬性從而在同一視窗開啟另一頁面
將等級當設定為high時,執行下面的語句
$url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
這裡呼叫了xss_check_3函數對host後面的部分進行了過濾處理,使得無法進行注入。
儲存型HTML注入
附註:反射型頁面刷新後就不存在了,而儲存型是寫入了伺服器資料庫,刷新後照樣存在。 HTML
因此,儲存型危害性大大大於反射型。
在文字域輸入
推薦教學:《html影片教學》
以上是什麼是html注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!