精华内容
下载资源
问答
  • 来源自绿盟科技 2019年11月的Web安全事件应急响应分析总结,owasp里的问题基本都有涉及,比较全面,适合初学者
  • 目前,传统的Web安全检测方法作用于程序输入输出端,不能防范经变形混淆后绕过检测进入程序内部执行的恶意代码,难以满足当前Web应用安全防护新需求。本方法基于对传统数据流监控方法风险的深入分析,结合RASP技术...
  • 尽管采用了安全的编码技术并使用了漏洞检测工具,但XSS仍保留在许多Web应用程序中,因为该方法非常复杂,方法的实现不正确,缺乏漏洞知识。 在本文中,我们调查了XSS攻击,预防基于存储的XSS和基于DOM的XSS的原因和...
  • 漏洞就是软件设计时存在的缺陷,安全漏洞就是软件缺陷具有安全攻击应用方面的价值。软件系统越复杂,存在漏洞的可能性越大。 2、漏洞出现哪些地方?(2天) 前端静态页面 脚本 数据 服务:主机、网络 系统逻辑 移动...
  • 通过web应用调用操作系统命令,通过shell命令可以调用操作系统的其它程序,只要有能够调用shell函数的地方就有被攻击的风险。 3.HTTP首部注入 在响应首部加入换行符(HTTP换行符:%0D%0A),设置cookie信息,...

    一、攻击手段

    主动攻击: 直接向应用服务器发起攻击,传入代码,比如OS注入、SQL注入。
    被动攻击:诱导客户操作,向服务器发送植入非法代码的请求,比如CSRF、XSS。
    主动与否的判断依据:攻击的直接发起者是普通用户还是攻击者。

    JS注入
    解决方法:HTML编码 如:<%=Html.Encode(feedback.Message)%>
    HTML5引入的新标签包括、、、

    等等,而这些标签又有一些有趣的属性,例如poster、autofocus、onerror、formaction、oninput,这些属性都可以用来执行javascript。这会导致XSS和CSRF跨域请求伪造。

    1.SQL注入

    非法修改SQL语句。

    2.OS命令注入攻击

    通过web应用调用操作系统命令,通过shell命令可以调用操作系统的其它程序,只要有能够调用shell函数的地方就有被攻击的风险。

    3.HTTP首部注入

    在响应首部加入换行符(HTTP换行符:%0D%0A),设置cookie信息,假冒用户。
    (1)HTTP响应截断攻击:需要插入两个HTTP换行符,然后并排插入字符串发送,插入的字符串是伪造的响应主体(网页内容)。可以达到和跨站脚本攻击相同的效果。

    4.邮件首部注入

    向邮件首部To/Subject任意添加非法内容,可以对任意邮件发送广告邮件或者病毒邮件。

    5.目录遍历攻击(directory traversal)

    非法访问服务器其它文件路径,比如/etc/passed。

    6.XSS(跨站脚本攻击,cross-site script)

    (1)表单
    在URL添加JavaScript代码,获取用户表单信息,并且提交到攻击者的服务器。
    (2)cookie
    保护cookie:httponly——服务端设置Set-Cookie: user=t=bfabf0b1c1133a822; path=/; HttpOnly
    (3)显示伪造的图片、文章
    xss防范:

    方法一:

    阻止 JavaScript 注入攻击的一种简单方法是重新在视图中显示数据时,用 HTML 编码任何网站用户输入的数据
    如:<%=Html.Encode(feedback.Message)%>
    使用 HTML 编码一个字符串的含意是什么呢?使用 HTML 编码字符串时,危险字符如 < 和 > 被替换为 HTML 实体,如 < 和 >。所以,当使用 HTML 编码字符串 。浏览器在解析编码的字符串时不再执行 JavaScript 脚本。而是显示无害的页面。
    方法二:

    除了在视图中显示数据时使用 HTML 编码数据,还可以在将数据提交到数据库之前使用 HTML 编码数据。
    StringEscapeUtils.escapeHtml(“前台提交的数据”);

    通常,人们喜欢使用本教程中讨论的第一种方法,而不喜欢使用第二种方法。第二种方法的问题在于在数据库中最终会保留 HTML 编码的数据。换言之,数据库中的数据会包含奇怪的字符。这有什么坏处呢?如果需要用除网页以外的形式显示数据库数据,则将遇到问题。例如,不能轻易在 Windows Forms 应用程序中显示数据。

    7.会话固定攻击(session fixation)

    访问登录页面,利用服务器返回的URL诱导用户前去认证,再用用户的会话ID去登录网站。

    8.CSRF(跨站点请求伪造,cross-site request forgeries)

    利用已经认证的用户,向应用服务器发送请求,完成相应操作,比如发表言论,购买。
    1、验证HTTP Referer字段

    在HTTP头中有Referer字段,他记录该HTTP请求的来源地址,如果跳转的网站与来源地址相符,那就是合法的,如果不符则可能是csrf攻击,拒绝该请求
    2、在请求地址中添加token并验证

    这种的话在请求的时候加一个token,值可以是随机产生的一段数字,
    token是存入数据库之后,后台返给客户端的,如果客户端再次登录的时候,
    后台发现token没有,或者通过查询数据库不正确,那么就拒绝该请求

    如果想防止一个账号避免在不同的机器上登录,那么我们就可以通过token来判断,
    如果a机器登录后,我们就将用户的token从数据库清除,从新生成,
    那么另外一台b机器在执行操作的时候,token就失效了,只能重新登录,这样就可以防止两台机器登同一账号
    3、在HTTP头中自定义属性并验证

    如果说通过每次请求的时候都得加token那么各个接口都得加很麻烦,
    那么我们通过http的请求头来设置token
    例如:
    $.ajax({
    url: ‘/v1/api’,
    dataType: ‘json’,
    data: param,
    type:‘post’,
    headers: {‘Accept’:‘application/json’,‘Authorization’:tokenValue}
    success:function(res){
    console.log(res)
    }
    })

    二、其它安全隐患

    1.不能访问没有权限的文本内容,却能够访问图片资源
    2.不恰当的错误信息抛出

    • 数据库管理系统抛出的错误
    • 后台应用抛出的程序错误
    • 前端校验错误信息提示

    3.开放重定向
    4.密码破解

    • 密码试错
      穷举法
      建立字典

    • 对加密的密码进行破解
      密码加密:密码+salt --> md5(散列函数)–> 保存散列值
      破解方法:

      • 穷举法、字典
        调用相同散列函数处理候选密码得到散列值,与目标散列值比对。

      • 彩虹表
        明文和散列值构成的数据库表。能够提高效率。类似字典攻击。

      • 拿到密钥

      • 利用加密算法的漏洞

    • 点击劫持(clickjacking)
      又称界面伪装,诱导客户点击存在陷阱的按钮或者链接。在合法页面上设置透明的iframe页面。

    • DoS攻击(denial of service attack)
      又称拒绝服务攻击。
      集中发送合法请求,消耗服务器资源。
      DDoS攻击(distributed denial of service attack):多台计算机发送的DoS攻击。一般利用已经中毒的计算机作为工具发送DoS。
      -网站劫持
      使用 https

    • 后门程序
      分类:
      开发阶段作为debug调用的后门程序
      开发者为了自身利益植入的后门程序
      攻击者设置的后门程序

    参考资料:
    https://segmentfault.com/a/1190000012496422
    https://www.kancloud.cn/digest/html5/190761
    《图解HTTP》

    展开全文
  • 安全 - 常见web攻击与防护

    千次阅读 2019-03-17 10:30:33
    网络世界, 没有所谓的安全, 任何系统都存在漏洞, 只要时间足够以及具备值得被攻破的价值. 就会被攻击. 攻与防之间,本来就没有绝对的安全。我们能做的就是,尽量提高攻击的成本。有时有些方案虽然有漏洞,...

    前言

    网络世界, 没有所谓的安全, 任何系统都存在漏洞, 只要时间足够以及具备值得被攻破的价值. 就会被攻击.

    攻与防之间,本来就没有绝对的安全。

    我们能做的就是,尽量提高攻击的成本。

    有时有些方案虽然有漏洞,但是实现起来足够简单,但是并不会过度影响业务性能(比如响应时间)。

    所以,权衡安全性、开发成本、对系统性能的影响,选择比较折中、比较合理的方案更为重要。

    Web安全 - FreeBuf网络安全行业门户  // Web安全 20200710

    https://github.com/ningxiaofa/sectoolset  // 搜集的Github关于安全工具集合 -- 20210308

    https://github.com/ningxiaofa/learning_of_web_security  // Web安全攻防 -- 20210308

    1.XSS

    什么是 XSS 攻击XSS 全称是 Cross Site Scripting,为了与“CSS”区分开来,故简称 XSS,翻译过来就是“跨站脚本”。

    XSS 攻击是指黑客往 HTML 文件中或者 DOM 中注入恶意脚本,从而在用户浏览页面时利用注入的恶意脚本对用户实施攻击的一种手段。

    最开始的时候,这种攻击是通过跨域来实现的,所以叫“跨域脚本”。

    但是发展到现在,往 HTML 文件中注入恶意代码的方式越来越多了,所以是否跨域注入脚本已经不是唯一的注入手段了,但是 XSS 这个名字却一直保留至今。

    当页面被注入了恶意 JavaScript 脚本时,浏览器无法区分这些脚本是被恶意注入的还是正常的页面内容,所以恶意注入 JavaScript 脚本也拥有所有的脚本权限。

    下面我们就来看看,如果页面被注入了恶意 JavaScript 脚本,恶意脚本都能做哪些事情。

    可以窃取 Cookie 信息。恶意 JavaScript 可以通过“document.cookie”获取 Cookie 信息,然后通过 XMLHttpRequest 或者 Fetch 加上 CORS 功能将数据发送给恶意服务器;恶意服务器拿到用户的 Cookie 信息之后,就可以在其他电脑上模拟用户的登录,然后进行转账等操作。

    可以监听用户行为。恶意 JavaScript 可以使用“addEventListener”接口来监听键盘事件,比如可以获取用户输入的信用卡等信息,将其发送到恶意服务器。黑客掌握了这些信息之后,又可以做很多违法的事情。

    可以通过修改 DOM 伪造假的登录窗口,用来欺骗用户输入用户名和密码等信息。

    还可以在页面内生成浮窗广告,这些广告会严重地影响用户体验。除了以上几种情况外,恶意脚本还能做很多其他的事情,这里就不一一介绍了。总之,如果让页面插入了恶意脚本,那么就相当于把我们页面的隐私数据和行为完全暴露给黑客了。

    恶意脚本是怎么注入的

    现在我们知道了页面中被注入恶意的 JavaScript 脚本是一件非常危险的事情,所以网站开发者会尽可能地避免页面中被注入恶意脚本。

    要想避免站点被注入恶意脚本,就要知道有哪些常见的注入方式。通常情况下,主要有存储型 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击三种方式来注入恶意脚本。

    1. 存储型 XSS 攻击

    2. 反射型 XSS 攻击

    3. 基于 DOM 的 XSS 攻击

    如何阻止 XSS 攻击?

    我们知道存储型 XSS 攻击和反射型 XSS 攻击都是需要经过 Web 服务器来处理的,

    因此可以认为这两种类型的漏洞是服务端的安全漏洞。

    而基于 DOM 的 XSS 攻击全部都是在浏览器端完成的,因此基于 DOM 的 XSS 攻击是属于前端的安全漏洞

    但无论是何种类型的 XSS 攻击,它们都有一个共同点,那就是首先往浏览器中注入恶意脚本,然后再通过恶意脚本将用户信息发送至黑客部署的恶意服务器上。

    所以要阻止 XSS 攻击,我们可以通过阻止恶意 JavaScript 脚本的注入和恶意消息的发送来实现。

    常用的阻止 XSS 攻击的策略。

    1. 服务器对输入脚本进行过滤或转码
    不管是反射型还是存储型 XSS 攻击,我们都可以在服务器端将一些关键的字符进行转码,比如最典型的:

    2. 充分利用 CSP
    虽然在服务器端执行过滤或者转码可以阻止 XSS 攻击的发生,但完全依靠服务器端依然是不够的,我们还需要把 CSP 等策略充分地利用起来,以降低 XSS 攻击带来的风险和后果。

    实施严格的 CSP 可以有效地防范 XSS 攻击,具体来讲 CSP 有如下几个功能:
    限制加载其他域下的资源文件,这样即使黑客插入了一个 JavaScript 文件,这个 JavaScript 文件也是无法被加载的;
    禁止向第三方域提交数据,这样用户数据也不会外泄;
    禁止执行内联脚本和未授权的脚本;

    还提供了上报机制,这样可以帮助我们尽快发现有哪些 XSS 攻击,以便尽快修复问题。因此,利用好 CSP 能够有效降低 XSS 攻击的概率。

    3. 使用 HttpOnly 属性
    由于很多 XSS 攻击都是来盗用 Cookie 的,因此还可以通过使用 HttpOnly 属性来保护我们 Cookie 的安全。

    更多信息参见:

    参见 极客时间 - 浏览器工作原理与实践 - 浏览器安全[33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?-极客时间]

    2.CSRF/XSRF

    CSRF 保护 | 基础组件 | Laravel 5.8 中文文档  // CSRF 保护  //请多阅读并实践几遍

    表单方法伪造与跨站请求伪造(CSRF)攻击防护 | 路由&控制器篇 | Laravel 入门到精通教程  // 表单方法伪造与跨站请求伪造(CSRF)攻击防护 

    CSRF 保护 | 基础组件 | Laravel 6 中文文档   // CSRF 保护

    https://qcdn.xueyuanjun.com/wp-content/uploads/2018/08/07f0a38e1625f451a46e696a0c5e1a9f.png

    前后端分离下如何防御CSRF攻击 - 简书  // 前后端分离下如何防御CSRF攻击

    34 | CSRF攻击:陌生链接不要随便点-极客时间  // 浏览器工作原理与实践 - 34 | CSRF攻击:陌生链接不要随便点  -- 推荐

    Note ↓

    1. 构建 JavaScript 驱动的应用时,为方便起见,可以让 JavaScript HTTP 库自动在每个请求中添加 CSRF 令牌。默认情况下,resources/js/bootstrap.js 中提供的 Axios HTTP 库会使用加密后的 XSRF-TOKEN Cookie 值自动发送 X-XSRF-TOKEN 请求头。如果你没有使用这个库,则需要手动在应用中配置该实现。

    2.有时候我们需要从 CSRF 保护中间件中排除一些 URL.

    例如,如果你使用了第三方支付系统(如支付宝或微信支付)来处理支付并用到他们提供的回调功能,这时候就需要从 Laravel 的 CSRF 保护中间件中排除回调处理器路由,因为第三方支付系统并不知道要传什么 token 值给我们定义的路由。

    更多详情

    例如:// 20200904

    网易云音乐

    直接在url的query string中添加csrf_token进行验证.

    主要用于post方式的请求.

    3.SQL注入

    SQL注入与检测_william_n的博客-CSDN博客

    4.代码注入

    TBD

    5.DDoS攻击

    TBD

    6.重放攻击

    概念 ↓

    https://zh.wikipedia.org/wiki/重放攻击

    https://baike.baidu.com/item/重放攻击/?fr=aladdin

    简要定义 ↓

    重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。

    引子

    13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?-极客时间

    网友一

    重放攻击防止方式有三种:
    1、加时间戳
    客户端与服务端有时间差,例如60s内的都算有效。那么黑客可以60s以内进行重放攻击,就有效。
    2、时间戳+nonce(随机数)
    每次请求成功后,保存nonce,例如放在redis和数据库中,再次请求如果nonce相同,则为重放攻击。
    3、基于record的方案,就是和你说的保存token的意思差不多
    把每次请求保存在数据库中,接收到新请求后,校验是否存在,如果存在,则请求非法。也可以与1结合时间戳只保存60s以内的数据。
    参考:
    负载均衡 接口鉴权 - API 文档 - 文档中心 - 腾讯云
    掘金

    网友二

    OAuth 2.0 + 网关(如Zuul)+ 认证中心 + AOP可以实现。
    极客时间《微服务架构实战160讲》里介绍了OAuth 2.0企业级的解决方案,小争哥的方案适合快速落地。


    实际业务中如果安全等级没这么高,直接生成Token鉴权就可以。通过业务模型规避风险:
    1. 充值类业务,就算对方篡改接口,最终结果可以通调用证金融机构的接口验证是否有效,不会给公司带来损失。
    2. 如果安全等级非常高,比如提现、转账可以通过发送手机短信,确保是本人操作。
    3. 如果是商品信息查询类接口,防止第三方爬取数据,可以在调用一定次数后加入”人机验证“(输入图片识别码、拼图)。
    4. 根据IP限制访问次数。
    5. 服务器间调用可以绑定mac地址、IP。
    6. 服务器、客户端通过架设私有VPN进行通信,将安全问题转移到VPN上,降低业务复杂度的同时还可以避免加解密带来的性能损耗,提升性能。
    7. 调用接口时通过付费方式(如实名认证、银行四要素验证这些调用一次都是要收费的),防止恶意调用。
    8. 通过独立加密硬件(如U盾)+ 独立密码验证器(Google验证器)+ 语音识别 + 面部识别(刷脸支付) + 指纹 + 多人同时输入动态秘钥(核打击时发射程序)。
    9. 安全性会降低系统性能适可而止。
    极客时间《左耳听风》专栏中介绍了亚马逊在设计开发微服务时,就已经做好了随时对外网开放的准备,由于没有阅读完整个专栏,不知道后面有没有详细介绍。

    网友三[小白]

    防止重放攻击的方案在老师的基础做进一步的迭代设计:
    1.要求客户端生成一个唯一的请求id,如以uuid方式
    2.客户端在以sha等加密哈希方式生成token时,也将请求id加入其中
    3.客户端也要将请求id作为参数传递到服务端,如果是rest api就是也要将请求id拼接到url参数中
    4.服务端检查服务端的缓存中(可以是redis)是否有客户端传递的请求id,如果有,则判定为重放攻击,拒绝请求。如果没有,则将请求id放到缓存中同时设置在token失效的时间窗内缓存的请求id自动失效(如redis key的TTL)


    这个实现思路是: 在时间窗内的重放攻击,以服务端在时间缓存了在时间窗内的所有请求id的形式来防护,而在时间窗外的重放攻击就是老师的方案中检查客户端传过来的时间(时间戳)和服务端当前时间(时间戳)相减的绝对值不能超过时间窗的长度来实现。另外,时间戳、请求id等都hash在了token
    中,所有客户端是无法篡改的。


    这个实现思路的缺点是: 改实现方案要求客户端的时间和服务端的时间之间的差距不能超过时间窗,如果时间窗设置为1分钟这种比较小的,则要求客户端时间和服务端时间不能超过1分钟,这个有点苛刻,比如客户端如app所在的手机的时间不准确了,但就差1分钟,将无法访问接口。如果时间窗设置过长,如30分钟,则要求服务端缓存中缓存最近30分钟的请求id,如果接口的访问并发挺大的话,缓存占用空间也将很大,需要评估。

    请继续技术调研

    ...

    7. PHP安全与漏洞 --- 20210304 周四 家里

    PHP安全与漏洞-免费在线视频教程-php中文网   // PHP安全与漏洞

    整理实践TBD

    8.问题/补充

    产品团队必须能够阻止,监视和警告HTTP请求中的常见攻击模式或技术(如果适用于您的服务):OWASP Top 10和其他应用程序安全漏洞(例如SSRF,SQLi,XSS,XXE,LFI,RCE,CSRF,业务逻辑漏洞等)。

    蛮力攻击(例如,用户枚举,凭据填充,密码猜测)。

    产品滥用或滥用(例如帐户接管,滥用业务逻辑缺陷)。-- SEEK RFC022

    9.参考

    常见web攻击总结 - morethink - 博客园 // 常见Web攻击总结

    安全|常见的Web攻击手段之CSRF攻击 - 简书  // 安全|常见的Web攻击手段之CSRF攻击

    XSS实战:我是如何拿下你的百度账号

    总结几种常见web攻击手段及其防御方式

    浅谈CSRF攻击方式

    前后端分离下如何防御CSRF攻击 - 简书  // 前后端分离下如何防御CSRF攻击

    jQueue 动态设置form表单的action属性的值和方法

    javascript的String到int(32位)的hash算法

    负载均衡 接口鉴权 - API 文档 - 文档中心 - 腾讯云
    掘金

    PHP_SELF漏洞 - 简书  // PHP_SELF漏洞

    https://blog.csdn.net/xuanyuan_fsx/article/details/104967382  // 程序猿应该知道的黑客技术大汇总 

    https://github.com/ningxiaofa/sectoolset  // 搜集的Github关于安全工具集合 -- 20210308

    https://github.com/ningxiaofa/learning_of_web_security  // Web安全攻防 -- 20210308

    后续补充

    ...

    展开全文
  • Web安全之SQL注入

    2021-01-21 14:35:01
    Web应用程序的开发人员对用户所输入的数据不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取数据库的信息以及提权,此时称发生了SQL注入攻击。 二、举个简单的例子 Web页面的...
  • 全书分4 篇共16 章,除介绍Web 安全的基础知识外,还介绍了Web 应用程序中最常见的安全漏洞、开源程序攻击流程与防御,并着重分析了“拖库”事件时黑客所使用的攻击手段。此外,还介绍了渗透测试工程师其他的一些...
  • Web安全 .pdf

    2020-03-21 00:01:31
    跨站脚本攻击 浏览器安全 跨站点请求伪造(CSRF) 点击劫持(ClickJacking) 注入攻击 文件上传漏洞 认证与会话管理 Web 框架安全 Web Server 配置安全 互联网业务安全 安全开发流程
  • web漏洞攻击.doc

    2020-03-31 14:00:43
    Web应用攻击攻击者通过浏览器或攻击工具,在URL或者其它输入区域(如表单等),向Web服务器发送特殊请求,从中发现Web应用程序存在的漏洞,从而进一步操纵和控制网站,查看、修改未授权的信息。
  • 安全、最有能力抵御攻击Web应用程序是那些应用安全思想构建的应用程序。在设计初始阶段,应该使用可靠的体系结构和设计方法,同时要结合考虑程序部署以及企业的安全策略。如果不能做到这一点,将导致在现有基础...
  • Web安全深度剖析

    2018-04-15 11:42:59
    全书分4 篇共16 章,除介绍Web 安全的基础知识外,还介绍了Web 应用程序中最常见的安全漏洞、开源程序攻击流程与防御,并着重分析了“拖库”事件时黑客所使用的攻击手段。此外,还介绍了渗透测试工程师其他的一些...
  • 其主要目标是帮助安全专业人员在法律环境中测试他们的技能和工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助学生和教师在受控班级中学习Web应用程序安全性。房间环境。 DVWA的目的是通过简单易用的...
  • 该列表适用于希望了解Web应用程序安全性但没有起点的任何人。 您可以发送“拉取请求”添加更多信息,以提供帮助。 如果您不希望进行@infoslack可以通过@infoslack发送给我 目录 图书 Web应用程序黑客手册:发现和...
  • WEB安全深度剖析.pdf

    2019-07-05 16:29:42
    全书分4 篇共16 章,除介绍Web 安全的基础知识外,还介绍了Web 应用程序中最常见的安全漏洞、开源程序攻击流程与防御,并着重分析了“拖库”事件时黑客所使用的攻击手段。此外,还介绍了渗透测试工程师其他的一些...
  • 1-Web安全——命令执行注入攻击

    千次阅读 2020-09-06 20:44:12
    通常在程序开发过程中,应用程序需要调用一些外部程序时会用到一些系统命令相关函数。 例如在linux系统中,shell解释器就是用户和系统进行交互的一个接口,对用户的输入进行解析并在系统中执行。而shell脚本语言...

    目录

    1. 系统命令执行

    2. Web命令执行

    3. 什么是PHP命令注入漏洞

    4. PHP命令执行的函数

    4.1 system函数

    4.2 exec函数

    4.3 passthru函数

    4.4 shell_exec函数

    4.5 popen函数

    5. 特殊符号——反引号

    6. 命令执行用到的运算符

    7. DVWA靶场——命令注入

    8. eval注入攻击利用

    9. 系统命令执行防御思路


    1. 系统命令执行

    通常在程序开发过程中,应用程序在调用一些第三方程序时会用到一些系统命令相关函数。

    例如在linux系统中,shell解释器就是用户和系统进行交互的一个接口,对用户的输入进行解析并在系统中执行。而shell脚本语言就是linux系统由各种shell命令组成的程序,具有其他普通编程的很多特点。

    2. Web命令执行

    常用的ASP,PHP,JSP等web脚本解释语言支持动态执行在运行时生成的代码这种特点,可以帮助开发者根据各种数据和条件动态修改程序代码,这对于开发人员来说是有利的,但这也隐藏着巨大的风险。

    命令注入攻击(即Command Injection)是web应用程序对用户的输入提交的数据过滤不严格,导致攻击者构造恶意的特殊命令字符串的方式将数据提交到web应用程序中,从而执行外部程序或系统命令来进行攻击,非法获取目标服务器的数据资源。

    命令注入攻击是挪威一名程序员在1997年意外发现的,他通过构造命令字符串的方式从一个网站上删除网页,就像从硬盘中删除一个文件这么简单。

    3. 什么是PHP命令注入漏洞

    php命令注入攻击是php语言中很常见的一种漏洞,通常web应用程序在调用php语言中的一些系统命令执行相关函数时,对用户的提交的数据没有进行合理的过滤或安全校验就作为函数参数执行产生的攻击。例如攻击者对网站写入一个php文件时,就可以通过php命令注入来实现向网站写入一个webshell文件,进一步实施渗透攻击。

    4. PHP命令执行的函数

    php中可以实现执行外部程序或系统命令的函数有:

    1. system
    2. exec
    3. passthru
    4. shell_exec
    5. popen
    6. proc_popen

    4.1 system函数

    在php中,命令执行函数主要的作用就是通过web应用程序执行外部程序或系统命令,例如web应用程序想要获取当前服务器系统的用户的话,就可以通过system函数来获取用户信息,构造代码如下:

    <?php
    	$cmd = $_GET["cmd"];
    	if(isset($cmd))
    	{
    		echo "<pre>";
    		system("net user".$cmd);
    		echo "<pre>";
    	}
    ?>

    以上代码中变量cmd会动态接收用户输入的命令,作为system函数的命令参数并执行,然后将结果输出。由于web应用程序可以通过变量cmd接收用户的不同命令并执行,而攻击者则可能利用变量cmd提交恶意数据进行命令注入攻击获取服务器的数据信息。

    例如攻击者想要查看当前服务器的用户和ip地址等信息,那么可以在URL地址中构造系统命令,如下所示:

    http://www.dvwa.com/cmd/test.php?cmd=||%20ipconfig

    system函数执行结果如下所示:

    攻击者通过cmd变量构造|| ipconfig命令提交数据后,在后台进行拼接后其实就是一个“net user || ipconfig”这样的字符串,并将这个字符串作为参数传入到system函数中执行,并且system函数会先执行net user系统命令获取当前服务器的用户,接着在执行ipconfig命令查看服务器的ip地址信息,并将命令执行后的结果输出。


     

    4.2 exec函数

    exec函数跟system函数的作用类似,唯一不同的就是exec函数不会将执行后的结果输出,其函数原型如下:

    string exec ( string $command [, array &$output [, int &$return_var ]] )

    参数说明:

    Command:表示要执行的命令

    Output:这是一个数组,用于接收exec函数执行后返回的字符串结果

    return_var:记录exec函数执行后返回的状态

    exec函数测试代码如下:

    <?php
    	$cmd = $_GET["cmd"];
    	if(isset($cmd)){
    		echo "<pre>";
    		//output用于接收exec函数执行后的结果
    		$output = array();
    		//执行命令
    		exec($cmd , $output);
    		echo "<pre>";
    		//将output中的结果输出
    		while(list($key , $value)=each($output))
    		{
    			echo $value."<br/>";
    		}
    	}
    ?>

    构造测试URL:http://www.dvwa.com/cmd/test.php?cmd=dir c:\ ,读取目标服务器的C盘文件,执行结果如下:

    exec函数执行完后,会将执行后的结果放入到output数组中,需要在代码中将结果展示出来。

    4.3 passthru函数

    passthru函数也是用于执行系统命令的,并且会将执行后的结果进行输出,需要注意的是该函数主要是应用在unix系统下。当unix系统的命令输出的结果是二进制数据时,并且需要将数据结果返回给浏览器,就需要用到passthru函数来代替system和exec函数。

    函数原型:

    void passthru( string $command[, int &$return_var] )

    参数的说明可以参考之前的system,exec函数。

    passthru函数的php代码如下:

    <?php
    	$cmd = $_GET["cmd"];
    		echo "<pre>";
    		//执行命令
    		passthru($cmd);
    		echo "<pre>";
    ?>

    4.4 shell_exec函数

    用于执行shell命令并将执行的结果以字符串的形式返回,但是不会将结果进行输出。

    函数原型如下:

    string shell_exec ( string $cmd )

    shell_exec函数的测试代码如下:

    <?php
    	$cmd = $_GET["cmd"];
    	echo "<pre>";
    	print shell_exec($cmd);
    	echo "<pre>";
    ?>

    利用shell_exec函数查看当前服务器的系统配置信息,执行结果如下:

    4.5 popen函数

    popen函数会将执行后的系统命令结果用一个文件指针的形式返回。

    函数原型:

    resource popen ( string $command , string $mode )

    参数mode表示打开的文件的读写方式。

    popen函数的利用代码:

    <?php
    	$cmd = $_GET["cmd"];
    	if(isset($cmd)){
    		echo "<pre>";
    		//将命令写入到文本
    		$cmd = $_GET["cmd"].">> 1.txt";
    		//执行系统命令
    		popen($cmd , "r");
    		echo "<pre>";
    	//打开并读写文本文件
    	$fp = fopen("1.txt" , "r");
    	if($fp){
    		while(!feof($fp)){
    			$content = fgets($fp);
    			echo $content;
    		}
    	}
    	fclose($fp);
    	}
    ?>

    popen函数的执行结果如下:

    5. 特殊符号——反引号

    在php中``反引号里的字符串内容会解析为系统命令并执行。

    反引号利用代码:

    <?php
    	$cmd = $_GET["cmd"];
    	if(isset($cmd)){
    		echo "<pre>";
            //会将反引号里的内容解析为系统命令并执行
    		print `$cmd`;
    		echo "<pre>";
    	}
    ?>

    6. 命令执行用到的运算符

    在进行命令注入攻击,特别是绕过WAF的时候可以使用 && ,& ,| ,||等符号分隔命令:

    1. “&&”符号:Command1&&Command2表示先执行Command1命令,执行成功后再执行Command2命令,否则就不执行Command2。

    以net user&&whoami命令为例,结果如下:

    前面的net user命令执行过程中出错了,那“&&”符号后面的whoami命令就不会再执行了。

    2. “&”符号: Command1&Command2表示先执行命令1,无论成功与否,都执行命令2。

    以whoami%26net user命令为例,URL地址栏中不能直接使用“&”符号,只能使用“&”符号的URL编码%26,执行结果如下:

    虽然执行net user命令出错了,但后面的whoami命令依然能得到执行。

    3. “||”符号: Command1||Command2表示使用“||”符号进行连接实现逻辑或功能,只有在Command1命令执行失败后才会执行Command2关于其用法参考system函数。

    4. “|”符号:|符号表示管道,把上一条命令的输出作为下一条命令的参数,可参考system函数中的用法。

    7. DVWA靶场——命令注入

    打开DVWA靶场再把难度调成low级别,选择Command Injection,如下所示:

    dvwa靶场提示输入一个ip地址,但是如果想要执行其他命令的话就可以结合命令执行用到的运算符进行配合,例如获取服务器系统的当前用户信息,就可以构造127.0.0.1|net user命令进行注入。

    分析后台代码:

    <?php
    if( isset( $_POST[ 'Submit' ]  ) ) {
        //接收ip地址
        $target = $_REQUEST[ 'ip' ];
        //确定操作系统并执行命令
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
            $cmd = shell_exec( 'ping  ' . $target );
    } else {
        //linux系统发送4个ping包
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
        //返回命令执行结果
        echo "<pre>{$cmd}</pre>";
    }
    ?> 

    后台对前台用户输入的命令没有做任何的过滤,直接把前端的输入作为命令执行函数的参数,并将执行后的结果返回。

    把难度修改成medium级别,分析后台代码:

    <?php
    if( isset( $_POST[ 'Submit' ]  ) ) {
        //获取输入的命令
        $target = $_REQUEST[ 'ip' ];
        //过滤&& , ;
        $substitutions = array(
            '&&' => '',
            ';'  => '',
        );
    
        //通过str_replace进行过滤
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
        //确定操作系统并执行命令
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    		//windows
            $cmd = shell_exec( 'ping  ' . $target );
        } else {
    		//linux or unix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
        echo "<pre>{$cmd}</pre>";
    }
    ?> 

    medium级别的dvwa靶场对“$$”和“;”符号进行了过滤,str_replace函数会对这两个符号进行匹配,如果匹配到则把该字符串用空字符串进行替换,那么我们在进行命令执行注入时就不能使用“$$”和“;”符号了。

    因此可以使用“||”,“|”,“$”符号对目标进行命令注入,分别构造127.0.301.1||net user和127.0.0.1|net user命令进行注入:

    把难度调成high级别,分析代码:

    <?php
    if( isset( $_POST[ 'Submit' ]  ) ) {
        $target = trim($_REQUEST[ 'ip' ]);
        //过滤列表
        $substitutions = array(
            '&'  => '',
            ';'  => '',
            '| ' => '',
            '-'  => '',
            '$'  => '',
            '('  => '',
            ')'  => '',
            '`'  => '',
            '||' => '',
        );
    
        $target = str_replace( array_keys( $substitutions ), $substitutions, $target );
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
            $cmd = shell_exec( 'ping  ' . $target );
        }else {
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }
        echo "<pre>{$cmd}</pre>";
    }
    ?> 

    后台对于所有的系统命令符号都进行了过滤,但是仔细分析发现,“|”符号后面对了一个空格,也就是说后台对于“|”符号的过滤还是不严格,因此我们可以利用这一点进行绕过。

    由于“|”符号前面的命令必须执行失败出错,后面的ipconfig命令才会得到执行,那么需要保证192.168.1.100这个ip地址是ping不通的。

    DVWA靶场安全设置为impossible级别:

    php
    if( isset( $_POST[ 'Submit' ]  ) ) {
        //校验tooken防止CSRF
        checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
        $target = $_REQUEST[ 'ip' ];
    	//去除反斜杠
        $target = stripslashes( $target );
        //对输入的ip进行分割
        $octet = explode( ".", $target );
        //判断用户提交的数据是否为数字
        if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
            $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
            if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
                $cmd = shell_exec( 'ping  ' . $target );
            }
            else {
                $cmd = shell_exec( 'ping  -c 4 ' . $target );
            }
    
            echo "<pre>{$cmd}</pre>";
        }
        else {
            echo '<pre>ERROR: You have entered an invalid IP.</pre>';
        }
    }
    generateSessionToken();
    ?> 

    后台代码经过一系列的过滤,对于提交的数据格式只有为ip地址格式的才会被接收并执行,因此这里是不存在命令注入漏洞的。

    8. eval注入攻击利用

    php中的eval注入也可以实现命令注入,eval函数会将参数字符串作为php程序代码来执行,用户可以将php代码保存成字符串形式然后传递到eval函数执行。

    函数原型:

    mixed eval( string $code)

    eval函数的参数code就是php代码字符串,攻击者可以通过eval的参数构造全部或部分字符串的内容实现命令注入。

    测试代码:

    <?php
    	$cmd = $_GET["cmd"];
    	if(isset($cmd)){
    		echo "<pre>";
    		eval($cmd);
    		echo "<pre>";
    	
    	}
    ?>

    在URL链接中http://www.dvwa.com/cmd/test.php?cmd=phpinfo(); 提交构造好的php字符串:

    我们在URL中提交的“phpinfo();”字符串经过eval函数的处理,可以按照php代码来执行并返回结果。

    9. 系统命令执行防御思路

    1. 尽量减少命令执行函数的使用,可以在disable_functions中禁用掉,在php.ini文件中找到该选项,输入禁用的命令执行函数,以system函数为例:

    禁用system函数之后,再次执行php代码就会报错:

    Warning: system() has been disabled for security reasons in C:\wamp\www\dvwa.com\cmd\test.php on line 5
    Call Stack

    2. 命令执行的函数或方法的参数进行合理的过滤或校验

    3. 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义,该函数的用法可参考之前的文章。

    展开全文
  • web安全深度剖析

    2018-11-10 19:06:10
    全书分4 篇共16 章,除介绍Web 安全的基础知识外,还介绍了Web 应用程序中最常见的安全漏洞、开源程序攻击流程与防御,并着重分析了“拖库”事件时黑客所使用的攻击手段。此外,还介绍了渗透测试工程师其他的一些...
  • 网络安全——常见的几种WEB攻击

    万次阅读 2018-10-25 09:24:42
    1.XSS攻击:指的是跨脚本攻击,指的是攻击者在网页中嵌套,恶意脚本程序,当用户打开网页时,程序开始在浏览器上启动,盗取用户的cooks,从而盗取密码等信息,下载执行木马程序。 解决方法:XSS之所以会发生,是因为...

     

    1.XSS攻击:指的是跨脚本攻击,指的是攻击者在网页中嵌套,恶意脚本程序,当用户打开网页时,程序开始在浏览器上启动,盗取用户的cooks,从而盗取密码等信息,下载执行木马程序。

    解决方法:XSS之所以会发生,是因为用户输入的数据变成了代码。因此,我们需要对用户输入的数据进行HTML转义处理,将其中的“尖括号”、“单引号”、“引号” 之类的特殊字符进行转义编码。

     

    2.CSRF攻击:CSRF攻击的全称是跨站请求伪造(cross site request forgery), 是一种对网站的恶意利用,你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的事情包括利用你的身份发邮件、发短信、进行交易转账等等,甚至盗取你的账号。

    解决方法:

    cookie设置为HttpOnly

    CSRF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie中设置"HttpOnly"属性,这样通过程序(如JavascriptS脚本、Applet等)就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现。

    通过Referer识别

    根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。在通常情况下,访问一个安全受限页面的请求都来自于同一个网站。

    与XSS攻击的区别:尽管听起来跟XSS跨站脚本攻击有点相似,但事实上CSRF与XSS差别很大,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。

     

    3.SQL注入:所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数,传递到服务端,欺骗服务器最终执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入漏洞,查询非授权信息, 修改数据库服务器的数据,改变表结构,甚至是获取服务器root权限。总而言之,SQL注入漏洞的危害极大,攻击者采用的SQL指令,决定攻击的威力。当前涉及到大批量数据泄露的攻击事件,大部分都是通过利用SQL注入来实施的

    解决方法:使用预编译语句

    预编译语句PreparedStatement是java.sql中的一个接口,继承自Statement接口。通过 Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS先进行编译后再执行。而预编译语句和Statement不同,在创建PreparedStatement对象时就指定了SQL语句,该语句立即发送给DBMS进行编译,当该编译语句需要被执行时,DBMS直接运行编译后的SQL语句,而不需要像其他SQL语句那样首先将其编译。 

    预编译语句使用参数占位符来替代需要动态传入的参数,这样攻击者无法改变SQL语句的结构,SQL语句的语义不会发生改变,即便用户传入类似于前面' or '1'='1这样的字符串,数据库也会将其作为普通的字符串来处理。

    使用ORM框架

    由上文可见,防止SQL注入的关键在于对一些关键字符进行转义,而常见的一些ORM框架,如 ibatis、hibernate等,都支持对相应的关键字或者特殊符号进行转义,可以通过简单的配置, 很好的预防SQL注入漏洞,降低了普通的开发人员进行安全编程的门槛

    通过#符号配置的变量,ibatis能够对输入变量的一些关键字进行转义,防止SQL注入攻击。

    避免密码明文存放

    对存储的密码进行单向Hash,如使用MD5对密码进行摘要,而非直接存储明文密码,这样的好处就是万一用户信息泄露,即圈内所说的被“拖库”,黑客无法直接获取用户密码,而只能得到一串跟密码相差十万八千里的Hash码。

    处理好相应的异常

    后台的系统异常,很可能包含了一些如服务器版本、数据库版本、编程语言等等的信息,甚至是数据库连接的地址及用户名密码,攻击者可以按图索骥,找到对应版本的服务器漏洞或者数据库漏洞进行攻击,因此,必须要处理好后台的系统异常,重定向到相应的错误处理页面,而不是任由其直接输出到页面上。

     

    4.文件上传漏洞:文件上传的时候,没有对于文件的类型进行处理,从而导致攻击者上传了一些恶意的脚本程序,从而达到攻击的目的。

     

    5.DDos漏洞:分布式拒绝服务攻击:

     

    6.DNS Query Flood攻击:采用的方法是向被攻击的服务器发送海量的域名解析请求,通常,请求解析的域名是随机生成,大部分根本就不存在,并且通过伪造端口和客户端IP,防止查询请求被ACL过滤。被攻击的DNS服务器在接收到域名解析请求后,首先会在服务器上查找是否有对应的缓存, 由于域名是随机生成的,几乎不可能有相应的缓存信息,当没有缓存,并且该域名无法直接由该DNS服务器进行解析的时候,DNS服务器会向其上层DNS服务器递归查询域名信息,直到全球互联网的13台根DNS服务器。大量不存在的域名解析请求,给服务器带来了很大的负载,当解析请求超过一定量的时候,就会造成DNS服务器解析域名超时,这样攻击者便达成了攻击目的

     

    7.CC攻击:CC攻击的原理是这样的,攻击者通过控制的大量“肉鸡”或者利用从互联网上搜寻的大量匿名的HTTP代理,模拟正常用户给网站发起请求直到该网站拒绝服务为止。大部分网站会通过CDN以及分布式缓存来加快服务端响应,提升网站的吞吐量,而这些精心构造的HTTP请求往往有意避开这些缓存,需要进行多次DB查询操作或者是一次请求返回大量的数据,加速系统 资源消耗,从而拖垮后端的业务处理系统,甚至连相关存储以及日志收集系统也无法幸免。

    展开全文
  • web安全文件包含渗透攻击

    千次阅读 2019-05-02 18:33:01
    文件包含渗透攻击 严格来说,文件包含漏洞是“代码注入”的一种。其原理就是注入一段用户能控制的脚本...1:Web应用采用include()等文件包含函数通过动态变量的方式引入需要包含的文件; 2:用户能够控制该动态变量...
  • 详解 Web 服务器安全攻击及防护机制 Web 服务器攻击常利用 Web 服务器软件和配置中的漏洞针对这些漏洞最佳做法是遵循一 些方法搭建并运行 Web 服务器本文详解了 Web 服务器保护的一些方法 Web 安全分为两大类 Web ...
  • 远程攻击/渗透基础 Web Application Security Issues Web 1.0和WEB 2.0应用程序攻击手段对比 总结 Web应用安全展望 相关资源
  • XSS攻击Web安全中的一个主要问题,在OWASP(开放Web应用程序安全性项目)的前10名中排名第二。Web应用程序安全风险抵御XSS攻击的传统方法包括基于硬件和软件的Web应用程序防火墙,其中大多数它们是基于规则和签名...
  • Web安全编程实战

    2021-03-03 17:36:37
    Web安全问题,很多时候会被程序员所忽略,因为他们相信会有专业的运维人员或者安全服务团队帮助他们...Web安全现状不容乐观,近几年也存在Web攻击的重大实际案例,比如信息产业部官方报纸《中国电子报》网站被黑、大
  • 安全Web渗透测试(全流程

    万次阅读 多人点赞 2019-10-12 09:59:10
    1 信息收集 1.1域名、IP、端口 域名信息查询:信息可用于后续渗透 IP信息查询:确认域名对应IP,...发现:一共开放两个端口,80为web访问端口,3389为windows远程登陆端口,嘿嘿嘿,试一下 发现:是Window...
  • 当前大多数网络攻击都指向网络应用程序。这些攻击集中攻击那些常见的网络安全漏洞,其中包括跨网站脚本、SQL注入、参数干扰、cookie破坏,以及信息泄露等等。传统的安全防御,例如防火墙以及入侵检测系统,保护不了...
  • WEB安全测试分类及防范测试方法 1 Web 应用程序布署环境测试 2 1.1HTTP 请求引发漏洞的测试 2 1.2 操作系统目录安全性及Web 应用程序布署环境目录遍历问题测试 2 2 应用程序测试 3 2.1 SQL 注入漏洞测试 3 ...
  • 菜鸟浅谈——web安全测试

    万次阅读 多人点赞 2018-02-27 22:29:32
    2)在挖漏洞挣外快时,注意不要使用安全扫描或暴力破解软件对上线网站进行扫描或攻击。 不要对上线网站造成破坏,不要去获取网站的数据库信息等。否则等待的不是money,而是牢狱啦~~ 二:web介绍 1)world wide ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,311
精华内容 46,924
关键字:

web安全攻击的一般流程