这是继上节课[基于DVWA的Xss测试平台Low等级讲解]的中等级
首先,我们把等级设置为Medium
上节课讲了如何设置这里就不再讲了
查看Medium
源代码:
点开后是这样的:
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
header ("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
echo "<pre>Hello ${name}</pre>";
}
这里的代码部分也很好理解,比上一章仅仅多了一个过滤,下面来详细讲解一下。
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL )
这段代码的意思是,如果$_GET中有name这个key并且$_GET[ 'name' ]
的值不为空的话就执行{}
里面的代码。$name = str_replace( '<script>', '', $_GET[ 'name' ] );
这句话的意思是把$_GET[' name ']
中的<script>
过滤为空( 并不安全 ),最后一段代码就是输出Hello+name的值在页面上
看懂代码后,如何利用呢?
我们在上面看代码的时候明白了,在这个Medium
等级中,只做了把<script>
字符给过滤了,那么我下面就来演示一下如何绕过
先来输入<script>
后看看是否为空:
可以看到这里的输出是为空的,下面来讲绕过
绕过方法1:
在输入框中输入<scr<script>ipt>alert('iamfree')</script>
,来看看结果先:
解释:
绕过方法2:
用大写的绕过,输入<SCRIPT>alert('iamfree')</SCRIPT>
如何防御
防御方法1:
其实防御的方法也和上篇一样,但还有一个也很棒的方法哟。
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
// $name = str_replace( '<script>', 'xss', $_GET[ 'name' ] );
foreach ( $_GET as $key => $value ) { //把$_GET数组里的值分成$key和$value
$name = $_GET[ $key ] = htmlspecialchars( $value ); //把$_GET数组中$key对应的$value值html实例化,并且赋值给$name变量
}
// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}
防御方法2:
只需要加上一条preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] )
,这也是high
等级的防御方法
十年寒窗无人问,一举成名天下知
– Cai_Team