bWAPP_HTML Injection

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述bWAPP_HTML Injection相关的知识,希望能为你提供帮助。
0x00:前言bWAPPweb安全靶场,html_Injection模块
0x01:HTML注入超文本标记语言(HTML)注入有时也被称为虚拟污染。  这实际上是一个由站点造成的攻击,该站点允许恶意用户向其 Web 页面注入 HTML,并且没有合理处理用户输入。 换句话说,HTML 注入漏洞是由接收 HTML 引起的,通常通过一些之后会呈现在页面的表单输入。
(1)HTML injection (get)_low1.1.1 输入两个名字,页面出现用户输入的东西
 

bWAPP_HTML Injection

文章图片

1.1.2网页地址为:
 
bWAPP_HTML Injection

文章图片

  更改参数,low等级的没有对输入的内容有任何检测
 
bWAPP_HTML Injection

文章图片

  结果:
 
bWAPP_HTML Injection

文章图片

  1.1.3 或者  firstname  改为  < a href=http://www.baidu.com> 点这里到百度< /a>
< a> 标签的href 属性规定链接的目标
 
bWAPP_HTML Injection

文章图片

结果:
 
bWAPP_HTML Injection

文章图片
 
 
firstname=< script> alert(document.cookie)< /script>     可以获取用户cookie
(2)HTML injection (get)_medium1.2.1  < h1> Hack< /h1> 无效
 
bWAPP_HTML Injection

文章图片

  应该对字符< > 或 / ,检测或过滤了,检测的方法:过滤、替换、编码解码,这里没有做替换,试一下编码解码
试一下URL encode(其他还有很多编码方式base64等)
urlencode("< h1> Hack< /h1> ")  --->    
 
bWAPP_HTML Injection

文章图片

  结果:没变,说明页面展示的时候,把我输入的内容URLdecode了
 
bWAPP_HTML Injection

文章图片

  那我们URLencode两次,他解码后就是一次URLencode的结果
 
bWAPP_HTML Injection

文章图片

  结果注入成功
 
bWAPP_HTML Injection

文章图片

  因为 只进行一次URLencode,浏览器会自动默认 把参数URLdecode一遍,所以和没编码没有区别,两次的话浏览器解码一次,页面展示的时候在解码一次
(2)HTML injection (get)_high......看一下源码吧
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); }

有一个htmlspecialchars()函数,百度一下
 
bWAPP_HTML Injection

文章图片

 
 
不会绕过~~~
知乎上有回答的https://www.zhihu.com/question/27646993,分不同场景,但是我都试过了还是不行
 
(2)HTML injection_post方法和get一样,只是post和get的区别
(3) HTML injection_current url代码审计:
switch($_COOKIE["security_level"]) { case "0" : // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; 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; }

< div id="main"> < h1> HTML Injection - Reflected (URL)< /h1> < ?php echo "< p align=\\"left\\"> Your current URL: < i> " . $url . "< /i> < /p> "; ?> < /div>

PHP超全局变量$_SERVER的作用:(引用https://www.cnblogs.com/zhao-/p/10994615.html)
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
  1. $_SERVER[\'HTTP_HOST\']    请求头信息中的Host内容,获取当前域名。
  2. $_SERVER["SERVER_NAME"]  输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同,但如果服务器端口不是默认的80端口,或者协议规范不是HTTP/1.1时,HTTP_HOST会包含这些信息,而SERVER_NAME不一定包含。(主要看配置文件的设置)。
  3. $_SERVER["HTTP_USER_AGENT"]  获取用户相关信息,包括用户浏览器、操作系统等信息。
  4. $_SERVER[\'HTTP_ACCEPT\']  当前请求的ACCEPT头部信息。
  5. $_SERVER["HTTP_ACCEPT_LANGUAGE"]  这个值是由浏览器发送,表明用户默认的语言设置,后面的q值表示用户对该语言的喜好程度。
  6. $_SERVER["HTTP_ACCEPT_ENCODING"]    大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。
  7. $_SERVER["HTTP_COOKIE"]  浏览器的cookie信息。
  8. $_SERVER["HTTP_CONNECTION"]  当前请求的连接情况。
  9. $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"]    表示浏览器可读懂服务器发过来的请求,
  10. $_SERVER["HTTP_CACHE_CONTROL"]  表示浏览器是否会缓存这个页面信息。
  11. $_SERVER["PATH"]    当前脚本所在文件系统。
  12. $_SERVER["SystemRoot"]  当前服务器的操作系统。
  13. $_SERVER["COMSPEC"]  指向cmd.exe的路径。
  14. $_SERVER["PATHEXT"]  环境变量设置。
  15. $_SERVER["WINDIR"]  脚本指向的系统目录。
  16. $_SERVER["SERVER_SIGNATURE"]  包含服务器版本和虚拟主机名的字符串。
  17. $_SERVER["SERVER_SOFTWARE"]  服务器软件配置信息。
  18. $_SERVER["SERVER_ADDR"]  当前运行脚本的服务器的ip地址。
  19. $_SERVER["SERVER_PORT"]  服务器端口。
  20. $_SERVER["REMOTE_ADDR"]  浏览网页的用户ip。
  21. $_SERVER["DOCUMENT_ROOT"]  当前运行脚本所在的根目录。
  22. $_SERVER["REQUEST_SCHEME"]  服务器通信协议,是http或https。
  23. $_SERVER["CONTEXT_PREFIX"]  前缀。
  24. $_SERVER["CONTEXT_DOCUMENT_ROOT"]  当前脚本所在的文档根目录。
  25. $_SERVER["SERVER_ADMIN"]  服务器管理员信息。
  26. $_SERVER["SCRIPT_FILENAME"]  当前执行脚本的绝对路径。
  27. $_SERVER ["REMOTE_PORT"]  用户连接到服务器时所使用的端口。
  28. $_SERVER["GATEWAY_INTERFACE"]  服务器使用的CGI规范的版本。
  29. $_SERVER["SERVER_PROTOCOL"]  请求页面时通信协议的名称和版本。
  30. $_SERVER["REQUEST_METHOD"]  请求提交数据的方式。
  31. $_SERVER["QUERY_STRING"]  服务器请求时?后面的参数。
  32. $_SERVER["REQUEST_URI"]  当前脚本路径,根目录之后的目录。
  33. $_SERVER["SCRIPT_NAME"]  当前脚本的路径。这在页面需要指向自己时非常有用。
  34. $_SERVER["PHP_SELF"]  当前正在执行脚本的文件名。
  35. $_SERVER["REQUEST_TIME"]  得到请求开始时的时间戳。
那么这里是获取Host和当前脚本路径,进行处理,然后在页面显示
low把Host改为Hack,实际的时候可以改为其他网址,或者把路径修改也可(前提是有那个脚本)
bWAPP_HTML Injection

文章图片

 
 
bWAPP_HTML Injection

文章图片

 
  mideummideum是document.write(document.URL) 
那只能对URL做手脚了
看别人说只有IE浏览器可以,看来以后要多注意IE浏览器额
bWAPP_HTML Injection

文章图片

 
  highhigh只对当前脚本路径  用了htmlspecialchars()函数,HTML编码技术,但是Host还是可以用low等级的方法
 
(4) HTML injection store low没有任何过滤
medium  试了一下简单的绕过无果,审计一下代码,存储型无非就是将输入的内容存储到数据库,在查询显示的过程
找到了关键代码
所有输入的内容都要经过sqli_check_3()处理一次
function htmli($data) { include("connect_i.php"); switch($_COOKIE["security_level"]) { case "0" : $data = https://www.songbingjia.com/android/sqli_check_3($link, $data); break; case"1" : $data = https://www.songbingjia.com/android/sqli_check_3($link, $data); // $data = xss_check_4($data); break; case"2" : $data = https://www.songbingjia.com/android/sqli_check_3($link, $data); // $data = xss_check_3($data); break; default : $data = sqli_check_3($link, $data); break; } return $data; }

这是 sqli_check_3()
function sqli_check_3($link, $data) { return mysqli_real_escape_string($link, $data); }

mysqli_real_escape_string()函数转义字符串中的特殊字符,比如中文等,详细这里https://www.runoob.com/php/func-mysqli-real-escape-string.html
 
while($row = $recordset-> fetch_object()) { if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2") { ?> < tr height="40"> < td align="center"> < ?php echo $row-> id; ?> < /td> < td> < ?php echo $row-> owner; ?> < /td> < td> < ?php echo $row-> date; ?> < /td> < td> < ?php echo xss_check_3($row-> entry); ?> < /td> //这里如果安全等级是 1 或 2 即 medium和high就经过xss_check_3()函数处理之后展示 < /tr> < ?php } else { ?> < tr height="40"> < td align="center"> < ?php echo $row-> id; ?> < /td> < td> < ?php echo $row-> owner; ?> < /td> < td> < ?php echo $row-> date; ?> < /td> < td> < ?php echo $row-> entry; ?> < /td> < /tr> < ?php } }

function xss_check_3($data, $encoding = "UTF-8") { // htmlspecialchars - converts special characters to HTML entities // \'& \' (ampersand) becomes \'& amp; \' // \'"\' (double quote) becomes \'& quot; \' when ENT_NOQUOTES is not set // "\'" (single quote) becomes \'& #039; \' (or & apos; ) only when ENT_QUOTES is set // \'< \' (less than) becomes \'& lt; \' // \'> \' (greater than) becomes \'& gt; \' return htmlspecialchars($data, ENT_QUOTES, $encoding); }

 
不知道怎么Hack,网上的全都是一摸一样的答案,难道不能Hack?
这个存储型的一般在Blog中出现(?)
0x02:总结有点像反射型XSS(一样的?)漏洞修复建议:过滤输入的数据,如<     >     \'    "    onclick  on***等;对数据编码,HTML实体编码  JS编码 
【bWAPP_HTML Injection】 

    推荐阅读