文章目录
- 一、存储型XSS概述
- 二、low
- 2.1 源码分析
- 2.2 通关分析
- 三、medium
- 3.1 源码分析
- 3.2 通关思路
- 四、high
- 4.1 源码分析
- 4.2 通关思路
一、存储型XSS概述
XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行。
需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。
根据恶意代码是否存储在服务器中,XSS可以分为存储型XSS与反射型XSS。DOM型的XSS由于其特殊性,常常被分为第三种,这是一种基于DOM树的XSS。例如:服务器端经常使用document.boby.innerHtml等函数动态生成html页面,如果这些函数在引用某些变量时没有进行过滤或检查,就会产生DOM型的XSS。DOM型XSS可能是存储型,也有可能是反射型。
二、low
2.1 源码分析
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = mysql_real_escape_string( $message );
// Sanitize name input
$name = mysql_real_escape_string( $name );
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
//mysql_close();
}
?>
分析:
stripslashes()
删除字符串中的反斜杠;mysql_real_escape_string()
转义SQL语句中使用的字符串中的特殊字符- 可见服务端并没有对XSS进行过滤。
2.2 通关分析
既然没有过滤,payload:<script>alert("XSS")</script>
三、medium
3.1 源码分析
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );
// Sanitize name input
$name = str_replace( '<script>', '', $name );
$name = mysql_real_escape_string( $name );
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
//mysql_close();
}
?>
分析:
trim()
:移除特殊字符,默认移除:"\0"(NULL)
、"\t"(制表符)
、"\n"(换行)
、"\x0B"(垂直制表符)
、"\r"(回车)
、" "(空格)
addslashes()
:转义双引号;strip_tags()
:移除html标签;- 可见,服务器对message部分过滤慎严格,但是在name参数部分只是做
3.2 通关思路
payload写在name处,payload:<Script>alert("XSS")</script>
。因为name处有字符限制,故抓包修改参数。
四、high
4.1 源码分析
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = mysql_real_escape_string( $message );
$message = htmlspecialchars( $message );
// Sanitize name input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
$name = mysql_real_escape_string( $name );
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
//mysql_close();
}
?>
分析:name参数处只是过滤了script
标签,可以使用img标签进行绕过。
4.2 通关思路
payload:<img src=x onerror=alert("111")>