文章目录
XSS DOM类型低难度
代码审计:
<?php
# No protections, anything goes
?>
⽆任何过滤,所以可以直接在参数后⾯加⼀个xss语句
XSS DOM中级难度(medium)
代码审计:
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
这⾥可以看到,medium级别的代码先检查了default参数是否为空,如果不为空则将default等于获取到
的default值。这⾥还使⽤了stripos ⽤于检测default值中是否有 <script ,如果有的话,则将
default=English 。
很明显,这⾥过滤了 <script (不区分⼤⼩写),那么我们可以使⽤html中的oneerror构造payload
XSS DOM⾼级难度
代码审计
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}
?>
这段代码通过检查URL中的default参数,确保其值在允许的⽩名单(法语、英语、德语、⻄班⽛语)
内。
如果default参数的值不在⽩名单中,代码会将⽤户重定向到当前⻚⾯,并将default参数设置为默认值
English。
这种机制有助于防⽌恶意输⼊或错误的输⼊值,确保应⽤程序的安全性和稳定性。
可以看到我们在English之后添加了#,在url中#后边的内容不会发送到服务端,从⽽可以实现绕过
http://192.168.249.133/DVWA/vulnerabilities/xss_d/?default=#%3C/option%3E%3C/select%20%3E%3CBODY%20ONLOAD=alert(document.cookie)%3E
XSS(Reflected)反射型低级难度(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>';
}
?>
这段PHP代码的主要功能是检查URL中是否存在名为满⾜,代码将输出⼀个包含该 name 的查询参数,并且该参数不为空。如果条件name 参数值的欢迎信息
漏洞利⽤:直接输⼊xsspayload
XSS(Reflected)反射型中级难度(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>";
}
?>
这⾥设置了把
XSS(Reflected)反射型⾼级难度(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>";
}
?>
这段PHP代码使⽤了preg_replace函数来对$_GET[‘name’]变量中的内容进⾏正则表达式替换。具体来
说,它试图移除任何包含“script”字样的字符串,以防⽌潜在的XSS(跨站脚本)攻击。
漏洞利⽤
使⽤ img 标签和其编码转换后的 XSS payload
XSS(Stored)存储型低级难度
存储型XSS,持久化,代码是存储在服务器中的,如在个⼈信息或发表⽂章等地⽅,加⼊代码,如果没
有过滤或过滤不严,那么这些代码将储存到服务器中,⽤户访问该⻚⾯的时候触发代码执⾏。这种XSS
⽐较危险,容易造成蠕⾍,盗窃cookie等。
代码审计:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = stripslashes( $message );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitize name input
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
可以看出,low级别的代码对我们输⼊的message和name并没有进⾏XSS过滤,⽽且数据存储在数据库
中,存在⽐较明显的存储型XSS漏洞
我们输⼊ 1 和 ,可以看到,我们的js代码⽴即就执⾏了
XSS(Stored)存储型中级难度
代码审计:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input
$name = str_replace( '<script>', '', $name );
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
addslashes(string) :函数返回在预定义字符之前添加反斜杠的字符串,预定义字符 ’ 、" 、\ 、NULL
strip_tags(string) :函数剥去string字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars(string): 把预定义的字符 “<” (⼩于)、 “>” (⼤于)、& 、‘’、“” 转换为 HTML
实体,防⽌浏览器将其作为HTML元素
1.双写绕过
name参数输⼊为:<sc
先把输⼊⻓度改⼀下,然后使⽤写直接绕过,改⼀下输⼊⻓度maxlength改成100
2.⼤⼩写绕过
改⼀下输⼊⻓度maxlength改成100
3.使⽤⾮ script 标签的 xss payload:
改⼀下输⼊⻓度maxlength改成100
XSS(Stored)存储型⾼级难度
代码审计:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Get input
$message = trim( $_POST[ 'mtxMessage' ] );
$name = trim( $_POST[ 'txtName' ] );
// Sanitize message input
$message = strip_tags( addslashes( $message ) );
$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
这⾥使⽤正则表达式过滤了