Web、APP与小程序架构基础认知 #
web 应用 #
基本认识 #
域名差异-主站&分站&端口站&子站 #
- 主站
- 分站
blog.solowalker.com
- 端口站
- 子站
123.blog.solowalker.com
- 目录站
渗透目标一般有两种形式:域名、IP。
一般打开一个网站都是主站,这个主站的域名对应一个 IP。分站的域名也会对应一个 IP,分站的 IP 可以和主站不同,也可以相同。如果分站和主站的 IP 相同,测试分站就可能会影响到主站。所以在信息收集的过程中收集分站的信息可能给我们更多的机会。
当然,分站和主站不放在一起也会有影响。
对于端口站,一个端口可能就会对应一个程序,比如www.solowalker.com:88对应的是 PHP 程序,而到了www.solowalker.com:8080就变成了一个 Java 程序。
对于目录站,一个目录就可能对应一个程序,比如www.solowalker.com是一个博客网站,这是一个 PHP 程序,而www.solowalker.com/bbs是一个论坛网站,是一个 Java 程序。这和端口站是很像的。
了解这些能够让我们在信息收集的过程中了解更多的情况,便于我们发现漏洞。
源码差异-结构&语言&框架&闭源&加密 #
- 源码目录结构
后台目录,文件目录,逻辑目录(代码的逻辑处理能力,看数据的处理等),前端目录(XSS等前端漏洞,JS攻防等),数据目录,配置文件等。熟悉目录对于代码审计来说是很重要的。
- 源码开发语言类型
ASP,ASPX,PHP,Java,Python,Go,javascript等。
ASP属于第一代动态网页技术,是一个服务端脚本环境,可以在 HTML 页面中嵌入脚本语言,主要是 VBScript、JScript,在服务器执行后生成动态网页后再返回给浏览器。
ASPX 是 ASP.NET 的文件后缀,ASP.NET 是一个成熟的面向对象 Web 开发框架,而 ASPX 页面只是其中用于构建 UI 的一种具体文件。ASP.NET 全部预编译为 IL 中间语言,再由 JIT 编译成本地代码。ASP.NET支持强类型语言,目前最主要的是 C# 和 VB.NET。
现在 ASP 和 ASP.NET 搭建的网站以及很少了,主流是 Java、PHP、Python、Node.js、Go 等语言。
- 语言开发框架组件
PHP:Thinkphp、Laravel、YII、CodeIgniter、CakePHP、Zend等
Java:Spring、Mybatis、Hibernate、Struts2、Springboot等
Python:Django、Flask、Bottle、Turbobars、Tornado、Web2py等
JS:Vue.js、Bootstrap、JQuery、Angular等
- 开源闭源加密类型
开源:公开能够下载到源码的
闭源:内部开发的
加密:源码公开,但是源码经过了加密,防止进行魔改之类的操作
数据差异-本地数据&分离数据&云数据库 #
- 数据库类型:
Access、MySQL、SQL Server、Oracle、Redis、DB2、PostgreSQL、MongoDB等
- 本地数据库:本地服务器搭建
- 分离数据库:另外的服务器搭建
- 云数据库:RDS等
云数据库可以设置白名单,只允许某个 IP 地址访问。
数据库有一种核心思想:外联,即外部连接。比如:我们拿到目标的源码,分析数据库的配置文件,其中包含数据库的账号密码和连接的地址,如果数据库在本地,那我们用账号密码连接的成功率很高;如果是分离数据库就很可能连接不上,因为这种情况下会做一个只允许网站服务器的 IP 来连接的策略。
云数据库同理。
如果一个网站的数据库放在了云上面,我们利用 webshell 拿到了这个网站的权限,应该怎么获取数据库中的数据?如果我们使用自己的攻击机连接数据库,即使我们账号密码正确也无法连接。
所以我们可以上传一个数据库连接脚本到网站上,访问这个脚本让脚本去连接这个数据库。这也是最容易想到的方法。
我们还可以利用网站权限上传代理流量工具,做数据中转操作,去连接数据库。这种方法就是让网站作为中间人转发恶意请求。
平台差异-中间件类型&系统类型&容器类型 #
- 系统:win、Linux、mac等
- 容器:Docker、K8s、vmware、virtualbox等
- 中间件:apache、nginx、IIS、lighttpd、tomcat、jboos、weblogic、websphere、jetty等
解析差异-URL路由&绝对相对路径&格式权限 #
- URL路由:URL访问对应文件,MVC模型等
- 相对绝对路径:相对当前目录,完整的目录路径
- 格式权限:后门解析格式,代码正常执行,脚本执行权限等
对于一个 php 的网站,一般都会上传 php 的后门才能正常执行代码,因为其他语言没有对应环境,后门无法解析。
一般的网站都会对一些目录设置对应的权限,如果我们的后门被上传到无法执行的目录里去就无法执行。在这种情况下我们可以尝试把后门传到其他有执行权限的目录中。
对于URL路由访问,例如www.solowalker.com/admin/login.php这个目录对应的就是/admin/login.php这部分源码。而框架开发、MVC模型等源码,可能www.solowalker.com/admin/login这个目录对应的就不是/admin/login.php这部分源码,这由框架的路由决定。
在代码审计时,我们要注意MVC和非MVC模型的源码,MVC即 model view controller,这个模型的作用是让源码分工更明确。
web架构 #
套用型 #
像 csdn/cnblog/github 就是套用型 web 架构。
这类网站是借用一些平台,在这些平台上搭建网站,没有申请域名、购买服务器等操作,全部用的别人的东西搭建,我们所有的东西都在官方站,域名也是由官方分配的。中小型企业经常用这种网站。
像这类网站,在测试时基本测的就是这个建站平台官网,没有什么漏洞,也没有什么测试价值。
前后端分离 #
前端只做了数据的展示,数据是通过网络的传输调用的。后端只对数据进行处理,两个网站是分开的。前后端分离有一种情况就是前端和后端对应的域名不同。
前后端分离可以让一个后台管理多个网站。
这类网站在测试时,前端以 JS 安全问题、API 接口测试、前端漏洞为主,后端隐蔽难度较大。
集成软件包 #
像用宝塔、phpstudy、xamp等搭建的网站这类网站。
这类网站测试时主要以防护体系,权限差异为主。比如宝塔搭建的网站中,我们上传了后门之后蚁剑连接之后无法访问其他目录,甚至也不能执行命令;而phpstudy搭建的网站就可以访问某些其他目录,也可以执行命令。这和这些集成软件开发时做的防护有关。
自主环境镜像搭建 #
这类网站是云镜像打包,自行一个个搭建,比如vulhub搭建的靶场。
这类网站常见命令能够执行,其他目录基本都能看,除了一些高权限的看不了。
容器拉取镜像 #
一般由 Docker 搭建。
这类网站使用虚拟化技术,在后期测试过程中需要进行逃逸提权。
纯静态网站 #
纯 HTML+CSS+JS 搭建,没有数据传输。
这类网站没有漏洞,但是可以通过这类网站进行信息收集,寻找资产。
web 源码类别 #
了解源码的差异有利于代码审计和测试中对源码真实性的判断。
单纯简易源码 #
这类源码和网站的目录对应。比如我们访问/admin的URL路由就对应网站的/admin目录。
MVC 框架源码 #
比如我们用 thinkphp 搭建的网站,我们的后台的目录是/application/admin/controller,而我们在浏览器中访问可能就变成了xxx.com/index/admin,其中做了路由转换。
了解URL和文件的对应关系才能知道漏洞怎么触发。
编译调用源码 #
比如.NET编译成 dll 文件并打包,java 编译成字节码并用 jar 打包。
前后端分离源码 #
https://segmentfault.com/a/1190000045026063
前端:js vue等
后端:php java python等
加密型源码 #
例如通达OA
中间层服务 #
WAF #
有硬件型 WAF、软件型 WAF、云 WAF 和网站内置的 WAF。
硬件型 WAF:以硬件形式部署在链路中,支持多种部署方式,当串联到链路中时可以拦截恶意流量,在旁路监听时只记录攻击不拦截。
软件型 WAF:以软件形式安装在服务器上,可以直接检测服务器上是否存在 webshell,是否有文件被创建等。
云 WAF:一般以反向代理的形式工作,通过配置 NS 或 CNAME 记录,使得网站的请求报文优先通过 WAF 主句,经过 WAF 主机过滤后,将被认为是无害的请求报文再发送给实际网站服务器进行请求,可以认为是带有防护功能的 CDN。
网站内置的 WAF:也叫自定义 WAF,直接镶嵌在代码中。
CDN #
内容分发服务,旨在提高访问速度。
形象地来说,网站的真实服务器和地方的节点服务器组成了一张网,在距离网站真实服务器较远的地区如果访问真实服务器访问速度较慢,所以当地的节点服务器会缓存网站的静态资源和部分动态资源,当用户去访问这个网站的时候就会去访问节点服务器来获取对应的资源。
这就导致真实的 IP 被隐藏,我们测试的目标并不是真实的网站服务器。
OSS #
云存储服务,专门用于存储文件。
OSS 只能存储文件,不会对文件进行解析。所以如果我们上传了一个后门,即使我们能访问到这个后门,其中的代码也不会执行。
但是如果 AccessKey 等凭证泄露,就会导致 OSS 被控制。
反向代理 #
正向代理是客户端服务,客户端主动建立代理来访问目标,因为不建立代理就无法访问。
反向代理是服务端服务,服务端主动转发数据给可访问地址。
原理:通过网络反向代理转发真实服务达到访问目的。
这就导致我们访问到的只是一个代理,并不是真实的服务器。
下面讲一下正反向代理的请求是怎么转发的。
正向代理:客户端明确告诉代理“我要去哪” #
在正向代理中,客户端是知道最终目标地址的,它把代理当作一个跳板。
请求转发过程:
客户端配置代理 比如浏览器设置了代理服务器地址
proxy:8080。客户端发出特殊请求 当你想访问
http://example.com时,浏览器不会直接发给那个网站,而是将完整的URL塞进请求行,发给代理服务器,像这样:GET http://example.com/index.html HTTP/1.1 Host: example.com注意,这里的请求行里是完整网址,而普通请求只有
/index.html这个路径。代理服务器解析并转发 代理拿到请求后:
- 从请求行里直接解析出目标
example.com。 - 自己以一个普通客户端的身份,重新向
example.com的80端口发起一个标准的HTTP请求:GET /index.html HTTP/1.1。 - 这里的关键是:目标服务器看到的请求源IP是代理的IP,它完全不知道背后客户端的存在。
- 从请求行里直接解析出目标
返回数据 代理拿到响应后,再原路返回给自己的客户端。
一句话总结:客户端主动告诉代理目标地址,代理代为执行请求。
反向代理:客户端以为代理就是最终服务器 #
在反向代理中,客户端完全不知道后端服务器的存在,它以为自己访问的就是最终目标。
请求转发过程:
DNS解析到代理 域名
api.example.com的DNS记录,直接指向反向代理服务器nginx-reverse-proxy。客户端发出普通请求 客户端以为代理就是服务器,所以发的是标准请求:
GET /api/user/info HTTP/1.1 Host: api.example.com请求行里只有路径,没有完整网址。
代理根据规则“找人” 这是反向代理的核心。代理服务器收到请求后,它不知道客户端真正想去哪,而是根据自己的配置规则来决定:
- 它查看请求的
Host头和URL路径。 - 匹配自己的“映射表”,比如:
/api/user/*→ 转发给内网的user-service:8080/api/order/*→ 转发给内网的order-service:8081
- 然后,代理修改一些请求头(比如把
Host改成后端真实主机名),向后端http://user-service:8080/api/user/info发起一个新请求。
- 它查看请求的
返回数据并改写 拿到后端响应后,代理可能会把响应头里的一些内网地址替换为自己的域名,再返回给客户端。整个过程,客户端完全无感知。
一句话总结:客户端访问代理,代理根据规则“寻址”并转发给内网服务器,全程对客户端透明。
负载均衡 #
原理:分摊到多个操作单元上进行执行,共同完成工作任务。
影响:有多个服务器加载服务,测试过程中存在多个目标情况。
安全与基础架构支撑 #
蜜罐系统 #
蜜罐系统本质上是一种欺骗防御技术,通过主动构造一个看似满是漏洞的诱饵环境,诱导攻击者进入。它的核心目标不是防御,而是检测和情报收集。比如 HFISH。
堡垒机运维 #
堡垒机,也叫运维安全审计系统,核心使命就一句话:谁,在什么时候,用什么账号,干了什么,全程能看、能管、能追溯。
它不是直接保护Web应用本身,而是保护应用所依赖的底层基础设施(服务器、数据库、网络设备等),是运维操作的唯一入口。
堡垒机的核心作用就三个:
1. 为所有人建账号,不再共享密码
以前,一个团队都知道服务器的root密码,出事找不到人。有了堡垒机,每个人用自己的独立账号登录,而且多数时候不直接知道服务器的密码,实现“一人一号”,谁干的清清楚楚。
2. 全程录像,操作可回放
你通过堡垒机在服务器上敲的每一条命令、打开的每一个文件、看到的每一个画面,都会被像行车记录仪一样完整录下来。出问题时,可以拖进度条回放,精确到谁在几点几分几秒敲了rm -rf。
3. 实时拦截危险动作
可以预设高危指令,比如删除数据库。当有人在操作台上敲出这个命令时,堡垒机会直接拦截不让执行,并立刻告警,避免误操作或恶意破坏。
经典的堡垒机应用比如:www.jumpserver.org。
在渗透过程中如果存在堡垒机,一旦拿下堡垒机就会拿到更多信息。
API 内外接口 #
API 接口是一个允许不同软件应用程序之间进行通信和数据交换的接口。API 定义了一组规则和协议,软件开发者可以使用这些规则和协议来访问操作系统、库、服务或其他应用程序的功能。
通过分析 API 的目录接口、接口命名规则、参数命名规则、功能和业务逻辑等,根据这些信息可以进行端口枚举和参数枚举,进而可以进行相关的漏洞测试。
扩展应用 #
比如 RabbitMQ、Redis等应用,这些应用存在漏洞。
这些应用既方便了运维,也给测试提供了更多测试点。
APP 架构 #
APP 应用开发架构 #
原生开发 #
目前安卓原生应用开发主流是 kotlin,但在老项目中 java 仍然是主力。简单来说原生开发就是使用安卓的一系列控件来实现页面,复杂的页面可以通过自定义控件来实现。
对这类 app 进行测试时就会涉及安卓逆向,经过反编译或抓包之后提取到 app 的资产信息,即提供了哪些接口,对这些网站、IP等进行测试。
使用 H5 语言开发 #
这类 app 使用 HTML5 和 vue 等开发,使用 H5 开发可以多端复用,比如浏览器端、ios 端,一般一个页面要分享的话会用 H5 开发。
对这类 app 进行测试时一般利用抓包来看资产,关注框架本身的安全问题和提交数据时使用的 api 接口的安全问题以及前端 js 测试。
使用 flutter 开发 #
flutter 是谷歌推出的一款 UI 框架,使用 dart 语言开发,支持跨平台,weight 渲染直接操作硬件层。flutter 技术比较新,目前生态较完善。
常规 web 开发 #
web app 开发简单来说就是开发一个网站,然后加上 app 的壳子放在安卓或者IOS上运行。web app一般很小,内容都是 app 内的网页展示,受制于网页技术本身,可实现的功能少,而且每次打开几乎所有的内容都需要重新加载,所以反应速度满,内容加载过多就容易卡死,用户体验差,而且 app 内的交互设计等非常有限。但开发周期短,需要的技术人员少,成本低。
核心还是一个网站,只是进行了适配移动端页面的调整。对这类 app 进行渗透时和对一个 web 的测试没有区别。
小程序架构 #
一般大家所说的小程序是指微信小程序,但实际上除了微信小程序以外,还有支付宝、百度、头条、飞书、QQ、快手、钉钉、淘宝等各个平台的小程序。在微信小程序开发中,开发者可以根据自身情况和项目需要,选择不同的开发方式,包括:原生开发、WebView 开发、框架开发和低代码开发等。
微信小程序 web 封装 #
这类小程序就是把用网页技术开发的 web 应用,通过小程序框架提供的容器变成一个看起来用起来像原生应用的小程序。
其中一种主流方式就是纯 WebView 封装,这种方式本质就是在小程序中放一个全屏浏览器直接加载线上网页。
H5+Vue+HBuildX 封装 #
这一类小程序就是把 Vue 代码通过 uni-app 框架编译成小程序原生代码(js、wxml、wxss),没有直接套一个网页壳。
对小程序进行测试的时候要进行反编译,提取小程序源码泄露的信息。
APP与小程序渗透通用流程:
- 反编译-源码-提取资产
- 抓包-资产-安全测试