本文主要是介绍xss跨站脚本【反射型---Reflected Cross Site Scripting (XSS)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
介绍:
跨网站脚本(Cross-site scripting,XSS) 又称为跨站脚本攻击,是一种经常出现在Web应用程序的安全漏洞攻击,也是代码注入的一种。XSS是由于Web应用程序对用户的输入过滤不足而产生的,攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie窃取、会话劫持、钓鱼欺骗等各种攻击。这类攻击通常包含了HTML以及用户端脚本语言。
- 反射型 XSS:恶意脚本来自当前的 HTTP 请求;
- 存储型 XSS:恶意脚本来自站点数据库;
- DOM 型 XSS:漏洞存在于客户端代码而不是服务端代码
反射型---Reflected Cross Site Scripting (XSS)
LOW
服务端核心代码:
<?phpheader ("X-XSS-Protection: 0");// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end user$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; }?>
可以看到没有做防护。
查看源代码:
<div class="vulnerable_code_area"><form name="XSS" action="#" method="GET"><p>What's your name?<input type="text" name="name"><input type="submit" value="Submit"></p></form><pre>Hello 1</pre> </div>
可以看到, 服务端只是判断是否存在name参数值, 存在就直接执行写入pre标签。
所以直接输入<script>alert(111)</script>
Medium
服务端核心代码:
<?phpheader ("X-XSS-Protection: 0");// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Get input$name = str_replace( '<script>', '', $_GET[ 'name' ] );// Feedback for end user$html .= "<pre>Hello ${name}</pre>"; }?>
Medium级别的服务端将script标签过滤了, 但是他没有不区分大写地过滤 ($name = str_replace( '<script>', '', $_GET[ 'name' ] );)。大小写、双写、换标签等都可以绕过。
可以尝试输入<script>alert(111)</script>
没有弹框,查看源代码
<div class="vulnerable_code_area"><form name="XSS" action="#" method="GET"><p>What's your name?<input type="text" name="name"><input type="submit" value="Submit"></p></form><pre>Hello alert(111)</script></pre> </div>
可以看到<pre>Hello alert(111)</script></pre>前面的<script>标签过滤了,后面的</script>没过滤,这明显就是黑名单了。那我就可以只改变前面的<script>标签,<Script>alert(111)</script>
High
服务端核心代码:
<?phpheader ("X-XSS-Protection: 0");// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Get input$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );// Feedback for end user$html .= "<pre>Hello ${name}</pre>"; }?>
服务端用了正则式并且不区分大小写地过滤所有script标签$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
这个要换标签了<img src="" οnerrοr="alert(111)">
先尝试一下<script>alert(111)</script>
可以看到肯定过滤了,尝试输入alert(111)
可以看到弹框代码没过滤,那就是<script>和</script>都被过滤了,尝试了大小写双写都没用,试试换标签<img src="" οnerrοr="alert(111)">
Impossible
服务端核心代码:
<?php// Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$name = htmlspecialchars( $_GET[ 'name' ] );// Feedback for end user$html .= "<pre>Hello ${name}</pre>"; }// Generate Anti-CSRF token generateSessionToken();?>
- htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
- 预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为HTML实体,防止浏览器将其作为HTML元素。
让我们先来看看官方对于impossible难度的介绍
Impossible - This level should besecure against all vulnerabilities. It is used to compare the vulnerable source code to the secure source code.
Prior to DVWA v1.9, this level was known as ‘high’.译:
不可能-此级别应针对所有漏洞进行保护。它用于比较易受攻击的源代码和安全的源代码。在dvwav1.9之前,这个级别被称为“高”。
所以我们不要求去攻破它,但是我们可以学习它是如何去进行防范的。
这篇关于xss跨站脚本【反射型---Reflected Cross Site Scripting (XSS)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!