不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述bWAPP_HTML Injection相关的知识,希望能为你提供帮助。
0x00:前言bWAPPweb安全靶场,html_Injection模块
0x01:HTML注入超文本标记语言(HTML)注入有时也被称为虚拟污染。
这实际上是一个由站点造成的攻击,该站点允许恶意用户向其 Web 页面注入 HTML,并且没有合理处理用户输入。 换句话说,HTML 注入漏洞是由接收 HTML 引起的,通常通过一些之后会呈现在页面的表单输入。
(1)HTML injection (get)_low1.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)_medium1.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"] 得到请求开始时的时间戳。
low把Host改为Hack,实际的时候可以改为其他网址,或者把路径修改也可(前提是有那个脚本)
文章图片
文章图片
mideummideum是document.write(document.URL)
那只能对URL做手脚了
看别人说只有IE浏览器可以,看来以后要多注意IE浏览器额
文章图片
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】
推荐阅读
- Android开发之记账本开发第六天
- Android UI常用组件
- 家庭记账本安卓版开发(第五天)
- Unity 导出到Android Studio 打包流程
- 安卓手机微信自带浏览器点击事件失效解决
- Microsoft launches Open Application Model (OAM) and Dapr to ease developments in Kubernetes and micr
- create-react-app搭配react16+ts+less
- EACCES(在CentOS/RHEL 7上的权限被拒绝-已修复)
- 用于生产JAVA应用程序系统的10个重要JVM选项