@1kbfree
2018-10-07T00:37:59.000000Z
字数 1514
阅读 1269
渗透
代码审计
在之前分别讲了Dvwa的Xss测试的
Low
、Medium
、High
等级,这节课就深入的来讲impossible
如何防御的( 其实之前文章也有讲过,不详细,这节课就深入的来讲解一下 )
老套路,直接看源码:
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// Get input
$name = htmlspecialchars( $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
{% note danger %}
这段代码中的checkToken()
函数是用于防御Csrf
攻击的,先不用管,我们先来看看这个htmlspecialchars()
函数
{% endnote %}
htmlspecialchars — 将特殊字符转换为 HTML 实体
字符 | 替换后 |
---|---|
& (和号) | 成为 & |
" (双引号) | 成为 " |
' (单引号) | 成为 ' |
< (小于) | 成为 < |
> (大于) | 成为 > |
先看一段代码简单的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<?php
$name = $_GET['name'];
?>
<h1>你好,<?php echo $name;?></h1>
</body>
</html>
访问http://127.0.0.1/myphp/demo.php?name=1
:
访问http://127.0.0.1/myphp/demo.php?name=<img src=x>
:
可见,这个是存在Xss的,那么我们用htmlspecialchars
函数来过滤~
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<?php
$name = $_GET['name'];
$name = htmlspecialchars( $name );
?>
<h1>你好,<?php echo $name;?></h1>
</body>
</html>
继续访问http://127.0.0.1/myphp/demo.php?name=<img src=x>
:
看到这里,你们就会好奇了,为什么会直接把输入的内容输出出来,而不是以代码被解析?我们打开审查元素看一看(F12)
我们可以发现这里是把<
变成了<
,把'>'变成了>
,从而导致了代码只会原样输出而不会当成代码来编译
如果你还困惑的,我再给你看一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo</title>
</head>
<body>
<h1>你好,<img src=x></h1> <!-- 注意看这里 -->
</body>
</html>
访问http://127.0.0.1/myphp/demo.php
:
Xss反射型部分撒花完结~