背景
這里講解HTML注入和iFrame注入,其他的本質都是HTML的改變。那么有人會問,XSS與HTML注入有啥區別呢?其實本質上都是沒有區別的,改變前端代碼,來攻擊客戶端,但是XSS可以理解為注入了富文本語言程序代碼,而HTML注入只注入了超文本標記語言,不涉及富文本程序代碼的問題。這里的iframe注入實際上就是一個閱讀器,可以閱讀通過協議加載的活服務器本地的文件。
HTML注入
在這里不在區分GET和POST,沒有任何意義,只看一下反射和存儲。
沒有防御--簡單級


一般防御--中等級
直接編碼就可以繞過,不編碼會被轉義成HTML實體字符


完善防御--高等級
安全
代碼分析
function htmli($data)
{
switch($_COOKIE["security_level"])
{
case "0" :
$data = no_check($data);
break;
case "1" :
$data = xss_check_1($data);
break;
case "2" :
$data = xss_check_3($data);
break;
default :
$data = no_check($data);
break;;
}
return $data;
}
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
$input = urldecode($input);
return $input;
}
function xss_check_2($data)
{
// htmlentities - converts all applicable characters to HTML entities
return htmlentities($data, ENT_QUOTES);
}
function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
// '&' (ampersand) becomes '&'
// '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
// "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
// '<' (less than) becomes '<'
// '>' (greater than) becomes '>'
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
function xss_check_4($data)
{
// addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
// These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
// Do NOT use this for XSS or HTML validations!!!
return addslashes($data);
}
函數xss_check_1只過濾<>轉移為HTML實體,但是對編碼的解碼放在了后面,如果把編碼解碼放前面呢就可以也過濾了,我們來試試。
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = urldecode($input);
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
//$input = urldecode($input);
return $input;
}


xss_check_3這個函數則使用了htmlspecialchars函數能轉移編碼后的實體,他的作用很大,能很好的防御這類攻擊。而存儲型的在中級和高級難度中都使用了這個函數,所以只有初級才可以把存儲的信息直接輸出到頁面。
iFrame 注入
在這里可以成為閱讀器(www目錄下所有靜態文件的閱讀器)和跳轉和一個可以誘導客戶訪問某站點的一個點,利用:大小size設置為0時可以理解為無交互的刷訪問、前端挖礦、掛黑鏈、誘導下載等等。
現象


代碼分析:
<?php
if($_COOKIE["security_level"] == "1" || $_COOKIE["security_level"] == "2")
{
?>
<iframe frameborder="0" src="robots.txt" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php
}
else
{
?>
<iframe frameborder="0" src="<?php echo xss($_GET["ParamUrl"])?>" height="<?php echo xss($_GET["ParamHeight"])?>" width="<?php echo xss($_GET["ParamWidth"])?>"></iframe>
<?php
}
?>
可以看到,當最低級的事后iframe位置可控,中高級則寫死,不可控,則無法利用。又因為height和width兩個參數,想構造XSS需要閉合",在xss_check_3過濾了",所以高級沒戲,中、低級的確實可以。



