渗透测试工程师:模拟黑客角度入侵企业以达到测试企业安全防御体系的目的。
渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。
渗透测试是模拟黑客攻击测试,但两者也有区别,渗透测试是“面”的测试,黑客攻击是“深度”测试。前者涉及内容更加广泛,后者讲究的是破坏性。
常见web安全漏洞
- SQL注入漏洞
- 命令(代码)注入
- 跨站脚本注入XSS(Cross Site Script Inject)
- 客户端请求伪造(CSRF)
- 服务端请求伪造(SSRF)
- 任意文件上传
- 文件包含(LFI/RFI)
- XML实体注入 XXE
SQL注入漏洞
SQL是用于访问和处理数据库的标准的计算机语言。SQL注入,就是把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,以达到欺骗服务器执行恶意SQL命令的目的。
SQL注入的分类
- 报错注入
- union注入
- 时间盲注
- 布尔盲注
- 堆叠盲注
常见的注入语句:
‘ or 1=1
‘ or 1=1#
‘ or 1=1- -
‘ or 1=1/*
命令注入漏洞
通过提交恶意构造的参数,破坏命令语句结构,从而达到执行恶意命令的目的。
XSS攻击
全称Cross Site Scripting,跨站脚本。
XSS攻击主要分为三类:
- 反射性XSS
- 存储型XSS(最隐蔽的攻击类型)
- DOM型XSS
上述三种类型的XSS也可以根据输出点的不同分为三类:
- 输出在html属性中
- 输出在CSS代码中
- 输出在JavaScript中。
XSS盲注的特点:
- 通常不会立即触发;
- 通常无任何及时响应;
- 是否XSS注入成功未知;
- 危险系数较高。
XSS的防御
- http-only设置,导致拿不到cookie
- 对用户输入进行过滤
- 对用户输出进行过滤
常用的XSS语句:
<svg onload=alert(1)>
直接输出HTML
<input value="autofocus onfocus=alert(1)//">
未过滤,输出在input框中
value=""><svg onload=alert("XSS")//">
未过滤,其他属性值中
<script>var a=""-alert(1)//";</script>
未过滤,输出在JS变量中
<script>var website="xxxx"</script><script>alert(1)//";</script>
未过滤,输出在JS变量中
绕过XSS过滤的方法:
-
大小写:
<sCriPt>alert(1)</sCriPt>
-
组合过滤:
<scr<script>ipt>alert(1)</sc<script>ript>
-
输出在JS中:
-
JS单行注释:利用换行符,回车符-》
%0d, %0a
-
JS多行注释:利用多行注释符,
*/
-
URL编码:
encodeURIComponent("<svg onload=alert(1)>") "%3Csvg%20onload%3Dalert(1)%3E"
-
XSS本地存储:
localStorage.setItem()
XSS 攻击的要点:构造XSS payload,打破html结构,使其出错,利用错误信息进一步完善payload以达到攻击目的。
可能回遇到的困难:
-
语句过长,输入长度受限;
-
有过滤机制
-
有Waf
URL Redirect URL重定向漏洞
URL跳转,URL重定向漏洞,由于目标网站未对程序跳转的URL地址及参数做合法性判断,导致应用程序直接跳转到参数中指定的URL地址。
危害:
- 可将跳转URL地址修改为指向恶意地址,即可发起网络钓鱼、诈骗甚至窃取用户凭据等。
常见的应用场景:
-
主要是业务逻辑中需要进行跳转的地方。
-
比如登录处,注册处,访问用户信息,订单信息,加入购物车,分享,收藏等处。
// URL跳转参数
redirect
url
redirectUrl
callback
return_url
toUrl
ReturnUrl
fromUrl
redUrl
request
redirect_to
redirect_url
jump
jump_to
target
targetUrl
to
goto
link
linkto
domain
oauth_callback
referrerdomain
next
service
Google serarch 大法
inurl:redirect_url intitle:登录 -"keywords" -"博客" -"wordpress" -"blog" intext:验证码
SSRF
Server-Side Request Forgery:服务器端请求伪造,攻击者构造成服务端发起请求的一个安全漏洞。 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤和限制。 SSRF漏洞一般位于远程图片加载与下载、图片或文章收藏功能、URL分享、通过URL在线翻译、转码等功能点处。
文件包含
程序猿通常会把可重复使用的函数写到单个文件中,在使用其它函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般称为包含;程序猿希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。
分类:
- 本地包含
- 远程包含
任意文件上传
攻击者通过上传木马文件,获得webshell,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。
修复方案:
- 对文件格式限制,只允许某些格式的文件上传;
- 对文件格式进行校验,前端跟服务器都要进行检验,(前端校验扩展名,后端校验扩展名、content-type等)
- 将上传目录放置到工程目录之外,当作静态资源路径,对文件的权限进行设定,禁止文件下的执行权限。
反序列化
把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化,在java中比较常见,ObjectInputStream类的readObject()方法用于反序列化。
XML实体注入
XXE的危害
- 读取任意文件
- 执行系统命令,但需要有 expect 插件
- 扫描网站的端口以及是否存在某些目录或文件
-
通过 http 协议发起 SSRF 攻击 如何防御XXE攻击?
-
使用开发语言提供的禁用外部实体的方法
- 过滤用户提交的XML数据
漏洞防御
没有绝对安全系统
防护的三个方面:
- 从源头上解决
- 通过过滤代码
- 第三方的防护
web漏洞是渗透测试的基础
理解漏洞原理能帮助我们更好的挖掘漏洞
攻防是一个整体
渗透测试的三种类型:
- 黑盒渗透测试
测试人员没有被提供更多他要渗透目标的信息,却有责任收集有关目标网络,系统或者应用程序的信息。
- 白盒渗透测试
测试人员将获得有关网络,系统或应用程序的完整信息以及源代码,操作系统详细信息和其他有关信息。可以认为是模拟内部来源的攻击。
- 灰盒渗透测试
测试人员将具有网络,系统或应用程序的部分信息。可以认为是外部黑客的攻击,黑客已经非法访问组织的网络基础设施文档。
渗透测试执行标准(Penetration Testing Execution Standard:PTES)
- 前期交互: 确定项目范围,周期,采用的技术手段和工具,以及其他约束条件
- 信息收集: 收集目标相关资产信息,包括域名,IP,邮箱,防御措施等。
- 威胁建模: 利用已经收集的信息对目标资产进行分析,获取其可能存在的威胁,并规划攻击路径。
- 漏洞分析: 发现目标系统和应用中存在的漏洞
- 漏洞利用: 对发现的漏洞使用攻击向量进行攻击
- 后渗透: 建立立足点,进行持续维权以及内网渗透,获取指定的渗透目标数据、权限等。清理。
- 报告: 输出渗透测试报告
渗透测试执行流程
- 目标确认: 渗透约束条件和渗透最终目标
- 信息收集: 收集目标范围内的各类信息
- 漏洞发现: 在信息收集的基础上,发现目标应用系统的漏洞
- 漏洞利用: 对发现的目标漏洞进行利用,通过漏洞利用获取目标系统权限
- 权限维持,内网渗透: 进入目标系统,进行横向拓展,向渗透目标靠近
- 目标获取,清理痕迹: 获取渗透目标权限或数据,回传数据,清理痕迹
渗透测试的本质是信息收集
收集的信息越多,意味着攻击面越广
当渗透没有思路的时候,再重新回到信息收集 ---- Micropoor
四个维度的漏洞发现:
- 传统漏洞
- 利用通用漏洞
- 弱口令等目标脆弱点
- 代码审计
UDF提权
Userdefined function 用户自定义函数,Mysql为用户提供的一个扩展功能的接口。用户可以通过编写代码的方式编译成.so .dll文件,使用自定义的函数。
UDF提权的条件 * 需要Mysql高于5.1的版本 * .so .dll文件必须放在mysql的plugin目录下
redis提权
利用其服务端的程序的配置问题或漏洞来进行提权
获取shell
- 正向shell -> 客户端连接服务器端,客户端想要获取服务器端的shell
-
反向shell -> 客户端连接服务器端,服务器端想要获得客户端的shell
-
数据库提权:udf提权,mof提权
- shell提权
- SQL注入获取shell
- XSS获取shell
- 弱口令获取服务器权限
业务逻辑漏洞
由于程序逻辑不严谨或逻辑太复杂,导致一些逻辑分支不能正常处理或处理错误导致的漏洞。 与传统的漏洞相比,业务逻辑漏洞不易发现,挖掘思路不统一;不易防护,没有明确的防护方案 业务逻辑漏洞存在的可能场景:
- 用户注册场景
- 登录场景
- 支付场景
- 修改资料场景
- 信息交互场景
- 绑定手机场景
权限控制
越权:
- 平行越权访问漏洞,指的是权限平级的两个用户之间的越权访问;
- 垂直越权访问漏洞,指的是权限不等的两个用户之间的越权访问。
- 接口控制:特殊接口,没有做访问权限的控制
什么是接口控制?
在博客论坛中,一个正常的普通用户A使用官方提供的API接口构造链接,用户B通过点击该链接后进行发送或转发用户A指定的内容。
平行越权漏洞的防护:
- 增加访问与操作对象的用户属性,在对目标对象进行访问与操作时,服务端检验会话与对象的用户属性,在校验通过后才能执行读取和操作。
垂直越权漏洞的防护:
- 所有访问采用默认拒绝机制,采取基于角色访问控制,对于各个功能的访问,规定不同角色拥有不同的访问权限,当用户在使用该功能时,系统要校对用户的权限与访问控制机制是否与规定相同,通过校验者才能使用,否则拒绝使用该功能。
传统的漏洞可以从哪三个方面进行防护?
- 从源头上解决,防止漏洞的产生;
- 通过代码过滤,
- 通过第三方服务介入
让事物以迥于初衷的方式运作
漏洞复现
- 漏洞复现是对某一漏洞进行还原验证的过程。
漏洞复现的意义?
- 第一,可以认识到相关的系统知识,比如命令行、系统配置文件等等;
- 第二,对漏洞复现的认知,这个漏洞是如何产生的,是哪里的代码逻辑出现了问题。
漏洞复现的三个步骤:
- 搭建环境-》实现漏洞-》原理解析
通用漏洞
- 企业及互联网中常用的操作系统,系统组件,重要的框架以及应用中的安全漏洞。 通用漏洞是渗透测试流程中漏洞发现部分关注的漏洞方向之一,是学习漏洞挖掘知识的重要来源。
- PoC指一段漏洞证明的代码
- 通用漏洞在渗透测试过程中占有很重要的分量,通过学习通用漏洞,既可以丰富个人的攻击宽度,也可以学习相关漏洞知识和挖掘漏洞的思路。
代码审计原理
- 代码审计是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。
- 代码审计是漏洞挖掘的重要途径。
- 代码审计还是企业安全建设SDL流程中的一个环节。
- 代码审计(白盒),能够覆盖更全面的安全问题。
- 与黑盒测试相比,当有源代码时(代码审计)在寻找代码入口和程序执行路径等漏洞挖掘点时所做的猜测性工作会大大减少。
代码审计的技能要求:
- 对编程的掌握(能看懂代码的逻辑)
- 对漏洞形成原理的理解
- 系统,中间件,框架等的熟悉程度
代码审计思路:
- 关键词搜索:依赖漏洞关联的函数,搜索函数名称并追踪输入
- 框架类基于功能审计:MVC框架功能和代码路由关系,直接定位业务逻辑代码
- 通读代码:研究其代码构建逻辑
- 敏感函数回溯
- 通读全文
- 功能点定向审计