HTML注入-反射型URLphp
查看服务器端源代码时,其中重点关注的有两处html
1 <div id="main"> 2 3 <h1>HTML Injection - Reflected (URL)</h1> 4 5 <?php echo "<p align=\"left\">Your current URL: <i>" . $url . "</i></p>";?> 6 7 </div>
这段代码中有一段PHP代码,执行html语句,输出一段“Your current URL:”字符,在文本中左对齐,并调用$url变量,将输出的内容跟在后面。服务器
防护代码:xss
1 <?php 2 include("security.php"); 3 include("security_level_check.php"); 4 include("functions_external.php"); 5 include("selections.php"); 6 7 $url= ""; 8 switch($_COOKIE["security_level"]) 9 { 10 case "0" : 11 // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); 12 $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; 13 break; 14 case "1" : 15 $url = "<script>document.write(document.URL)</script>"; 16 break; 17 case "2" : 18 $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]); 19 break; 20 default : 21 // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); 22 $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; 23 break; 24 } 25 ?>
1 <select name="security_level"> 2 3 <option value="0">low</option> 4 <option value="1">medium</option> 5 <option value="2">high</option> 6 7 </select>
阅读防护代码能够了解到根据设置的难度不一样,调用的防护代码与不一样。函数
当将等级设置为low时,执行url
$url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];spa
其中“$_SERVER["HTTP_HOST"]”表示获取当前域名,与之功能类似的还有一个是$_SERVER['SERVER_NAME']3d
当知足如下3个条件的时候,二者会输出相同的信息
A、服务器端口号为80
B、Apache中的conf中的ServerName设置正确
C、HTTP/1.1协议规范
不一样点
A、$_SERVER['HTTP_HOST']:在HTTP/1.1协议下,会根据客户端的HTTP请求输出信息;
$_SERVER['SERVER_NAME']:默认状况下会直接输出Apache的配置文件httpd.conf中的ServerName的值
B、当服务器的端口号不是80时
$_SERVER['HTTP_HOST']会输出端口号,例如“www.funwall.cn:8080”
$_SERVER['SERVER_NAME']直接输出ServerName的值,例如“www.funwall.cn”
在这种状况下,能够理解成HTTP_HOST = SERVER_NAME:SERVRE_PORT
C、当配置文件httpd.conf中的ServerName与HTTP/1.0下的域名不一致的时候,假如httpd.conf配置以下:
<virtualhost *>
ServerName funwall.cn
ServerAlias www.funwall.cn
</virtualhost>
客户端访问域名:www.funwall.cn
$_SERVER[HTTP_HOST]输出:www.funwall.cn
$_SERVER[SERVER_NAME]输出:funwall.cn
所以,在实际中应该用$_SERVER[HTTP_HOST]获取域名比较保险。code
而“$_SERVER["REQUEST_URI"]”是获取域名后面的完整的地址路径。htm
在level low下,经过抓包改包,修改host参数,能够发现主页上回显会有相应的改变。
当将等级设置为medium时,执行
$url = "<script>document.write(document.URL)</script>";
这里document对象 -- 表明整个HTML 文档,可用来访问页面中的全部元素;
document.URL是 设置URL属性从而在同一窗口打开另外一网页;
document.write() 是动态向页面写入内容。
此时再经过前面的方式抓包改包,已经不起做用了。
在low和medium等级下,是没有作任何防御的,都是直接获取url而后将其直接输出,能够在链接中添加代码实现弹框,这里是ie禁用了部分js脚本,致使了弹框失败。
在high等级下,执行
$url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
其中调用了xss_check_3函数对host后面的部分进行了过滤处理,使得没法进行注入。