CheatSheet之通用WEB漏洞挖掘

Published: 二 23 十一月 2021

In Misc.

我主要是通过各种手段得到代码/伪代码再百盒分析,所以本文按百盒的视角记录的,持续更新....

挖掘套路

我感觉漏洞挖掘需要三点:

  1. 基础知识:各种漏洞定义,原理,危害,绕过等...
  2. 技巧:各种经验技巧,需要多看多挖多总结...
  3. 套路:也就是方法论,先怎么再怎么...

于是打算写下几篇笔记,来记录这些东西。

组合拳:

  1. 搭好环境,配好调试
  2. 分析攻击面,一般WEB应用就它本身,可能会携带容器,WEB应用里如业务逻辑,框架,组件等
  3. 分析整体架构,URL路由
  4. 开搞,上方法论

方法论:

  1. 正向追踪:一般对授权前页面分析
  2. 逆向追踪:从危险点向前找看是否能控制输入
  3. 定向审计:凭经验看哪些地方容易出问题先重点看
  4. 历史漏洞:分析有哪些组件,分析它们的历史漏洞看容易出什么问题,看是否都修了

下面列出了一些漏洞挖掘点,这其实就是挖掘面,这需要不断的积累(持续更新),否则漏洞摆在那也不知道,详细的细节可查看备忘录datasheets和测试向导web-secruity-testing-guide...

历史漏洞

包括组件本身及自身的依赖,在必要时进行Component Analysis,它会分析引入的三方库的多维度信息,最终决定是否是危险组件,若是危险组件可从已公开漏洞或自行审计的角度进行分析,cyclonedx可用于组织依赖信息。可去tanable plugin搜索漏洞插件,例如编辑器就容易出1day,java里常见的shiro,struts等也是... ​

通用漏洞

这里只记录和语言无关的漏洞,其他的在特定语言处记录...

注入类

SQL注入(SQLI)

若使用了SQL那看看它是咋处理输入的,是否都是用的预编译方式:

  1. 若是比较热门的框架(如sqlalchemy)啥的就不先看这本身是否有问题了,去找找是不是所有地方都是用的这种方式,有没有地方漏掉了或误用了(有些会先拼接再预编译或混合使用部分代码直接使用拼接,如Like语句参数化查询),
  2. 对于没有用框架的看看是怎么处理的,若是过滤就看能不能饶,绕的思路就是前后端处理不一致,如编码/大小写/添加无效字符/内联注释/多重敏感词/等价替换/宽字节注入/溢出截断,必要时可fuzz不一致的符号。

未正确使用PDO依然会出问题,比如说去拼接。。。。报错 PDO默认是允许多句执行和模拟预编译的,在之前的很多文章中已经写到,在参数可控的情况下,会导致堆叠注入。 PDO::ATTR_EMULATE_PREPARES PDO::ATTR_ERRMODE PDO::MYSQL_ATTR_MULTI_STATEMENTS 模拟预编译是PHP层次的预编译,它会使用一些转义,但是对于宽字节注入等依然可以绕过,另一种在SQL端预编译相对更安全。 ​

附 注入方式:

方法 说明
Union注入 NULL
报错注入 开启错误输出时,可使用updatexml/floor/exp
带外注入 把数据通过其他方式传出,如DNS查询时带出
堆叠注入 能堆叠那不是为所欲为,MSSQL默认有滴
布尔型盲注 返回的信息能不一致时用它
时间型盲注 返回一样时根据时间来,如sleep/benchmark
二次注入 能修改/增加数据且可插入'等符号,会获取数据拼接入语句再次查询

查找时,可使用一些监控软件辅助,如开启MySQL执行监控:

set global general_log=on;
set global log_output='table';

XML外部实体注入(XXE)

遇到xml解析的,看看它是否支持外部实体功能,是否开启了该功能,可以就搞事情,参考[1]xxe,[2]synacktiv_drupal_xxe_services

命令注入

黑盒可以凭直觉猜哪些地方的功能使用了外部工具,如网络相关的,系统相关的设置等,都比较喜欢偷懒觉得用外部工具一条命令的事;有代码当然是直接根据语言查找对应的危险函数,找到后看命令是否可控,是怎么过滤的,如果使用语言提供的过滤功能一般就没命令注入了,但可以再注意下参数注入,如果自己实现的过滤,参考shell部分看是否可以绕过。

代码注入

比较少见,就找根据语言找对应的代码执行危险函数,特定的脚本执行/编译库,语言特性函数(反射等)...

CRLF注入

在写日志,写配置,解析头部等位置要小心...

LDAP注入

和SQL注入挺像,遇到LDAP查询时注意,可参考LDAP注入与防御解析

文件相关

文件上传

找上传点,分析怎么过滤的,研究是否可以绕:文件类型,文件头,文件后缀,文件包含,解析问题,系统特性等...

目录穿越

就是看../这种能不能过,还有软连接问题,在遇到压缩/归档文件时,可留意下目录穿越,这个其实可以准备一堆畸形文件运行试试,或者直接看它的解压代码有没有对文件名进行过滤,现在有名的库的最新版基本都没问题,如果遇到老版本或不知名/自己实现的库则要注意,可参考zip-slip-vulnerability对比版本。在可上传压缩包时有很多点可审计,如让压缩包解压一般崩溃,让压缩包携带恶意文件等...

文件包含

本地与远程文件包含(PHP中开启allow_url_include)

不一致问题

其实很多绕过都是不一致导致的,此处只列其他分类放不下的:

请求走私(Request Smuggling)

在设备中常见存在多层服务,并在第一层(前端)做些处理后给第二层(后端),如nginx作为网关再将指定数据转发给后端的apache,这里面可能会涉及到对请求分包不一致问题,此时就可能存在漏洞,根据XC大佬的总结:

  1. 若后端支持从一个连接中获取多个请求包(如支持keepalive)
  2. 前后端分包解析存在不一致(不一致问题是漏洞挖掘的重点)

这就可能存在漏洞,在我们的场合中请求走私更像一种SSRF,能携带任意HTTP包到后端,一般认为它有如下危害:

  1. 绕过限制:可能前端需要对请求做某些处理后再发到后端,此时构造的数据将会被修改,而通过走私能控制整个请求数据包。
  2. 类似CSRF:将自己构造的头部与其他用户构造的头部合并,以利用其他用户的token进行操作
  3. ETC...

参考:[1]协议层的攻击——HTTP请求走私,[2]HTTP Desync Attacks: Request Smuggling Reborn,[3]HTTP request smuggling,[4]HTTP协议攻击方法汇总(上)

HTTP参数污染(HPP)

看看怎么处理多个同名参数的 ​

JWT误用

遇到这个先看看,这部分很容易出问题:

  1. 密钥硬编码(黑盒时可以直接用网上的字典试试),遇到了不知道多少次
  2. 支持RS256转HS256,None等,或者在实现上根本不校验签名

服务端请求伪造(SSRF)

SSRF在设备上太好用了,也是重点关注的对象,审计时就是找发请求的api,根据语言来找,如python的socket/urllib/requests等,这个必须根据具体环境去找,若它的参数来自用户且使用了过滤则很可能有问题,因为过滤很难防御(如IP的编码,域名绕过等),若只是IP一般是将其转换为数字再起匹配而不是使用正则,另外还有个点就是跟随重定向,通过这可以绕过一些限制,配合黑盒时可参考SSRF漏洞的挖掘经验找危险点... 当存在SSRF漏洞时,需要研究函数的功能,如它支持哪些特性,哪些伪协议,这可能可实现一些绕过,命令执行,发送任意数据等... ​

硬编码

先把配置文件,代码等位置的字符串等数据研究一遍,是不是什么密钥,是不是每次启动/安装时随机生成的,是否可预测... ​

密码学相关误用

密码学相关的漏洞,一般就关注如下点:

  1. 随机数/种子强度如何,是否是密码学安全的,是否能通过某些数据推测种子...
  2. Hash是否强度够,是否有碰撞影响,是否受hash长度扩展攻击影响
  3. 密钥是否硬编码,能否通过各种方式得到
  4. 在填充时是否受PaddingOracle的影响
  5. 加密/签名方案是否有问题,是否有误用

信息泄漏

和黑盒关注的点不同,此处关注代码本身会泄漏信息,如它是否会产生或存在一些路径可预测可访问的文件,某些请求获取携带敏感数据的响应等...

不完全的审计

包括与日志相关的:在某些点需要记录日志但没有记录,或能绕过,或能污染日志 与访问限制相关的:有些点没有或可绕过访问限制,如登陆尝试次数等

系统特性

Windows下FindFirstFileExW,FindFirstFile存在如下特性:

大于号 > 等价于 通配符 ? 0次或1次

小于号 < 等价于 通配符 * 0次或多次

双引号 " 等价于 通配符 . 匹配除换行符(\n, \r)之外的任意单个字符

https://www.secshi.com/16971.html

上传时evil.php. evil.php 会被去掉, %00``%80-%90会被截断,另外还有NTFS ADS特性 ​

短文件名 能穿越且是黑名单时可覆盖.htaccess

逻辑漏洞

竞争条件

若使用共享对象未加锁就会有条件竞争,如打开某文件,读取内容修改并写回若无锁则会有问题... 还有有时会生成临时文件,抓住它的存活间隙可能有收获... ​

越权

分为横向越权与纵向越权,就看某操作获取的参数所需权限是否与身份相关,若是则分析此处是否有授权验证,是否未验证身份,是否直接使用了请求传递的身份,是否逻辑上可绕过某些验证(如双因素)等...

其实主要是找关键逻辑,如登录逻辑,购买流程,修改流程,看是否会有逻辑上的问题导致漏洞...

解析漏洞

  • iis6.0不解析;后面的,如 .php;.jpg,另外有双文件上传,00截断,.asp文件夹
  • apache从右到左,直到找到能解析的后缀
  • iis7.0/7.5 evil.jpg/evil.php
  • nginx 访问时 evil.jpg/.php

其他没啥用的东西

不会真有人会挖这玩意儿吧!在审计内部产品时可能还真得有,特别是产品专门做了相关的防护时更得检查是否可以绕过。 ​

跨站脚本(XSS)

只要看到客户的输入被返回到客户页(DOM型不会经过服务端)了就要小心,特被注意一些输入框的后台逻辑,如果它用的是过滤的话看看能不能绕,如果是某种牛批的转意就选择放弃吧,反正也没啥用。。。

客户端请求伪造(CSRF)

先看看防护方式:

  1. 检查Referer
  2. 带随机Token
  3. 重输入关键信息

现在一般token用的最多,一般审计的点就是token是否可预测(例如通过某硬编码密钥去生成与校验,还有一个token可以被别人用的),token检查是否覆盖全了(有些关键位置的关键方法被漏了),是否可以让token失效 ​

相对路径覆盖(RPO)

用的是相对路径...扫描器可以用来骗洞,可参考:[0] RPO Gadgets,[1] RPO,[2] detecting-and-exploiting-path-relative-stylesheet-import-prssi-vulnerabilities

缓存投毒(CP)

要有缓存的,研究下缓存的键是啥,再去构造同键不同值的情况污染缓存,可参考[1]Practical Web Cache Poisoning,[2]Web Cache Deception Attack

任意重定向

就是正常的URL带异常的尾巴,去那些容易出现重定向的位置,如登录页找,有代码直接根据重定向函数找,看是否过滤的好... ​

语言相关

PHP

php有很多语言特性可能会造成安全问题...危险函数:

类型 说明
命令执行 system(),     passthru(),    exec(),     shell_exec(, ``    ,     popen(),     proc_open(),     pcntl_exec(
代码执行 eval\s(,     asert\s( ,preg_replace\s(,     call_user_func\s(,    include,    require,call_user_func_array(,     create_function(,     array_map(,     ob_start(,     mail(,     usort,     uasort
反序列化 unserialize,    phar
变量覆盖 $$,    extract,    parse_str,    import_request_variables,    register_globals=ON(配置文件)
文件操作 file_get_contents,    file_put_contents,move_uploaded_file,    rename,unlink,    rmdir,fopen,    fread,    fwrite,    fputs,    fgets,    fgetc
解码操作 base64_decode,    urldecode,    decode,aes,    des,    sm4,    (a)rc4,    ,blowfish,    ,crypt,    decrypt,md5,    auth, rand,    srand,    seed

短标签:

<?php ?>
<%  %>  <!--需要开启 -->
<?  ?>
<?= >  <!--总是有效 -->
<script language="php"> </script>  

一些语言特性:

特性 说明
弱类型 ==与===,字符串与数字比较等,0与false等
反序列化漏洞 反序列化可构造任意值,而一些魔法方法(__destruct、__toString、__sleep、__wakeup、__call、__construct)若存在问题可执行危险操作
截断 在旧版中\x00会被截断(Windows也会有),iconv在转换时遇到非法字符也可能会截断
伪协议 如gopher,zip,phar,php等协议
变量覆盖 如$$等可覆盖其他变量的值

特殊配置:

配置 说明
register_globals 早期支持,会把请求注册到全局
magic_quotes_gpc 设置后GPC的'"\0x00会被转意
disable_functions 限制了能使用的函数,通过其他其他组件绕
open_basedir 限定了能打开的目录,可通过DirectoryIterator+Glob绕

shell

shell需要过滤的字符:"|<>(){}`;&$\r\n",\在不需要转义的字符上无效 绕过空格的方式:

${IFS} $IFS$9 %09 # url编码

Python

类型 说明
沙盒逃逸 Python 沙盒绕过禁用import的情况下绕过python沙箱用python继承链搞事情...
反序列化 PyYalm和自身的序列化都可实现任意代码执行,存放于外部的pickle数据也是不安全的,如redis可能存在漏洞数据被改写,可参考Python反序列化漏洞的花式利用Python pickle 反序列化实例分析...
格式化串 Python格式化字符串漏洞(Django为例),Python的format若能控制格式化串则可泄漏任意数据,而f’’型若内容可控则可执行任意代码,不过后者出漏洞的情况应该很少。Python Web之flask session&格式化字符串漏洞。对此的防御当然是不让它可控最好,若实在要可控就上沙盒过滤吧
命令注入 Python内置的代码注入就是system/popen/subprocess/getoutput等方法,一般现代的代码会使用subprocess库,此时就看有没有用shell=True与列表传指令参数,其他若是拼接当然是看过滤是否可以绕过,shlex.quote(),可参考Python Command Execution
代码注入 eval/exec/timeit/execfile/assert/compile/input,一般eval可考虑用ast.literal_eval或json等函数代替
模板注入 模板注入一般会用到格式化串和沙箱逃逸的方法
目录穿越 有个经典的问题就是在目录拼接时,追加的路径以/开始将丢弃前面的目录,以此作为起始位置继续拼接

其他还可参考:[0]Pythonanquan,[1]关于Python sec的一些简单的总结

之前还有两个有名的CRLF漏洞urllib header inject(CVE-2016-5699,CVE-2019-9740) 有时也要关注导入的库,特别不知名的库可能就写了漏洞

其他语言

这部分没怎么总结过,因此先扔这里:

JS

最出名的是原型链污染,js是基于原型的,在读写属性时若本地没有则会向上查找,可通过这种特性去修改原型链上的属性值,基于该原型的其他实例可能会使用该值,进而造成其他漏洞,如kibana曾经爆的命令执行漏洞,可参考:[1]深入理解 JavaScript Prototype 污染攻击,[2]Prototype pollution attack

另外它也逃不脱反序列化影响,而且它的反序列化是最容易利用的,既不需要利用链也不需要构造复杂的payload,见利用 Node.js 反序列化漏洞远程执行代码

Buffer(Num)会存在未清空数据...

Java

太特殊了,单独成章。

Lua

  1. 代码执行:loadfile,dofile,loadstring,require,loadlib

Perl

  1. 命令执行:system,exec,execvp,