什么是Injection?php
injection,中文意思就是注入的意思,常见的注入漏洞就是SQL注入啦,是如今应用最普遍,杀伤力很大的漏洞。html
什么是HTML injection?前端
有交互才会产生漏洞,不管交互是怎么进行的。交互就是网页有对后台数据库的读取或前端的动态效果。HTML文件并非像你们想的那样没有任何交互,在HTML文件里仍是会用到一些JavaScript来完成本身须要的一些动态效果,例如,地址栏的参数就是location,用户所作的点击触发事件,以及一些动态的DOM交互都会影响到JavaScript的执行致使漏洞的产生。web
若是HTML文件能够被injection的话,那么就能够利用本地的HTML文件在本地域内执行JavaScript代码,权限是很是高的。数据库
平台简介:cookie
bWAPP:漏洞平台,开源web应用less
漏洞利用:xss
页面函数
咱们能够看到这是一个Form提交表单的页面,而且是get请求方法。源码分析
咱们提交一些信息看看
提交后能够看到,咱们提交的信息在页面上显示。而且也在地址栏里面看到咱们的信息,这是get请求的一个特征。
A:Low级别(未进行任何过滤)
A-1:增长外链,影响SEO,提高外链的PR
PAYLOAD:http://127.0.0.1/htmli_get.php?firstname=<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>&lastname=ESHLkangi&form=submit
效果:
A-2:反射性xss漏洞,进一步能够伪造存在xss漏洞的恶意网址执行本身DIY的ji代码,从而搜集到其余人的信息。
PAYLOAD:http://118.89.17.134/htmli_get.php?firstname=<script>alert(document.cookie)</script>&lastname=ESHLkangi&form=submit
效果:
盗取了cookie。
源码分析:
HTML:
1 <form action="/htmli_get.php" method="GET"> 2 3 <p> 4 <label for="firstname">First name:</label><br> 5 <input id="firstname" name="firstname" type="text"> 6 </p> 7 8 <p> 9 <label for="lastname">Last name:</label><br> 10 <input id="lastname" name="lastname" type="text"> 11 </p> 12 13 <button type="submit" name="form" value="submit">Go</button> 14 15 </form>
对应的PHP代码:
1 <?php 2 if(isset($_GET["firstname"]) && isset($_GET["lastname"])) 3 { 4 $firstname = $_GET["firstname"]; 5 $lastname = $_GET["lastname"]; 6 if($firstname == "" or $lastname == "") 7 { 8 echo "<font color=\"red\">Please enter both fields...</font>"; 9 } 10 11 else 12 { 13 echo "Welcome " . $firstname . " --- " . $lastname; 14 } 15 } 16 ?>
分析:
在表单提交的时候没有对用户输入的数据进行处理,而且在PHP代码中echo的时候没有处理就打印到页面,当咱们在文本框中输入相似代码:
<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>
那展现到页面的结果将会是一个能够跳转页面的超连接,一样咱们也能够获取cookie。
B:Medium级别(初级的字符处理)
测试
发现,超连接没有实现
cookie也盗取不了。
源码分析:
HTML:
不变
PHP:
1 function xss_check_1($data) 2 { 3 // Converts only "<" and ">" to HTLM entities 4 $input = str_replace("<", "<", $data); 5 $input = str_replace(">", ">", $input); 6 // Failure is an option^M 7 // Bypasses double encoding attacks 8 // <script>alert(0)</script> 9 // %3Cscript%3Ealert%280%29%3C%2Fscript%3E^M 10 // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E^M 11 $input = urldecode($input); 12 13 return $input; 14 15 }
经过源码,咱们能够看到,开始使用了str_replace()函数过滤"<"和">"这两个特殊字符处理了,最后,用了urldecode()函数进行解码,把URL编码还原字符串。
POC:
依据代码的思路,咱们能够先对"<"、">"进行urlencode,绕过str_replace()函数的过滤便可。建议把全部特殊的符号都进行编码,例如"=","/"等
<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>
进行urlencode后
%3Ca href="http://www.cnblogs.com/ESHLkangi/"%3EESHLkangi%3C/a%3E
把编码后的输入到文本框内
成功绕过!!!
C:High级别(htmlspecialchars)
直接查看源码,进行一下审计
后台源码:
1 function xss_check_3($data, $encoding = "UTF-8") 2 { 3 4 // htmlspecialchars - converts special characters to HTML entities 5 // '&' (ampersand) becomes '&' 6 // '"' (double quote) becomes '"' when ENT_NOQUOTES is not set 7 // "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set 8 // '<' (less than) becomes '<' 9 // '>' (greater than) becomes '>' 10 11 return htmlspecialchars($data, ENT_QUOTES, $encoding); 12 13 }
发现代码中用了一个htmlspecialchars()函数。简单分析一下这个函数:
htmlspecialchars() 函数把预约义的字符转换为 HTML 实体。
预约义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为>
它的语法以下:
htmlspecialchars(string,flags,character-set,double_encode)
其中第二个参数flags须要重要注意,不少开发者就是由于没有注意到这个参数致使使用htmlspecialchars()函数过滤XSS时被绕过。由于flags参数对于引号的编码以下:
可用的引号类型:
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
能够看到的是咱们这里是使用了ENT_QUOTES 编码的,把单引号也过滤了。
技术尚菜,想实现绕过有点困难,如今只能这样了。。。
知乎上有些解答,能够参考https://www.zhihu.com/question/27646993