HTML注入-反射型GET
描述:HTML 注入漏洞是指在用户输入的地方,输入 HTML 文本,被当作 GET 参数传到服务器,服务器以原始格式存储,未采用 HTML 编码,导致 HTML 的特性被浏览器解析执行。这种编码必须在服务器端存储参数的时候进行。
low
当用户在输入框输入内容,后台对输入内容不做处理直接添加入页面的时候,用户就可以刻意填写HTML、JavaScript脚本来作为文本输入,这样这个页面就会出现一些用户加入的东西了
这里在文本框内输入内容,直接返回像是在网页页面,那么在文本框内输入HTML语句会产生什么效果
将语句
填入两个文本框后点击确定,可以发现welcome后面跟了两个超链接
查看他的网页源码会发现,我们写的HTML语句直接添加到了里面。
不过,如果退出账号重新登录,或退出该页面重新访问,这段代码就不在了,所以是一种反射型的注入。
看一看这个网页在服务器端的源代码,与前端不同的是,多了三段PHP代码。
第一段,用来判断当前题目的防护等级,即low、medium、high,并针对不同等级调用不同的防护代码,根据防护等级调用functions_external.php文件中的代码进行防护
1 php 2 include("security.php"); 3 include("security_level_check.php"); 4 include("functions_external.php"); 5 include("selections.php"); 6 7 function htmli($data) 8 { 9 switch($_COOKIE["security_level"]) 10 { 11 case "0" : 12 $data = no_check($data); 13 break; 14 15 case "1" : 16 $data = xss_check_1($data); 17 break; 18 19 case "2" : 20 $data = xss_check_3($data); 21 break; 22 23 default : 24 $data = no_check($data); 25 break; 26 } 27 return $data; 28 } 29 ?>
第二段,用来接收文本框中输入的内容,并返回显示至网页
首先判断文本框中是否有输入内容,若没有则返回红色字体的Please enter both fields...
如果有输入内容就将输入的内容跟在welcome后面输出到网页
php if(isset($_GET["firstname"]) && isset($_GET["lastname"])) { $firstname = $_GET["firstname"]; $lastname = $_GET["lastname"]; if($firstname == "" or $lastname == "") { echo "Please enter both fields..."; } else { echo "Welcome " . htmli($firstname) . " " . htmli($lastname); } } ?>
第三段,来确定当前属于题目表中的哪一个题目
php // Lists the options from the array 'bugs' (bugs.txt) 列出数组“bugs”(bugs.txt)中的选项 foreach ($bugs as $key => $value) { $bug = explode(",", trim($value)); // Debugging // echo "key: " . $key; // echo " value: " . $bug[0]; // echo " filename: " . $bug[1] . "
"; echo ""; } ?>
在防护代码中0防护(也就是low)下是没用任何防御手段的。
medium
改变防护等级,继续输入测试语句,发现他原样输出,并没有产生超链
我们抓包比较一下两种难度下的数据包
其中在返回的数据包中,有区别的地方如下:
Welcome <a href="https://www.cnblogs.com/Yuuki-/" >点击这里</a> <a href="https://www.cnblogs.com/Yuuki-/" >点击这里</a>
注意一下两个的区别,它将代码中的“<”和“>”进行了转义,转移为HTML实体编码。
通过对尖括号<>做编码处理,将尖括号<>进行两次url编码,即可成功绕过转义编码。
在这个难度模式下,调用了xss_check_1,我们找到该源码。在这里可以看到,他将输入的尖括号进行了替换,而如何绕过的方法也有在下面解释。
high
在高防护等级中,输入测试代码,还是直接回显出来,查看他的源码部分,发现也是对“<>”进行了转义处理
尝试进行URL编码后再测试
当防护等级调整到最高时,会调用xss_check_3
我们找到源码看看,他利用了php的高级转义函数htmlspecialchars,这种情况下就解决了这种注入问题。
但是如果开发人员把htmlspcialchars用在不当地方(如script标签中间),那这层防护就和没有一样。
HTML注入-反射型POST
与GET型最大的区别在于传输方式的不同
POST型
GET型
这两种的防御方式都一样,只是数据的传输方式不一样