前言
bwapp靶场每一种类型都分为3种等级: Low, Medium, High
这边我就按照类型归类写, 方便查阅。
本文是HTML注入和iFrame注入,其他的本质都是HTML的改变。那么有人会问,XSS与HTML注入有啥区别呢?其实本质上都是没有区别的,改变前端代码,来攻击客户端,但是XSS可以理解为注入了富文本语言程序代码,而HTML注入只注入了超文本标记语言,不涉及富文本程序代码的问题。这里的iframe注入实际上就是一个阅读器,可以阅读通过协议加载的活服务器本地的文件。
话不多说, 直接lu靶场
0x01 HTML injection Reflected GET
分析网站:
Low
Low等级没有任何防护, 直接注入即可:
Medium
在Medium等级中, 继续进行注入的话, 会发现< >尖括号被转义成html实体了:
源码对input进行了url解码:
function xss_check_1($data)
{
// Converts only "<" and ">" to HTLM entities
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
// Failure is an option
// Bypasses double encoding attacks
// <script>alert(0)</script>
// %3Cscript%3Ealert%280%29%3C%2Fscript%3E
// %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
$input = urldecode($input);
return $input;
}
那么可以采用url编码来绕过:
%3cscript%3ealert(1)%3c/script%3e
注意, 在url中的参数注入不会被url编码成功..
High
源码看到, 利用了htmlspecialchars()函数进行html实体编码:
function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
- ENT_QUOTES - 编码双引号和单引号。
评估为安全。
0x02
分析
在post的请求中, 就不同于get型的直接url中的参数污染注入:
这就需要POST放包来注入, 剩余的方法和Get型一样, 不再赘述。
Low
Medium
注意, 要在输入框中输入才能被url解码
High
安全。
0x03
分析网页特定, 猜想是将网页的url在前端页面中显示出来:
Low
尝试在url后面加入参数, 判断是否存在注入点:
http://localhost:8080/bWAPP/htmli_current_url.php?id=1
成功, 然后注入script:
发现尖括号被编码成html实体了..
经过实验, 发现是由于注入的尖括号是在url中, 在发送到服务端之前url已经被url编码了, 而服务端又没有进行url解码, 这样导致尖括号的失效。
两种方法解决:
1. 用burp抓包, 修改参数:
2. 修改源代码, 增加url解码函数:
直接在url注入:
Medium
和Low等级一样, 由于url中传参会自动url编码, 而服务端又没有进行对应的url解码,
直接用burp抓包修改即可:
查看源码, 他是用js脚本执行document.write来写入url的:
High
high级别用了htmlspecialchars()函数, 安全:
0x04 HTML Injection - Stored (Blog)
Low
分析:
这里的记录生成(添加)类似与DOM型的XSS:
在Low级别没有任何防护, 直接注入js即可:
Medium&High
Medium和High级别一样, 都使用了mysqli_real_escape_string()来将特殊字符转义, (比如单双引号, 尖括号, 括号等等)
- 拓展----mysql_escape_string()函数
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00, \n, \r, \, ', ", \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
如果是sql注入还可以利用宽字节等方法绕过, 但html注入就无法注入了。
0x05 iFrame Injection
在这里可以成为阅读器(www目录下所有静态文件的阅读器)和跳转和一个可以诱导客户访问某站点的一个点,利用:大小size设置为0时可以理解为无交互的刷访问、前端挖矿、挂黑链、诱导下载等等。
Low
利用的方法有很多, 观察有一个可控的参数ParemUrl
- 文件包含+目录穿越
将ParamUrl参数指向服务器的其他文件, 即可实现目录穿越的文件读取:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=../README.txt&ParamWidth=800&ParamHeight=800
- XSS攻击
观察ParemUrl参数值别写入HTML源码中, 这里直接利用闭合或添加属性了实现XSS:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=" onload="alert(1)&ParamWidth=800&ParamHeight=800 // 闭合注入xss
http://localhost:8080/bWAPP/iframei.php?ParamUrl=javascript:alert(111)&ParamWidth=800&ParamHeight=800 // JavaScript伪协议
- url跳转
这里演示一个url跳转, 也可以尝试远程文件包含:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=http://www.xiaodi8.com&ParamWidth=800&ParamHeight=800
Medium
在Medium级别中, 做看一些防护:
这里对ParamUrl写死了, 且双引号前面加了反斜杠做了转义, 那么可以试试ParamWidth还能否闭合:
于是嚣张的注入:
http://localhost:8080/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=800" onload=alert(document.cookie) //&ParamHeight=800
Do NOT use addslashes() for XSS or HTML validations!!
High
用了htmlspecialchars()转化为HTML实体, 安全: