-
-
[原创]dwva靶场-- xss
-
发表于: 4天前 458
-
xss
DOM型
有过滤,出现<script 就重定向到English

f12一下
</option></select><body onload=alert(1)>
先闭合option标签,再闭合select标签,再利用一个非<script>标签,如
<img src=1 onerror=alert(1)>,<body onload=alert(1)>,
如果设置了白名单,如
利用DOM特性,default=French #<script>alert(1)</script> (注意#前要有空格)
流程如下:
1.浏览器发送请求,用户访问的 URL 是:220K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8Y4k6#2L8r3&6W2M7X3q4T1K9h3I4A6N6r3W2W2M7#2)9J5c8Y4S2K6M7#2)9#2k6X3c8Q4x3V1k6Q4x3@1k6V1k6h3k6S2N6h3I4@1i4K6y4p5c8Y4u0W2L8X3y4Z5 #<script>alert(1)</script>
浏览器只将?default=French发送给服务器(#后的内容被丢弃)。服务器收到 default=French,该值在白名单中,因此正常返回页面。
2.浏览器接收页面并解析,服务器返回的html中包含一段javascript代码如下
3.javascript读取 location.href,此时 location.href 的值是 #<script>alert(1)</script>,因此 lang 被赋值为 <script>alert(1)</script>
4.document.write 将恶意内容写入DOM,document.write 直接将字符串写入页面,其中的 <script>alert(1)</script> 被浏览器当作html解析,于是弹出对话框
反射型
有过滤,如
1. 使用非script标签
2. script大小写绕过

使用其他标签
存储型
在message字段做了严格过滤
// Sanitize message input
$message = strip_tags( addslashes( $message ) ); // 第一层:剥离标签
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : "")); // 第二层:数据库转义
$message = htmlspecialchars( $message ); // 第三层:HTML实体编码(主要)
由于message是在html标签体中,要注入只能通过新建标签,htmlspecialchars()把路给锁死了
所以只能在name字段进行注入
// Sanitize name input
$name = str_replace( '<script>', '', $name );
总结一下思路
先知道输入在哪儿,才能知道用什么payload
先输入hahaha,打开f12检索hahaha在哪
1. 在标签体中,只能通过创建新的标签实现注入
2. 在html属性中,如在 <input type="text" value="hahaha">
那就通过先闭合value=",再闭合<,然后再新建标签,如"><script>alert(1)</script>
标签就变成了<input type="text" value=""><script>alert(1)</script>">
也可以不新建标签,新建事件处理器,如" onclick="alert(1)
标签变为<input type="text" value="" onclick="alert(1)">
或者在 <a href="hahaha">文本</a>
通过闭合再构造新标签仍然可以,但此时利用href可以执行javascript代码的属性
如<a href="javascript:alert(1)">
3.在在 <script> 标签内部,如
<script>
var username = "hahaha";
</script>
闭合后alert(1)再加个注释
impossible
代码核心防护机制分析:
htmlspecialchars
$name = htmlspecialchars( $_GET[ 'name' ] );
这是防御xss的黄金标准。htmlspecialchars 函数会将用户输入中的特殊字符转换为对应的html实体。攻击者输入的 <script>alert(1)</script> 会被转换成 <script>alert(1)</script>。当浏览器接收到这段 html时,它会原样将 <script>... 作为文本显示在页面上,而不会将其解析和执行。
上下文安全输出
echo "<pre>Hello ${name}</pre>";
作用: 将经过编码的 $name 变量输出到html页面中。由于 $name 已经被 htmlspecialchars 处理过,它被安全地嵌入到html主体上下文中。无论 $name 的内容是什么,它都被 <pre> 标签包裹,并被浏览器当作纯文本内容来渲染。
赞赏
- [原创]dwva靶场-- xss 459
- [原创]dwva靶场-- sql注入 522
- [原创]dwva靶场-- csrf 476