-
web top10漏洞
2019-09-11 00:13:26XSS 反射性 (经过服务器) 存储性 (经过服务器) DOM型(没有经过服务器) 主要原因是程序对输入和输出没有做合适的处理,导致恶意代码输出在...SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终...XSS
反射性 (经过服务器)
存储性 (经过服务器)
DOM型(没有经过服务器)
主要原因是程序对输入和输出没有做合适的处理,导致恶意代码输出在前端时被浏览器当作有效代码解析执行从而产生危害。CSRF(跨站请求伪造)
攻击者会伪造一个请求(一般是连接) 然后欺骗受害者点击,受害者点击的那一刻就代表整个攻击完成。sql注入
SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 形成原因是因为数据交互的时候过滤不严格RCE
远程命令执行:应用系统需要给用户提供指定的远程命令接口 如果设计者没有做严格的安全控制 可能就会攻击者通过该接口提交恶意指令 从而让后台执行 进而控制整个后台服务器
远程代码执行:后台过滤不严 把用户输入作为代码的一部分进行执行文件包含
PHP中包含函数 :
include(),include_once()
require(),require_once();
包含函数中包含的代码文件一般是固定的 就不会出现安全问题
但是写成了变量 由前端用户传的 如果没有严密的安全考虑 就可能会引起一些文件包含漏洞 一般分为两种情况 本地文件包含 远程文件包含本地文件包含:只能对本地文件进行包含 但服务器的文件不能被攻击者控制 所以攻击者一般包含一些固定的系统文件 从而读取系统敏感信息 本地包含结合一些特殊的文件上传漏洞 从而形成更大的威力
远程文件包含:能够通过url地址对远程文件包含 意味着攻击者可以传入任意代码 。 直接凉凉 。 (可以通过设置严格的白名单进行过滤)
不安全文件下载
一般点击下载链接的时候 会对后台发送一个下载请求 后台收到请求会开始执行下载代码 如果下载文件的时候没有进行过滤严谨 就可能会引起不安全的文件下载
如果攻击者提交的不是程序预期的文件名 而是精心构造的路径 …/…/…/…/…/etc/passwd 就很有可能会把该指定文件下载下来(密码文件 源代码等等)不安全文件上传
后台对上传文件没有进行任何安全判断或者条件不够严谨 攻击者可能会通过上传一些恶意文件 比如一句话木马 从而导致后台服务器被shell越权
形成原因是后台使用了不合理权限效验规则导致的
普通用户可以操作管理员功能 为垂直越权
普通用户可以查看其他用户 为水平越权目录遍历
web功能设计的是需要把访问的文件定义成变量 这样可以让前端的功能更加灵活 当用户发送一个前端请求时 如果过滤不严谨 攻击者可能会通过…/…/这样打开或执行一些其他文件 从而导致服务器上的其他目录文件被遍历出来 形成目录遍历漏洞敏感信息泄漏
设计者设计不当 不应该被用户看到的数据被轻易访问到。
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;PHP反序列化
序列化和反序列化本身没有问题 但反序列化内容可以被用户控制
且后台不正当使用了php魔法函数 就会导致安全问题
常见的几个魔法函数:__construct()当一个对象创建时被调用 __destruct()当一个对象销毁时被调用 __toString()当一个对象被当作一个字符串使用 __sleep() 在对象在被序列化之前运行 __wakeup将在序列化之后立即被调用
XXE (xml外部实体注入漏洞)
攻击者通过向服务器注入指定的xml实体内容 从而让服务器按照指定配置进行执行 导致问题
也就是 服务端接收和解析了来自用户端的xml数据 而又没有严格的安全控制 从而导致xml外部实体注入URL重定向
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生"跳错对象"的问题。url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站SSRF(服务器端请求伪造)
形成原因 服务器提供了从其他服务器应用获取数据的功能 但又没有对目标地址做严格的过滤和限制
导致攻击者可以传入任意的地址来让后台服务器对其发起请求 并返回对该目标地址请求的数据数据流:攻击者----->服务器---->目标地址
-
安全漏洞top10
2019-04-15 14:54:00OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防 https://blog.csdn.net/lifetragedy/article/details/52573897 转载于:https://www.cnblogs.com/andy9468/p/10710639.html转载于:https://www.cnblogs.com/andy9468/p/10710639.html
-
Owasp Web Top10
2020-12-27 21:47:46Owasp Web Top10 SQL注入 漏洞定义 SQL注入是一种将SQL代码注入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。由于SQL语句本身多样性,以及用于构造的SQL语句...Owasp Web Top10
SQL注入
漏洞定义 SQL注入是一种将SQL代码注入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。由于SQL语句本身多样性,以及用于构造的SQL语句编码方法很多,因此凡是构造SQL语句没有过滤的均存在被潜在攻击的风险 攻击原理 其本质是对于输入的检查不充分,导致SQL语句将用户提交的非法数据当做语句的一部分来执行,简言而之就是用户提交的数据代入数据库的查询。 利用场景 数据泄露,数据丢失,数据篡改; 绕过认证、验证、绕过登录等功能; 服务器进一步被入侵; 数据、功能的损坏; 修复方案 严格限定参数类型; 只要是由固定格式类型的变量,在SQL语句执行前,应该严格按照固定格式检查(数据太大的情况下不适合) 明确参数检验的边界,必须在服务端执行数据验证; 采用参数化查询的方法(推荐) 参数化查询强制开发者先定义所有的SQL语句,然后向每个查询传递参数。使用参数化查询可以使数据库区分代码和数据的区别,用户输入会被当做数据处理,而不是当成代码被执行。 内置过滤系统(本质是黑名单,很常见但不推荐)经常采用addslashes函数,他会在指定的预定义字符前添加反斜杠转义,预定义字符;单引号(‘)双引号(“)反斜杠0 NULL; 链接数据库的应用账号权限最小化原则。
XSS
漏洞定义 跨站脚本发生于在动态生成的web页面直接显示不可信(未严格验证)的外部输入,恶意用户可以利用该缺陷往动态页面中注入恶意script代码再浏览器页面执行。分类为存储型XSS(中危),反射型XSS(低危),DOM型XSS(低危) 攻击原理 存储型XSS: 主要出现在让用户输入数据,供其他浏览此页的用户进行查看的地方,包括留言、评论、博客日志和各类表单等。应用程序从数据库中查询数据,在页面中显示出来,攻击者在相关页面输入恶意的脚本数据后,用户浏览此类页面就可以受到攻击。常见于一些GET、POST请求中,和一些保存型操作中。输入一进入数据库–取出数据库—输出,输入在A处进入数据库,而输出可能出现在其他任何用到数据的地方。 反射型XSS: 主要是将脚本加入URL地址的程序参数里,参数进入程序后在页面直接输出脚本内容,用户点击此类的恶意链接很可能受到攻击。绝大部分是输入在哪里输出就在哪里。输入大部分位于地址栏或者来自DOM的某些属性,也会偶尔有数据在请求中(POST类型)。 DOM型XSS 它和反射型以及存储型XSS的区别在于,DOM XSS的代码并不需要服务器解析响应的直接参与,触发XSS靠的是浏览器的DOM解析,可以认为完全是客户端的事情。 利用场景 获取cookie(对http-only没用) 钓鱼攻击 网站挂马 控制用户的动作(发帖,私信) 修复方案 输入过滤特殊字符 输出编码处理 设置http-only 属性 全局XSS过滤器(推荐)
CSRF攻击
漏洞定义 跨站点请求伪造,在受害者毫不知情的情况下以受害者的名义伪造请求发送给受攻击的站点,从而在并未授权的情况下执行在权限保护之下的操作。 攻击原理 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; 在用户信息通过验证后,网站A产生cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B; 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A; 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。 利用场景 以受害者的名义发送邮件,发消息等; 添加管理员账号提权; 购买商品,虚拟货币转账等; 恶意删除系统数据; 修复方案 验证HTTP Referer字段 HTTP头中有一个字段叫Referer,它记录了该请求的来源地址。通常情况下,访问一个安全受限页面的请求来自于同一个网站。开发人员给所有安全敏感的请求统一增加拦截器来检查Referer的值,验证规则请求referer必须以http://host;port开头, 在请求头中添加token并验证; 在HTTP请求头中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token。 在HTTP头中自定义属性并验证; 和第2中方式一样使用token验证,区别在于并不是以请求参数的形式添加到HTTP请求中,而是放置在http头中自定义的属性里。对于xmlhttprequest的请求,可以通过xmlhttprequest这个类,可以一次性给所有该类请求加上csrftoken这个http请求头属性,并把token值放入其中。
权限绕过/未授权访问
漏洞定义 越权,是超出了权限或权利范围访问系统。多数web应用都具备权限划分和控制,但是如果权限控制功能设计存在缺陷,那么攻击者就可以通过这些缺陷来访问未经授权的功能或数据,这就是我们通常说的越权漏洞。一般将越权分为以下几类: 未授权访问: 管理地址可以直接访问 接口任意调用//RESTful API 静态资源文件直接访问(比如直接下载压缩文件,后台生成的统计文件等) 水平越权 同级别的用户越权访问操作 垂直越权 普通用户越权执行特权用户的操作 利用场景 越权漏洞的危害与影响主要是与对应的业务的重要性有关,比如说某一页面服务器端响应(不局限于页面返回的信息,有时信息在响应包中,页面不一定能看见)中返回登录名、密码、手机号、身份证等敏感信息,如果存在平行越权,通过对用户ID遍历,就可以查看所有用户的敏感信息,这也是一种变相的脱裤,而且很难被防火墙发现,因为这和正常的访问请求没有什么区别,也不会包含特殊的字符,具有十足的隐蔽性。 修复方案 基础安全架构,完善用户权限体系。要知道哪些数据对于哪些用户,哪些数据不应该由哪些用户操作。 鉴权,服务端对请求的数据和当前用户身份做校验; 不要直接使用对象的实名或关键字; 对于可控参数进行严格的校验与过滤。
任意文件上传
漏洞定义 文件上传的功能处,若服务端脚本语言未对上传的文件进行严格的验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务器命令的能力,这就是文件上传漏洞。文件上传漏洞对web应用来说是一种非常严重的漏洞,一般情况下,web应用都会允许用户上传一些文件,如头像、附件等信息,如果web应用没有对用户上传的文件进行有效的检验过滤,那么恶意用户就会上传一句话木马等webshell,从而达到控制web网站的目的。 攻击原理 导致文件上传漏洞的原因比较多,主要包括以下几类: 本地文件上传限制被绕过; 过滤不严格或被绕过; 文件路径截断; 开源编辑器上传漏洞; 中间件解析漏洞; 服务器配置不当-HTTP启用不安全的方法(PUT方法) 上传的文件目录,脚本文件可执行; 对于web server,上传文件或指定目录的行为没有做限制; 利用场景 高危触发点 相册、头像上传; 视频,照片分享; 附件上传(论坛发帖、邮箱) 文件管理器 修复方案 文件扩展名服务器端白名单校验 判断文件类型(可结合MIME Type,后缀检查等方式) 文件内容服务器端检验 上传文件重命名 隐藏上传文件路径 文件上传目录设置为不可执行
任意文件下载/查看
漏洞定义 一些网站有提供文件查看或者下载功能,如果这些操作没对用户进行限制,用户就能查看或者下载任意的文件,可以是源代码文件,敏感文件等等。 攻击原理 都有读文件的函数 读文件的路径用户可控,且没有经过校验,或者校验的不够严格; 输出文件的内容; 修复方案 过滤.(点)、/(斜杠) 正则判断用户输入的参数的格式,看输入的格式是否合法限定文件发个文范围,如php.ini中配置open_basedir
XXE
漏洞定义 XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意的内容,就可以导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。 攻击原理 通常攻击者会将payload注入到XML文件中,一旦文件被执行,将会被读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。换而言之,XXE是一种从本地到达各种服务器的方法。此外,在一定程度上这也可能帮助攻击者绕过防火墙规则或者身份认证检查。 利用场景 远程代码执行,读取服务器文件 修复方案 配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己生命的DTD。具体配置方法参考Fortify代码扫描修复指引中XML注入的修复方案
会话固定攻击
漏洞定义 会话固定(Session fixation)是一种诱骗受害者使用攻击者指定的会话标识(Session fixation)的攻击手段。这是攻击者读取会话标识最简单的方法。会话固定也可以看成是会话劫持的一种类型,原因是会话攻击的主要目的是获得目标用户的合法会话,不过会话固定还可以是强迫受害者使用攻击者设定的一个有效会话,以此来获得用户的敏感信息。 攻击原理 攻击者通过某种手段重置目标用户的SessionID,然后监听用户会话状态; 目标用户携带攻击者设定的SessionID登录站点; 攻击者通过SessionID获得合法会话; 修复方案 每当用户登录的时候就会重置SessionID; SessionID闲置过久时,进行重置SessionID 大部分防止会话劫持的方法对会话固定攻击同样有效。如设置httpOnly,关闭透明化SessionID,User-Agent验证,Token校验等。
敏感信息泄露
漏洞定义 可定位到用户,用户身份属性,认证信息,商业信息等的信息称为敏感信息,通过明文保存,界面未掩码,后端接口返回,直接放在URL中等方式造成数据泄露,称之为敏感信息泄露。 利用场景 数据被盗取贩卖 骚扰电话、垃圾邮件、短信; 电话诈骗等; 修复方案 使用HTTPS传输敏感信息; 敏感信息使用POST请求提交; 界面敏感信息掩码处理; 敏感信息保存需要加密处理;
命令行注入攻击
漏洞定义 Web系统底层去调用系统操作命令,参数接收用户输入,并未过滤用户输入的数据,攻击者可以构造恶意命令或代码形成系统命令执行漏洞; 攻击原理 攻击者控制命令的组成部分,如参数或指令,通过特制的输入数据影响和控制应用执行相关的命令。 利用场景 系统提权;读取/操作系统敏感文件 修复方案 采用白名单方式,对一切用户输入进行校验过滤
-
多罗叶指-Web安全之OWASP TOP10漏洞.pdf
2020-06-18 15:25:17Tsrc线上培训PPT 讲解人 冰尘 -
DASP智能合约Top10漏洞
2018-08-24 14:15:38这是一个开放的合作项目,致力于发现安全社区内的智能合约漏洞。 GitHub地址 https://github.com/CryptoServices/dasp 在了解智能合约Top10之前,我们简单说一下,OWASP Top10。 OWASP: Open Web Application ...该项目是NCC集团的一项举措。这是一个开放的合作项目,致力于发现安全社区内的智能合约漏洞。
在了解智能合约Top10之前,我们简单说一下,OWASP Top10。
OWASP: Open Web Application Security Project这个项目会公开十大web应用程序安全风险
2017年版下载地址http://www.owasp.org.cn/owasp-project/OWASPTop102017v1.3.pdf类似的,我们有了智能合约Top10漏洞。以下是国外原创,翻译过来的,翻译可能不准确,还请理解。
1.重入
也被称为或与空竞争,递归调用漏洞,未知调用等。
这种漏洞在很多时候被很多不同的人忽略:审阅者倾向于一次一个地审查函数,并且假定保护子例程的调用将安全并按预期运行。————菲尔戴安
重入攻击介绍
-
重入攻击,可能是最着名的以太坊漏洞,
-
第一次被发现时,每个人都感到惊讶。
-
它在数百万美元的抢劫案中首次亮相,导致了以太坊的分叉。
-
当初始执行完成之前,外部合同调用被允许对调用合同进行新的调用时,就会发生重新进入。
-
对于函数来说,这意味着合同状态可能会在执行过程中因为调用不可信合同或使用具有外部地址的低级函数而发生变化。
损失:估计为350万ETH(当时约为5000万美元)
攻击发现时间表
2016/6/5——Christian Reitwiessner发现了一个坚定的反模式
https://blog.ethereum.org/2016/06/10/smart-contract-security/2016/6/9——更多以太坊攻击:Race-To-Empty是真正的交易(vessenes.com)
http://vessenes.com/more-ethereum-attacks-race-to-empty-is-the-real-deal/2016/6/12——在以太坊智能合约’递归调用’错误发现(blog.slock.it)之后,没有DAO资金面临风险。
https://blog.slock.it/no-dao-funds-at-risk-following-the-ethereum-smart-contract-recursive-call-bug-discovery-29f482d348b2016/6/17——我认为TheDAO现在正在流失(reddit.com)
https://www.reddit.com/r/ethereum/comments/4oi2ta/i_think_thedao_is_getting_drained_right_now/2016/8/24——DAO的历史和经验教训(blog.sock.it)
https://blog.slock.it/the-history-of-the-dao-and-lessons-learned-d06740f8cfa5真实世界影响
示例
-
一个聪明的合约跟踪一些外部地址的平衡,并允许用户通过其公共资金检索withdraw()功能。
-
一个恶意的智能合约使用withdraw()函数检索其全部余额。
-
在更新恶意合约的余额之前,受害者合约执行call.value(amount)() 低级别函数将以太网发送给恶意合约。
-
该恶意合约有一个支付fallback()接受资金的功能,然后回调到受害者合约的withdraw()功能。
-
第二次执行会触发资金转移:请记住,恶意合约的余额尚未从首次提款中更新。结果, 恶意合约第二次成功退出了全部余额。
代码示例
以下函数包含易受重入攻击影响的函数。当低级别call()函数向msg.sender地址发送ether时,它变得易受攻击; 如果地址是智能合约,则付款将触发其备用功能以及剩余的交易gas:
function withdraw(uint _amount) { require(balances[msg.sender] >= _amount); msg.sender.call.value(_amount)(); balances[msg.sender] -= _amount; }
其他资源
DAO智能合约
https://etherscan.io/address/0xbb9bc244d798123fde783fcc1c72d3bb8c189413#code分析DAO的利用
http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/简单的DAO代码示例
http://blockchain.unica.it/projects/ethereum-survey/attacks.html#simpledao重入代码示例
https://github.com/trailofbits/not-so-smart-contracts/tree/master/reentrancy有人试图利用我们的智能合约中的一个缺陷,盗取它的一切
https://blog.citymayor.co/posts/how-someone-tried-to-exploit-a-flaw-in-our-smart-contract-and-steal-all-of-its-ether/2.访问控制
通过调用initWallet函数,可以将Parity Wallet库合约变为常规多sig钱包并成为它的所有者。
-
访问控制问题在所有程序中都很常见,而不仅仅是智能合约。
-
事实上,这是OWASP排名前10位的第5位。人们通常通过其公共或外部功能访问合约的功能。
-
尽管不安全的可视性设置会给攻击者直接访问合约的私有价值或逻辑的方式,但访问控制旁路有时更加微妙。
-
这些漏洞可能发生在合约使用已弃用tx.origin的验证调用者时,长时间处理大型授权逻辑require并delegatecall在代理库或代理合约中鲁莽使用。
损失:估计为150,000 ETH(当时约3000万美元)
真实世界影响
奇偶校验错误1
http://paritytech.io/the-multi-sig-hack-a-postmortem/奇偶校验错误2
http://paritytech.io/a-postmortem-on-the-parity-multi-sig-library-self-destruct/Rubixi
https://blog.ethereum.org/2016/06/19/thinking-smart-contract-security/示例
一个聪明的合约指定它初始化它作为合约的地址。这是授予特殊特权的常见模式,例如提取合约能力。
不幸的是,初始化函数可以被任何人调用,即使它已经被调用。允许任何人成为合约者并获得资金。代码示例
在下面的例子中,契约的初始化函数将函数的调用者设置为它的所有者。然而,逻辑与合约的构造函数分离,并且不记录它已经被调用的事实。
function initContract() public { owner = msg.sender; }
在Parity multi-sig钱包中,这个初始化函数与钱包本身分离并在“库”合约。用户需要通过调用库的函数来初始化自己的钱包delegateCall。不幸的是,在我们的例子中,函数没有检查钱包是否已经被初始化。更糟糕的是,由于图书馆是一个聪明的合约,任何人都可以自行初始化图书馆并要求销毁。
其他资源
修复Parity多信号钱包bug 1
https://github.com/paritytech/parity/pull/6103/files奇偶校验安全警报2
http://paritytech.io/security-alert-2/在奇偶钱包multi-sig hack上
https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7不受保护的功能
https://github.com/trailofbits/not-so-smart-contracts/tree/master/unprotected_functionRubixi的智能合约
https://etherscan.io/address/0xe82719202e5965Cf5D9B6673B7503a3b92DE20be#code3.算数问题
这个问题,我们之前的文章有提到,也就是比较经典的溢出。
也被称为整数溢出和整数下溢。
溢出情况会导致不正确的结果,特别是如果可能性未被预期,可能会影响程序的可靠性和安全性。———Jules Dourlens
溢出简介
-
整数溢出和下溢不是一类新的漏洞,但它们在智能合约中尤其危险
-
其中无符号整数很普遍,大多数开发人员习惯于简单int类型(通常是有符号整数)
-
如果发生溢出,许多良性代码路径成为盗窃或拒绝服务的载体。
真实世界影响
DAO
http://blockchain.unica.it/projects/ethereum-survey/attacks.htmlBatchOverflow(多个令牌)
https://peckshield.com/2018/04/22/batchOverflow/ProxyOverflow(多个令牌)
https://peckshield.com/2018/04/25/proxyOverflow/示例
-
一个聪明的合约的withdraw()功能,您可以为您的余额仍是手术后积极检索,只要捐赠合约醚。
-
一个攻击者试图收回比他或她的当前余额多。
-
该withdraw()功能检查的结果总是正数,允许攻击者退出超过允许。
-
由此产生的余额下降,并成为比它应该更大的数量级。
代码示例
最直接的例子是一个不检查整数下溢的函数,允许您撤销无限量的标记:
function withdraw(uint _amount) { require(balances[msg.sender] - _amount > 0); msg.sender.transfer(_amount); balances[msg.sender] -= _amount; }
第二个例子(在无益的Solidity编码竞赛期间被发现https://github.com/Arachnid/uscc/tree/master/submissions-2017/doughoyte)
是由于数组的长度由无符号整数表示的事实促成的错误的错误:function popArrayOfThings() { require(arrayOfThings.length >= 0); arrayOfThings.length--; }
第三个例子是第一个例子的变体,其中两个无符号整数的算术结果是一个无符号整数:
function votes(uint postId, uint upvote, uint downvotes) { if (upvote - downvote < 0) { deletePost(postId) } }
第四个示例提供了即将弃用的var关键字。由于var将自身改变为包含指定值所需的最小类型,因此它将成为uint8保持值0.如果循环的迭代次数超过255次,它将永远达不到该数字,并且在执行运行时停止出gas:
for (var i = 0; i < somethingLarge; i ++) { // ... }
其他资源
SafeMath防止溢出
https://ethereumdev.io/safemath-protect-overflows/整数溢出代码示例
https://github.com/trailofbits/not-so-smart-contracts/tree/master/integer_overflow4.未检查返回值的低级别调用
也称为或与无声失败发送, 未经检查发送。
应尽可能避免使用低级别“呼叫”。如果返回值处理不当,它可能会导致意外的行为。——Remix
其中的密实度的更深层次的特点是低级别的功能call(),callcode(),delegatecall()和send()。他们在计算错误方面的行为与其他Solidity函数完全不同,因为他们不会传播(或冒泡),并且不会导致当前执行的全部回复。相反,他们会返回一个布尔值设置为false,并且代码将继续运行。这可能会让开发人员感到意外,如果未检查到这种低级别调用的返回值,则可能导致失败打开和其他不想要的结果。请记住,发送可能会失败!
真实世界影响
以太之王——https://www.kingoftheether.com/postmortem.html
Etherpot——https://www.dasp.co/代码示例
-
下面的代码是一个当忘记检查返回值时会出错的例子send()。
-
如果调用用于将ether发送给不接受它们的智能合约(例如,因为它没有应付回退功能)
-
则EVM将用其替换其返回值false。
-
由于在我们的例子中没有检查返回值,因此函数对合约状态的更改不会被恢复,并且etherLeft变量最终会跟踪一个不正确的值:
function withdraw(uint256 _amount) public { require(balances[msg.sender] >= _amount); balances[msg.sender] -= _amount; etherLeft -= _amount; msg.sender.send(_amount); }
其他资源
未经检查的外部电话
https://github.com/trailofbits/not-so-smart-contracts/tree/master/unchecked_external_call扫描“未经检查 - 发送”错误的现场以太坊合约
http://hackingdistributed.com/2016/06/16/scanning-live-ethereum-contracts-for-bugs/5.拒绝服务
包括达到气量上限,意外抛出,意外杀死,访问控制违规
I accidentally killed it. ————devops199 on the Parity multi-sig wallet
-
在以太坊的世界中,拒绝服务是致命的:
-
尽管其他类型的应用程序最终可以恢复,但智能合约可以通过其中一种攻击永远脱机。
-
许多方面导致拒绝服务,包括在作为交易接受方时恶意行为
-
人为地增加计算功能所需的gas,滥用访问控制访问智能合约的私人组件
-
利用混淆和疏忽,…这类攻击包括许多不同的变体,并可能在未来几年看到很多发展。
损失:估计为514,874 ETH(当时约3亿美元)
真实世界影响
政府
https://www.reddit.com/r/ethereum/comments/4ghzhv/governmentals_1100_eth_jackpot_payout_is_stuck/奇偶校验多信号钱包
http://paritytech.io/a-postmortem-on-the-parity-multi-sig-library-self-destruct/示例
-
一个拍卖合约允许它的用户出价不同的资产。
-
为了投标,用户必须bid(uint object)用期望的以太数来调用函数。
-
拍卖合约将把以太保存在第三方保存中,直到对象的所有者接受投标或初始投标人取消。
-
这意味着拍卖合约必须在其余额中保留未解决出价的全部价值。
-
该拍卖合约还包括一个withdraw(uint amount)功能,它允许管理员从合约获取资金。
-
随着函数发送amount到硬编码地址,开发人员决定公开该函数。
-
一个攻击者看到了潜在的攻击和调用功能,指挥所有的合约的资金为其管理员。
-
这破坏了托管承诺并阻止了所有未决出价。
-
虽然管理员可能会将托管的钱退还给合约,但攻击者可以通过简单地撤回资金继续进行攻击。
代码示例
在下面的例子中(受以太王的启发http://blockchain.unica.it/projects/ethereum-survey/attacks.html#kotet)
游戏合约的功能可以让你成为总统,如果你公开贿赂前一个。不幸的是,如果前总统是一个聪明的合约,并导致支付逆转,权力的转移将失败,恶意智能合约将永远保持总统。听起来像是对我的独裁:function becomePresident() payable { require(msg.value >= price); // must pay the price to become president president.transfer(price); // we pay the previous president president = msg.sender; // we crown the new president price = price * 2; // we double the price to become president }
在第二个例子中,调用者可以决定下一个函数调用将奖励谁。由于for循环中有昂贵的指令,攻击者可能会引入太大的数字来迭代(由于以太坊中的气体阻塞限制),这将有效地阻止函数的功能。
function selectNextWinners(uint256 _largestWinner) { for(uint256 i = 0; i < largestWinner, i++) { // heavy code } largestWinner = _largestWinner; }
其他资源
奇偶Multisig被黑客入侵。再次
https://medium.com/chain-cloud-company-blog/parity-multisig-hack-again-b46771eaa838关于Parity multi-sig钱包漏洞和Cappasity令牌众包的声明
https://blog.artoken.io/statement-on-the-parity-multi-sig-wallet-vulnerability-and-the-cappasity-artoken-crowdsale-b3a3fed2d5676.错误随机
也被称为没有什么是秘密的合约对block.number年龄没有足够的验证,导致400个ETH输给一个未知的玩家,他在等待256个街区之前揭示了可预测的中奖号码。—————阿森尼罗托夫
-
以太坊的随机性很难找到。
-
虽然Solidity提供的功能和变量可以访问明显难以预测的值
-
但它们通常要么比看起来更公开,要么受到矿工影响。
-
由于这些随机性的来源在一定程度上是可预测的,所以恶意用户通常可以复制它并依靠其不可预知性来攻击该功能。
损失:超过400 ETH
真实世界影响
SmartBillions彩票
https://www.reddit.com/r/ethereum/comments/74d3dc/smartbillions_lottery_contract_just_got_hacked/示例
-
甲智能合约使用块号作为随机有游戏用的源。
-
攻击者创建一个恶意合约来检查当前的块号码是否是赢家。如果是这样,它就称为第一个智能合约以获胜; 由于该呼叫将是同一交易的一部分,因此两个合约中的块编号将保持不变。
-
攻击者只需要调用她的恶意合同,直到获胜。
代码示例
在第一个例子中,a private seed与iteration数字和keccak256散列函数结合使用来确定主叫方是否获胜。Eventhough的seed是private,它必须是通过交易在某个时间点设置,并因此在blockchain可见。
uint256 private seed; function play() public payable { require(msg.value >= 1 ether); iteration++; uint randomNumber = uint(keccak256(seed + iteration)); if (randomNumber % 2 == 0) { msg.sender.transfer(this.balance); } }
-
在这第二个例子中,block.blockhash正被用来生成一个随机数。
-
如果将该哈希值blockNumber设置为当前值block.number(出于显而易见的原因)并且因此设置为,则该哈希值未知0。
-
在blockNumber过去设置为超过256个块的情况下,它将始终为零。
-
最后,如果它被设置为一个以前的不太旧的区块号码,另一个智能合约可以访问相同的号码并将游戏合约作为同一交易的一部分进行调用。
function play() public payable { require(msg.value >= 1 ether); if (block.blockhash(blockNumber) % 2 == 0) { msg.sender.transfer(this.balance); } }
其他资源
在以太坊智能合约中预测随机数
https://blog.positive.com/predicting-random-numbers-in-ethereum-smart-contracts-e5358c6b86207.前台运行
也被称为检查时间与使用时间(TOCTOU),竞争条件,事务顺序依赖性(TOD)
事实证明,只需要150行左右的Python就可以获得一个正常运行的算法。————Ivan Bogatyy
-
由于矿工总是通过代表外部拥有地址(EOA)的代码获得gas费用
-
因此用户可以指定更高的费用以便更快地开展交易。
-
由于以太坊区块链是公开的,每个人都可以看到其他人未决交易的内容。
-
这意味着,如果某个用户正在揭示拼图或其他有价值的秘密的解决方案,恶意用户可以窃取解决方案并以较高的费用复制其交易,以抢占原始解决方案。
-
如果智能合约的开发者不小心,这种情况会导致实际的和毁灭性的前端攻击。
真实世界影响
Bancor
https://hackernoon.com/front-running-bancor-in-150-lines-of-python-with-ethereum-api-d5e2bfd0d798ERC-20
https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/TheRun
https://www.dasp.co/示例
-
一个聪明的合约发布的RSA号(N = prime1 x prime2)。
-
对其submitSolution()公共功能的调用与权利prime1并prime2奖励来电者。
-
Alice成功地将RSA编号考虑在内,并提交解决方案。
-
有人在网络上看到Alice的交易(包含解决方案)等待被开采,并以较高的gas价格提交。
-
由于支付更高的费用,第二笔交易首先被矿工收回。该攻击者赢得奖金。
其他资源
在以太坊智能合约中预测随机数
https://blog.positive.com/predicting-random-numbers-in-ethereum-smart-contracts-e5358c6b8620虚拟和解的前卫,悲痛和危险
https://blog.0xproject.com/front-running-griefing-and-the-perils-of-virtual-settlement-part-1-8554ab283e97Frontrunning Bancor
https://www.youtube.com/watch?v=RL2nE3huNiI8.时间操纵
也被称为时间戳依赖
如果一位矿工持有合约的股份,他可以通过为他正在挖掘的矿区选择合适的时间戳来获得优势。———-Nicola Atzei,Massimo Bartoletti和Tiziana Cimoli
-
从锁定令牌销售到在特定时间为游戏解锁资金,合约有时需要依赖当前时间。
-
这通常通过Solidity中的block.timestamp别名或其别名完成now。
-
但是,这个价值从哪里来?来自矿工!
-
由于交易的矿工在报告采矿发生的时间方面具有回旋余地
-
所以良好的智能合约将避免强烈依赖所宣传的时间。
-
请注意,block.timestamp有时(错误)也会在随机数的生成中使用,如#6所述。坏随机性。
真实世界影响
政府
http://blockchain.unica.it/projects/ethereum-survey/attacks.html#governmental示例
-
一场比赛在今天午夜付出了第一名球员。
-
恶意的矿工包括他或她试图赢得比赛并将时间戳设置为午夜。
-
在午夜之前,矿工最终挖掘该块。当前的实时时间“足够接近”到午夜(当前为该块设置的时间戳),网络上的其他节点决定接受该块。
代码示例
以下功能只接受特定日期之后的呼叫。由于矿工可以影响他们区块的时间戳(在一定程度上),他们可以尝试挖掘一个包含他们交易的区块,并在未来设定一个区块时间戳。如果足够接近,它将在网络上被接受,交易将在任何其他玩家试图赢得比赛之前给予矿工以太:
function play() public { require(now > 1521763200 && neverPlayed == true); neverPlayed = false; msg.sender.transfer(1500 ether); }
其他资源
对以太坊智能合约的攻击调查
https://eprint.iacr.org/2016/1007在以太坊智能合约中预测随机数
https://blog.positive.com/predicting-random-numbers-in-ethereum-smart-contracts-e5358c6b8620让智能合约变得更聪明
https://blog.acolyer.org/2017/02/23/making-smart-contracts-smarter/9短地址攻击
也被称为或涉及非连锁问题,客户端漏洞
为令牌传输准备数据的服务假定用户将输入20字节长的地址,但实际上并未检查地址的长度。—-PawełBylica
-
短地址攻击是EVM本身接受不正确填充参数的副作用。
-
攻击者可以通过使用专门制作的地址来利用这一点,使编码错误的客户端在将它们包含在事务中之前不正确地对参数进行编码。
-
这是EVM问题还是客户问题?是否应该在智能合约中修复?
-
尽管每个人都有不同的观点,但事实是,这个问题可能会直接影响很多以太网。
-
虽然这个漏洞还没有被大规模利用,但它很好地证明了客户和以太坊区块链之间的交互带来的问题。
-
其他脱链问题存在:重要的是以太坊生态系统对特定的javascript前端,浏览器插件和公共节点的深度信任。
-
臭名昭着的链外利用被用于Coindash ICO的黑客在他们的网页上修改了公司的以太坊地址,诱骗参与者将ethers发送到攻击者的地址。
发现时间表
-
2017/4/6————如何通过阅读区块链来找到1000万美元
-
https://blog.golemproject.net/how-to-find-10m-by-just-reading-blockchain-6ae9d39fcd95
真实世界影响
未知交换(s)
https://blog.golemproject.net/how-to-find-10m-by-just-reading-blockchain-6ae9d39fcd95示例
-
交易所API具有交易功能,可以接收收件人地址和金额。
-
然后,API transfer(address _to, uint256 _amount)使用填充参数与智能合约函数进行交互:它将12位零字节的地址(预期的20字节长度)预先设置为32字节长
-
Bob(0x3bdde1e9fbaef2579dd63e2abbf0be445ab93f00)要求Alice转让他20个代币。他恶意地将她的地址截断以消除尾随的零。
-
Alice使用交换API和Bob(0x3bdde1e9fbaef2579dd63e2abbf0be445ab93f)的较短的19字节地址。
-
API用12个零字节填充地址,使其成为31个字节而不是32个字节。有效地窃取以下_amount参数中的一个字节。
-
最终,执行智能合约代码的EVM将会注意到数据未被正确填充,并会在_amount参数末尾添加丢失的字节。有效地传输256倍以上的令牌。
其他资源
ERC20短地址攻击说明
http://vessenes.com/the-erc20-short-address-attack-explained/分析ERC20短地址攻击
https://ericrafaloff.com/analyzing-the-erc20-short-address-attack/智能合约短地址攻击缓解失败
https://blog.coinfabrik.com/smart-contract-short-address-attack-mitigation-failure/从标记中删除短地址攻击检查
https://github.com/OpenZeppelin/zeppelin-solidity/issues/26110.未知的未知物
我们相信更多的安全审计或更多的测试将没有什么区别。主要问题是评审人员不知道要寻找什么。———Christoph Jentzsch
-
以太坊仍处于起步阶段。
-
用于开发智能合约的主要语言Solidity尚未达到稳定版本
-
而生态系统的工具仍处于试验阶段。
-
一些最具破坏性的智能合约漏洞使每个人都感到惊讶
-
并且没有理由相信不会有另一个同样出乎意料或同样具有破坏性的漏洞。
-
只要投资者决定将大量资金用于复杂而轻微审计的代码
-
我们将继续看到新发现导致可怕后果。
-
正式验证智能合约的方法尚不成熟,但它们似乎具有很好的前景,可以作为摆脱今天不稳定现状的方式。
-
随着新类型的漏洞不断被发现,开发人员需要继续努力
-
并且需要开发新工具来在坏人之前找到它们。
-
这个Top10可能会迅速发展,直到智能合约开发达到稳定和成熟的状态。
-
-
owasp top10漏洞讲解
2018-07-22 09:20:40web渗透之逻辑漏洞,1. 注入 2. 失效的身份认证和会话管理 3. 跨站攻击 4. 不安全的对象直接引用 5. 伪造跨站请求 6. 安全配置错误 7. 限制URL访问失败 8. 未验证的重定向和转发 9. 应用已知脆弱性的组件 10. 敏感... -
OWASP 2017 Top10 漏洞体系
2019-12-19 12:56:56OWASP Top10漏洞体系长期以来作为Web攻防白帽子既基础又核心的一个标准。漏洞标准变化如下: 变化内容: 合并了2013-A4“不安全的直接对象引用”和2013-A7“功能级访问控制功能缺失”到2017... -
Owasp Top10 Web安全宝典-常见漏洞及修复方案
2020-06-05 22:30:15漏洞定义 SQL注入是一种将SQL代码注入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。由于SQL语句本身多样性,以及用于构造的SQL语句编码方法很多,因此凡是... -
Web漏洞学习手册
2019-10-08 11:26:34本文是对Web中最常见漏洞的一个小结,既然是Web漏洞,那自然而然不能忽略了OWASP Top10了。最新版的OWASP Top10还是2017年公布的。如下: 注入 失效的身份认证 敏感信息泄露 XML 外部实体(XXE) 失效的访问... -
web漏洞之越权漏洞
2020-12-20 00:16:24越权漏洞十分常见,属于 OWASP TOP10的漏洞类型之一 作为一个常见的逻辑漏洞,越权漏洞的危害和影响与对应业务的重要性成正相关 越权漏洞的挖掘常常要求白帽子足够的细心,每一个可能产生问题的业务点都考虑到了权限... -
OWASP Top10 Web应用中最常见的10大漏洞
2020-09-10 10:42:26Official OWASP Top 10 Document Repository §OWASP Top 10 2017 (PDF) §OWASP T10 Wiki homepage §OWASP 2017 Summit Outcomes OWASP Top 10 简单介绍 OWASP Top 10 2017 | 最新十大WEB安全风险你都GET到了吗 -
渗透测试必知必会—Web漏洞
2017-07-03 10:37:00本文为对WEB漏洞研究系列的开篇,日后会针对这些漏洞一一研究,敬请期待 0x01 目录 0x00 前言 0x01 目录 0x02 OWASP TOP10 简单介绍 0x03 乌云TOP 10 简单介绍 0x04 非主流的WEB漏洞 0x02 OWASP ... -
《Metasploit渗透测试魔鬼训练营》笔记 Web 应用渗透
2020-05-13 14:01:27文章目录web应用缺陷OWASP web 漏洞TOP10Metasploit的Web应用渗透技术web应用漏洞扫描开源工具W3AFSQL注入跨站脚本攻击autopwn创建自己的模块 web应用缺陷 广泛性 技术门槛低 防火墙可绕过性 安全机制不够成熟 隐蔽... -
[原创]解读2017 OWASP Top10漏洞体系(含接口安全)
2017-04-27 14:55:002017年4月初,OWASP发布了关于Top10的征求意见版。 争议最大的是A7攻击检测与防范不足。 但我主要是按照日常的渗透漏洞进行解读分析的。 解读完毕后,首发t00ls原创...OWASP Top10漏洞体系长期以来作为Web攻防白帽... -
最新十大web安全隐患-四年之后,OWASP发布新版本OWASP Top10 2017
2017-11-23 16:42:51这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。 OWASP Top 10则是OWASP项目总结的10大最关键Web应用安全隐患列表... -
最新十大web安全隐患-四年之后_OWASP发布新版本OWASP Top10 2017
2017-11-23 14:06:10这个列表总结了Web应用程序最可能、最常见、最危险的十大漏洞,可以帮助IT公司和开发团队规范应用程序开发流程和测试流程,提高Web产品的安全性。 OWASP Top 10则是OWASP项目总结的10大最关键Web应用安全... -
OWASP top10 详解
2019-11-24 11:09:56排行榜(1)SQL 注入(2)失效的身份认证和会话管理(3)跨站脚本攻击 XSS(4)直接引用不安全的对象(5)安全配置错误(6)敏感信息泄露(7)缺少功能级的访问控制(8)跨站请求伪造 CSRF(9)使用含有已知漏洞的组件(10)未验证的... -
漏洞 立即留言_web安全之跨站脚本漏洞(XSS)
2020-12-19 21:25:45XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。形成XSS漏洞的主要原因是程序对输入和输出没有做... -
OWASP Top10 2020
2020-10-25 03:22:24OWASP Top 10 2020什么是OWASP漏洞简介1. Top1-注入2....之前主要是做二进制,最近找工作的时候看到很多公司要求掌握WEB漏洞,所以简单地学习一下。OWASP(Open Web Application Security Project)是 -
笔记-Web安全与漏洞
2019-04-29 17:13:15也就是传说中的-----OWASP TOP10 http://www.owasp.org.cn/ 这个会不定时的更新,而且里面说例子和原理都挺全面的, 大家可以去这里看到最新的威胁排行 OWASP: 开放式Web应用程序安全项目(OWASP)是一个非... -
Owasp top10 小结
2020-10-13 19:47:23Owasp top10 1.SQL注入 原理:web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过恶意的sql语句来实现对数据库的任意操作。 2.... -
web前端笔记之Web前端的安全与漏洞
2019-05-05 10:35:00也就是传说中的-----OWASP TOP10 http://www.owasp.org.cn/ 这个会不定时的更新,而且里面说例子和原理都挺全面的, 大家可以去这里看到最新的威胁排行 OWASP: 开放式Web应用程序安全项目(OWASP)是一个非... -
web渗透测试-从入门到放弃-04XSS漏洞
2019-10-28 23:20:13XSS(跨站脚本)概述 Cross-Site Scripting 简称为“CSS”,为避免与...XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。 XSS是一种发生在前端浏览器端的漏洞,所以其危... -
关于OWASP TOP10的一点知识
2018-12-15 15:42:43安全弱点:web安全漏洞 安全控制:防火墙 技术影响:数据丢失等 业务影响:丢失用户等 三 OWASP TOP10详解 1 SQL注入 2 失效的身份认证 3 敏感信息泄露 4 XML的外部实体(XXE) 5 失效的访问控制 6 ... -
OWASP TOP10(2017)总结学习
2020-04-18 11:51:07OWASP TOP10(2017)总结学习 一、背景 OWASP(Open Web Application Security Project)开源Web应用程序安全项目。 OWASP Top 10是OWASP组织基于超过 40家专门从事应用程序安全业务的公司提交的数据,以及500位以上...
-
一天学完MySQL数据库
-
使用Jenkins搭建iOS/Android持续集成打包平台
-
Mac启动Eclipse提示Failed to create the Java Virtual Machine
-
华为HCNA路由与交换eNSP实战(5)RIPv2基础配置
-
iptables 企业级防火墙配置(四表五链)
-
Linux下jar包后台运行
-
Java并发之CompletionService详解
-
使用内置传感器的LED进行LED热阻和TIM评估的研究
-
【阿里巴巴】22届春招-免笔试
-
C++代码规范和Doxygen根据注释自动生成手册
-
线性表_链式存储
-
基于流形结构的图像地理信息标注方法
-
ASHRAE 2011 Data Center Thermal Guidelines Whitepaper.pdf
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
RapidScada从入门到精通
-
NearFi应用-源码
-
【布道者】Linux极速入门
-
朱老师C++课程第3部分-3.6智能指针与STL查漏补缺
-
关于绝热演化的一般模型
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)