一、实践内容
(一)SEED SQL注入攻击与防御实验
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变种攻击绕过验证机制。
- 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。
二、实践过程
1、熟悉SQL语句
在进行实验之前,首先使用命令sudo service apache2 start
开启apache服务,可以使用sudo service apache2 status
查看运行状态,同时查看Firefox浏览器是否已经添加了插件HTTP Header Live
:
打开终端,使用命令mysql -u root -p
登录mysql数据库,使用命令show databases;
查看已有的数据库,注意不要忘记;:
使用命令use Users;
切换到Users数据库,之后使用命令show tables;
查看Users数据库中的所有的表,使用select * from credential;
sql语句可以查询该表中的所有记录:
使用select * from credential where Name = 'Alice';
sql语句可以进行条件查询,查询Name为Alice的所有记录:
2、对SELECT语句的SQL注入攻击
打开浏览器,输入网址http://www.seedlabsqlinjection.com/
,在/var/www/SQLInjection/
目录下可以找到unsafe_home
页面的源代码,使用sudo vim /var/www/SQLInjection/unsafe_home.php
查看,可以找到sql语句$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";
,在后面的条件中,如果我们构造的$input_uname
输入值为Admin'#
,则发现,因为#
在sql语句中代表注释,则#
之后的Password判断不会执行,则可以实现在不知道密码的情况下登陆该Web应用程序:
如下图所示,USERNAME输入Admin'#
,PASSWORD保持空值,可以直接进行登录:
在HTTP Header Live
中可以查看到发起的请求,%23
代表#
:
3、对UPDATE语句的SQL注入攻击
在NickName那里输入语句', salary='500000' where EID='10000';#