0x00:前言
bWAPPweb安全靶场,HTML_Injection模块
0x01:HTML注入
超文本标记语言(HTML)注入有时也被称为虚拟污染。 这实际上是一个由站点造成的攻击,该站点允许恶意用户向其 Web 页面注入 HTML,并且没有合理处理用户输入。 换句话说,HTML 注入漏洞是由接收 HTML 引起的,通常通过一些之后会呈现在页面的表单输入。
(1)HTML injection (get)_low
1.1.1 输入两个名字,页面出现用户输入的东西
1.1.2网页地址为:
更改参数,low等级的没有对输入的内容有任何检测
结果:
1.1.3 或者 firstname 改为 <a href=http://www.baidu.com>点这里到百度</a>
<a>标签的href 属性规定链接的目标
结果:
firstname=<script>alert(document.cookie)</script> 可以获取用户cookie
(2)HTML injection (get)_medium
1.2.1 <h1>Hack</h1>无效
应该对字符<>或 / ,检测或过滤了,检测的方法:过滤、替换、编码解码,这里没有做替换,试一下编码解码
试一下URL encode(其他还有很多编码方式base64等)
urlencode("<h1>Hack</h1>") --->
结果:没变,说明页面展示的时候,把我输入的内容URLdecode了
那我们URLencode两次,他解码后就是一次URLencode的结果
结果注入成功
因为 只进行一次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()函数,百度一下
不会绕过~~~
知乎上有回答的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 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
- $_SERVER['HTTP_HOST'] 请求头信息中的Host内容,获取当前域名。
- $_SERVER["SERVER_NAME"] 输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同,但如果服务器端口不是默认的80端口,或者协议规范不是HTTP/1.1时,HTTP_HOST会包含这些信息,而SERVER_NAME不一定包含。(主要看配置文件的设置)。
- $_SERVER["HTTP_USER_AGENT"] 获取用户相关信息,包括用户浏览器、操作系统等信息。
- $_SERVER['HTTP_ACCEPT'] 当前请求的ACCEPT头部信息。
- $_SERVER["HTTP_ACCEPT_LANGUAGE"] 这个值是由浏览器发送,表明用户默认的语言设置,后面的q值表示用户对该语言的喜好程度。
- $_SERVER["HTTP_ACCEPT_ENCODING"] 大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。
- $_SERVER["HTTP_COOKIE"] 浏览器的cookie信息。
- $_SERVER["HTTP_CONNECTION"] 当前请求的连接情况。
- $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"] 表示浏览器可读懂服务器发过来的请求,
- $_SERVER["HTTP_CACHE_CONTROL"] 表示浏览器是否会缓存这个页面信息。
- $_SERVER["PATH"] 当前脚本所在文件系统。
- $_SERVER["SystemRoot"] 当前服务器的操作系统。
- $_SERVER["COMSPEC"] 指向cmd.exe的路径。
- $_SERVER["PATHEXT"] 环境变量设置。
- $_SERVER["WINDIR"] 脚本指向的系统目录。
- $_SERVER["SERVER_SIGNATURE"] 包含服务器版本和虚拟主机名的字符串。
- $_SERVER["SERVER_SOFTWARE"] 服务器软件配置信息。
- $_SERVER["SERVER_ADDR"] 当前运行脚本的服务器的ip地址。
- $_SERVER["SERVER_PORT"] 服务器端口。
- $_SERVER["REMOTE_ADDR"] 浏览网页的用户ip。
- $_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的根目录。
- $_SERVER["REQUEST_SCHEME"] 服务器通信协议,是http或https。
- $_SERVER["CONTEXT_PREFIX"] 前缀。
- $_SERVER["CONTEXT_DOCUMENT_ROOT"] 当前脚本所在的文档根目录。
- $_SERVER["SERVER_ADMIN"] 服务器管理员信息。
- $_SERVER["SCRIPT_FILENAME"] 当前执行脚本的绝对路径。
- $_SERVER ["REMOTE_PORT"] 用户连接到服务器时所使用的端口。
- $_SERVER["GATEWAY_INTERFACE"] 服务器使用的CGI规范的版本。
- $_SERVER["SERVER_PROTOCOL"] 请求页面时通信协议的名称和版本。
- $_SERVER["REQUEST_METHOD"] 请求提交数据的方式。
- $_SERVER["QUERY_STRING"] 服务器请求时?后面的参数。
- $_SERVER["REQUEST_URI"] 当前脚本路径,根目录之后的目录。
- $_SERVER["SCRIPT_NAME"] 当前脚本的路径。这在页面需要指向自己时非常有用。
- $_SERVER["PHP_SELF"] 当前正在执行脚本的文件名。
- $_SERVER["REQUEST_TIME"] 得到请求开始时的时间戳。
那么这里是获取Host和当前脚本路径,进行处理,然后在页面显示
low
把Host改为Hack,实际的时候可以改为其他网址,或者把路径修改也可(前提是有那个脚本)
mideum
mideum是document.write(document.URL)
那只能对URL做手脚了
看别人说只有IE浏览器可以,看来以后要多注意IE浏览器额
high
high只对当前脚本路径 用了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 = sqli_check_3($link, $data); break; case "1" : $data = sqli_check_3($link, $data); // $data = xss_check_4($data); break; case "2" : $data = 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 '&' // '"' (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); }
不知道怎么Hack,网上的全都是一摸一样的答案,难道不能Hack?
这个存储型的一般在Blog中出现(?)
0x02:总结
有点像反射型XSS(一样的?)漏洞修复建议:过滤输入的数据,如< > ' " onclick on***等;对数据编码,HTML实体编码 JS编码