hvv蓝队面试题
常规的面试题,收集于网上
[TOC]
SQL注入原理
服务端未对用户输入进行过滤,导致服务端直接把用户输入的数据当作SQL语句带入执行
SQL注入分类
-
从反馈结果来分
- 回显型
- 无回显
-
从攻击方法来分
-
堆叠注入(
;后继续构造下一条语句) -
联合注入(union select)
-
报错注入(在没法用
union联合查询时使用。原理是通过xpath语法错误,利用Updatexml和extractvalue两个函数) -
Cookie注入(对get传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。)
-
Head注入(在传参的时候,将数据构建在http头部。网站会记录你的ip或设备(UA等),一般发生在登陆或者留言的地方)
-
宽字节注入
php中的
addslashes()函数对用户输入的单引号'用\(反斜杠url编码为%5c)进行转义。而在MySQL使用了GBK编码,GBK会误认为两个连起来的字符是一个汉字,在单引号前加上一个ASCii码大于128的字符(例如%df,在GBK编码中得到%df%5c,拼接为新字符運),最后的结果表现为吃掉一个ASCII字符的现象,导致应有的转义被逃逸。 -
盲注
-
布尔盲注(
页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据)Length()函数 返回字符串的长度 Substr()截取字符串 Ascii()返回字符的ascii码 sleep(n):将程序挂起一段时间 n为n秒 if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句payload: http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+ <!--> 当前数据库database()的长度大于10,返回true页面,否则FALSE页面 </!--> -
时间盲注(
通过页面沉睡时间判断,通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据)payload: http://127.0.0.1/Less-9/?id=1' and (if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4)) --+ <!--> 如果当前查询的当前数据库ascii(substr(database()),1,1)的第一个字符的ASCII码大于100,ture 沉睡10秒,FALSE 沉睡4秒 </!-->
-
SQL注入防御
-
代码层
- 对用户输入进行严格的校验和非法字符的过滤
- 代码层面使用参数化查询语句(Java语言可使用JDBC框架、PHP语言可使用PDO框架)
- 使用数据库存储过程
- 使用数据库安全函数
- 使用具有严格边界的沙箱运行代码
- 严格区分普通用户和系统管理员权限。(例如不允许不通用户拥有数据库对象建立和删除权限,可尽量减少SQL注入攻击对数据库造成的危害)
-
网络层
部署WAF
XSS原理
跨站脚本攻击,是恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中,可能会造成其他用户执行嵌入的恶意代码。
XSS分类和区别
-
反射型(出现在搜索框,非持久化)
-
存储型(出现在留言板、评论等,存储在数据库中)
-
DOM型
特殊的反射xss,基于dom节点树的漏洞,整个过程后端没有参与,完全是在前端进行,不与数据库进行交互,是JS代码缺陷造成的漏洞。通过诱使(钓鱼)一名用户访问自己构造的URL,就可在受害者的客户端注入恶意脚本。利用步骤和反射型很类似,但是唯一的区别是构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。
CSRF利用条件
服务端没有进行token和refere来源验证
SSRF原理
服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。(通常针对外部网络无法直接访问的内部系统)
SSRF危害
- 端口、服务探测
- 攻击运行在内网或本地的应用程序
- 对内网web应用进行指纹识别,识别企业内部的资产信息
- 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如Struts2漏洞利用,SQL注入等)
- 利用file协议读取本地敏感数据文件等
SSRF防御
- 过滤返回的信息。如果web应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息。避免用户可以根据错误信息来判断远程服务器的端口状态。
- 限制请求的端口。比如80,443,8080,8090。
- 禁止不常用的协议,仅仅允许http和https请求。可以防止类似于
file://,gopher://,ftp://等引起的问题。 - 使用DNS缓存或者Host白名单的方式。
文件上传分类
- 黑名单
- 白名单
文件上传的突破
- 前端验证
- 改包
- 禁用JS
- 后端验证
- 黑名单:大小写、mime类型等
- 白名单:00截断、时间竞争、双文件上传、双文件名等
你了解那些中间件
- iis6.0
- Apache
- iis7.5
- Nginx
- Tomcat
- Weblogic
- Jboos
常见的中间件解析漏洞
-
iis6.0
可能存在于古老网站
-
当IIS处理像
*.asp;*.jpg这类特殊的文件名时,会将;后面的内容直接忽略,将;前面的文件当做asp解析执行,这么做主要是为了绕过上传时目标服务器设置的黑名单,也可以称其为文件解析eg:www.xxx.com/xx.asp;.jpg -
在网站中建立
*.asp或*.asa的文件夹时,该文件夹中的任何文件都被IIS当做asp文件解析并执行,也可以叫做目录解析 -
除了asp、aspx以外,还有cer、cdx、asa 的后缀都可以被当作asp或者aspx脚本语言解
析eg:mamu.cer muma.cdx mamu.asa
-
-
Apache
-
Apache特性,当Apache遇到无法识别解析的文件后缀时,会从后向前解析,即从右往左。如
xxx.php.123.456,在mime.types文件中如果不存在.123/.456这两种后缀,那么apache会将该文件解析为php。 -
同样也可以在
httpd.conf文件中更改参数或是直接配置.htaccess。 -
CVE-2017-15715,
%0A绕过上传黑名单
-
-
iis7&7.5
条件:①IIS7/7.5在
Fast-CGI运行模式下。②php.ini里cgi.fix_pathinfo=1在一个文件路径(/xx.jpg)后面加上
/xx.php会将/xx.jpg/xx.php解析为 php 文件eg:http://123.com/aa.jpg/bb.php -
Nginx
- 也是由于把文件交给
Fast-CGI处理造成的,条件示例同上。 - 在
Fast-CGI关闭的情况下, Nginx 仍然存在解析漏洞: 在文件路径(xx.jpg)后面加上%00.php, 即xx.jpg%00.php会被当做 php 文件来解析
- 也是由于把文件交给
-
Tomcat
xx.jpg/xx.php
未授权访问漏洞
- Redis 未授权访问漏洞(未设置密码)
- MongoDB 未授权访问漏洞(27017端口未授权访问,可读取数据库内容)
- JBOSS 未授权访问漏洞(低版本无需用户名密码访问web控制台)
- VNC 未授权访问漏洞(未配置口令)
- Docker 未授权访问漏洞(docker remote api可以执行docker命令,docker守护进程监听在0.0.0.0,可直接调用API来操作docker)
- ZooKeeper 未授权访问漏洞(ZooKeeper默认开启在2181端口,在未进行任何访问控制情况下,攻击者可通过执行envi命令获得系统大量的敏感信息,包括系统名称、Java环境。)
- Rsync 未授权访问漏洞(未配置账号密码认证,导致未授权访问)
- Elasticsearch 未授权访问漏洞(Elasticsearch 默认端口为9200 ,攻击者可以直接访问ip:port)
- Hadoop 未授权访问漏洞
XXE的原理
在应用程序解析XML输入时没有禁止外部实体的加载,导致可加载恶意外部文件、命令执行、文件读取等
XXE的分类
- 有回显
- 无回显
XXE有哪些引入方式
-
直接通过DTD外部实体声明
<!DOCTYPE a [ <! ENTITY b SYSTEM "file:///etc/passwd"> ]> -
通过DTD文档引入外部DTD文档,再引入外部实体声明
XML内容:<!DOCTYPE a SYSTEM "http://xxx/aaa.dtd"> DTD文件内容:<! ENTITY b SYSTEM "file:///etc/passwd"> -
通过DTD外部实体声明引入外部实体声明
XML内容:<!DOCTYPE a [ <! ENTITY b SYSTEM "http://xxx/aaa.dtd"> ]> DTD文件内容:<! ENTITY b SYSTEM "file:///etc/passwd">
遇到XXE盲注怎么办
编写远程dtd文件内容,触发XXE后服务器把文件发送到攻击者服务器,查看攻击者服务器日志即可。
Windows提权
-
内核提权
-
手工查找补丁情况
systeminfo Wmic qfe get Caption,Description,HotFixID,InstalledOn -
MSF后渗透扫描
post/windows/gather/enum_patches -
Powershell扫描
Import-Module C:\Sherlock.ps1 Find-AllVulns
-
-
系统配置错误提权
-
Empire内置模块
usemodule privesc/powerup/allchecks
execute -
计划任务
-
可信服务路径漏洞
-
-
令牌窃取
-
无凭证提权
linux提权
-
脏牛进行内核提权
补充:说说你了解的脏牛提权
-
查看发行版本
cat /etc/issue
cat /etc/*-release
* 查看内核版本 ```bash uname -a- 针对版本搜索漏洞,把脚本进行上传,运行提权
-
-
SUID配置错误提权
-
计划任务提权
ls -l /etc/cron* cat /etc/crontab -
sudo提权(配置不当引起)
数据库获取密码
- MySQL 3306 端口弱口令爆破
- sqlmap 注入的 --sql-shell 模式
- 网站的数据库配置文件中拿到明文密码信息
- CVE-2012-2122 等这类漏洞直接拿下 MySQL 权限
数据库提权
mysql提权
-
webshell权限
-
into oufile 写shell条件
- 知道网站物理路径
- 高权限数据库用户
- load_file() 开启 即 secure_file_priv 无限制
- 网站路径有写入权限
-
通过phpmyadmin来into outfile
通过log变量等获知绝对路径,打开写入权限
-
日志写shell
-
-
服务器权限
-
UDF提权(可用于Linux和Windows)
大致方法是把我们的动态链接库放置在特点的目录下,创建自定义函数,实现系统函数命令的调用,最终导致提权。
在mysql<5.1 导出目录c:/windows或system32 在mysql>=5.1 导出安装目录/lib/plugin/ 在有注入点时候,我们可以通过sqlmap中里的UDF动态链接库进行导入
# sqlmap中动态链接库位置 D:\tools\sqlmap\data\udf\mysql # sqlmap中的动态链接库为了防止被杀毒软件查杀,都经过了编码处理,不能直接使用,所以我们还需要用sqlmap自带的解码工具clock.py进行解码 补充:MySQL UDF提权流程
# 判断mysql版本 select version(); # 查找安装目录 show variables like '%plugin%'; select @@basedir; #NTFS ADS流创建语句 mysql> select 'x' into dumpfile 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin::$INDEX_ALLOCATION'; # 创建不一定成功,不成功的情况下还是利用webshell的权限创建目录 # 自定义函数 CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; # 创建成功后,我们利用自定义函数进行命令执行 select sys_eval('whoami'); # 然后用我们这个自定义命令执行函数进行提权即可。 # 最后为了权限维持,防止被发现,我们可以对自定义函数进行删除。 # 手工UDF提权太过繁琐,可以通过网页版一件提权(暗月MySQL全版本通杀提权神器) -
MOF提权
现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。mof的提权原理为mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。
-
Oracle提权
SYS创建的存储过程存在sql注入。拥有create procedure权限的用户通过创建提权函数,将提权函数注入到存储过程中,于是该存储过程将调用这个提权函数来执行grant dba to quan命令,获得Oracle数据库dba权限。
SQLserver提权(MSSQL)
-
xp_cmdshell提权
xp_cmdshell的作用类似于mysql的udf,其本质是一些sql语句的集合,xp_cmdshell也可以理解为一些危险性比较高的小脚本。
-
sp_OACreate提权
当xp_cmdshell不可用的时候,我们还可以利用sc_oacreate来进行提权
必知命令
select @@version #查看数据库版本
select db_name() #查看当前数据库
select IS_SRVROLEMEMBER('sysadmin') #判断是否为sa权限
select IS_MEMBER('db_owner') #判断是否为dba权限
exec master..xp_msver #查看数据库系统参数
了解SQLmap吗
最强注入工具,几乎所有数据库都可以注入
常用参数
--dbs # 所有数据库
--current-db # 当前数据库
--users # 所有数据库用户
--current-user # 当前数据库用户
--random-agent # 随机UA
--passwords # 数据库密码
--batch # 自动化选择
--level= # 指定测试等级,cookie注入是2,HEAD是3
--tables # 猜解表名
--columns -T "要猜解的表名" # 猜解列名
--dump -C "列名" -T "表名" # 爆出字段数据
交互写shell条件:有写文件的用户权限、知道网站绝对路径、MySQL配置允许写文件(secure_file_priv这个配置项不能为 NULL,通常需要为空或指向一个目录)、网站目录有权限创建文件
--os-shell
说说Nmap
常见的网络扫描和主机检测工具,功能包括主机识别、端口扫描、版本检测、OS监测,支持脚本交互。
nmap -sT [ip] # TCP扫描,三次握手会被记录,不安全,慢,准确
nmap -sS [ip] # SYN扫描,最常用,安全,快
nmap -Pn [ip] # 目标机禁用ping的情况下,绕过ping扫描
nmap -sU [ip] # UDP扫描,慢,可靠性不高,但结果可能存在有价值的服务程序
nmap -sA [ip] # 检测哪些端口被屏蔽
nmap [ip] -p [port] # 对指定端口进行扫描
nmap [ip/24] # 对整个网段进行扫描
nmap -O [ip] # 对目标主机操作系统进行扫描
nmap -sV [ip] # 对端口上的服务程序版本进行扫描
说说MSF
目前最流行、最强大、最具扩展性的渗透测试平台软件
# 常用命令
background # 让meterpreter处于后台模式
quit # 退出会话
shell # 获得命令行
getuid # 查看权限
sysinfo # 查看目标机系统信息
getsystem # 提权操作
扩展:MSF使用流程?提权?制作免杀马?
SQL注入bypass你会那些手法
-
参数污染
eg:order/*!/*!50554test*/by*/ -
编码替换、代替
-
根据waf可能有缓冲区溢出绕过等
文件上传怎么绕过
-
前端JS绕过
直接禁用JS,或者抓包改
-
黑白名单绕过
测试大小写,phtml、php3等文件名
-
文件类型绕过
抓包改包
-
路径绕过与普通截断
%00
-
系统解析漏洞绕过
-
中间件漏洞绕过(上面有)
-
条件竞争
在服务器临时保存文件并验证的短暂时间内可能执行,多线程不断发包,短暂时间内可解析php
-
图片二次渲染绕过
对比得到图片马中二次渲染没被修改过的部分,在该部分写入木马
命令执行怎么绕过
- 管道符
- 空格
- 重定向
- 单双引号
- 等价替换
- 编码
- 反斜杠
- 内敛注释符
- 命令换行
了解域渗透吗?说说域渗透
黄金票据、白银票据利用条件和区别
| 区别点 | 黄金票据 | 白银票据 |
|---|---|---|
| 访问权限 | 获取任何Kerberos服务权限 | 访问指定的服务 |
| 加密方式 | 由krbtgt的Hash加密 | 由服务账号(通常为计算机帐户)Hash加密 |
| 认证流程 | 需要经过域控 | 不需要经过域控 |
| 生成的票据 | TGT票据 | TGS票据 |
-
黄金票据
黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户是域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户
-
利用前提:
- 拿到域控(没错就是拿到域控QAQ),适合做权限维持
- 有krbtgt用户的hash值(aeshash ntlmhash等都可以,后面指定一下算法就行了)
-
条件要求:
- 域名
- 域的SID 值
- 目标服务器的 FQDN 即完整的域名
- 可利用的服务
- 域的KRBTGT账户NTLM密码哈希
- 伪造的用户名
-
-
白银票据
黄金票据是伪造TGT(门票发放票),而白银票据则是伪造ST(门票),这样的好处是门票不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等
-
利用前提:
- 拿到目标机器hash(是目标机,不一定是域控)
-
条件要求:
- 域名
- 域sid
- 目标服务器FQDN
- 可利用的服务
- 服务账号的NTML HASH
- 需要伪造的用户名
-
两者区别:黄金票据只有三十分钟,白银票据是永久。
通过88端口,基于Kerberos协议实现过程中的设计逻辑缺陷
待写...
php反序列化
序列化(serialize):是将变量或对象转换成字符串的过程。从而达到传输和存储的目的。
反序列化(unserialize):是将字符串转换成变量或对象的过程。以便被代码处理。
说说java
用python写过工具吗?
python用过那些框架?
做过那些项目?
渗透流程
- 信息搜集
- 漏洞发现&利用(打点)
- 进入内网后进行内部信息搜集
- 权限提升&维持
你是怎么做信息收集的?
需要收集的信息:目标主机的DNS信息、目标IP地址、子域名、旁站和C段、CMS类型、敏感目录、端口信息、操作系统版本、网站架构、漏洞信息、服务器与中间件信息、邮箱、人员、地址等
工具:Shodan、fofa、ZoomEye、Google Hacking、Github Hacking
ps. 收集内容对应的工具?
内网信息收集流程?
-
Windows
-
检查当前shell权限
whoami /user && whoami /priv -
查看系统信息
systemino -
tcp/udp 网络连接状态信息
netstat -ano -
机器名
hostname -
查看当前操作系统
wmic OS get Caption,CSDVersion,OSArchitecture,Version ver -
查看当前安装程序
wmic product get name,version -
查看在线用户
quser -
查看网络配置
有 Primary Dns Suffix (DNS后缀搜索列表)就说明是域内,空的则当前机器应该在工作组
ipconfig /all
9. 查看进程 有些进程可能是域用户开启的,通过管理员权限 凭证窃取,窃取域用户的凭证tasklist /v
10. 查看当前登录域 ``` net config workstation ``` 11. 远程桌面连接历史记录 把凭证取下来进行本地解密 ``` cmdkey /1 ``` 12. 查看本机上的用户账号列表 ``` net user ``` 13. 查看本机地用户AAA的信息 ```powershell net user AAA net user /domain 显示所在域的用户名单 net user 域用户 /domain 获取某个域用户的详细信息 net user /domain AAA 12345678 修改域用户密码,需要管理员权限 ``` 14. 其它域操作? -
-
Linux
- 查看当前权限(whoami)
- 网卡配置(ipconfig)
- 端口状态(netstat -anpt)
- 进程状态(ps -ef)
- 管理员历史输入命令(cat /root/.bash_history)
- 查找某个文件(find / -name *)
CNVD证书
CTF历史
挖洞历史
端口
#web网站
80 web
80-89 web
8000-9090 web
8080 Tomcat Web
#数据库
1433 MSSQL
1521 Oracle
3306 MySQL
5432 PostgreSQL
50000 DB2
#常用端口类
20 ftp : FTP服务器真正传输所用的端口,用于上传、下载
21 ftp : 用于FTP的登陆认证
22 SSH、SFTP : 加密的远程登录;文件传输
23 Telnet: 远程登录(在本地主机上使用此端口与远程服务器的22/3389端口连接)
25 SMTP: 用于发送邮件
110 POP3: SUN公司的RPC服务所有端口
445 SMB 弱口令扫描
2601,2604 zebra 路由,默认密码zebra
3389 Windows远程桌面
#内网横向常见端口
53 DNS : 内网中通过DNS进行通信传输隐蔽性更好
88 Kerberos : 监听KDC票据请求,可以进行黄金票据和白银票据的伪造,以进行横向
135 DCOM & RPC 服务 : WMI(Windows Management Instrumentation)管理工具的远程操作
137、138、139 NetBios : 主要用于内网传输文件
389 LADP : 一般在域控上出现该端口,可爆破
445 SMB
5985 WinRM : 允许用户远程管理并获取数据
#特殊服务类
443 SSL心脏滴血
445 ms08067/ms11058/ms17010等
873 Rsync未授权
2049 通过网络,跨平台实现文件共享
4000 腾讯QQ客户端
5984 CouchDB http://xxx:5984/_utils/
6379 redis未授权
7001,7002 WebLogic默认弱口令,反序列
9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞
11211 memcache未授权访问
27017,27018 Mongodb未授权访问
50000 SAP命令执行
50070,50030 hadoop默认端口未授权访问
如何手工判断目标站是Windows还是Linux服务器
Windows大小写不敏感,Linux大小写敏感
为何一个MySQL数据库的站却只有一个80端口开放
- 更改了端口
- 站库分离
- 3306不对外开放
3389无法连接的几种情况
- 没开3389端口
- 端口被修改
- 防护拦截
- 处于内网
MySQL怎么写shell
select '一句话' into outfile '路径'
select '一句话' into dumpfile '路径'
MySQL写shell的必要条件
- 必须是root权限
- 知道网站的绝对路径
- my.ini配置文件中secure_file_priv函数配置为空
说说了解的编辑器漏洞
实质还是文件上传漏洞,了解两三个即可
- FCKeditor编辑器
- EWEbeditor编辑器
- DotNetTextBox编辑器
- Kedit编辑器
- Cute Editor编辑器
access扫出后缀为asp的数据库文件,访问乱码,如何实现到本地利用
下载后直接更改后缀为.mdb
提权时选择可读写目录,为何尽量不用带空格的目录
因为exp执行时多半需要空格界定参数
注入时可以不使用and或or,直接order by开始注入吗?为什么
and/or/xor,前面的1=1、1=2步骤只是为了判断是否为注入点,如果已经确定是注入点那就可以省略。
某个防注入系统,在注入时会提示如下,如何利用这个防注入系统拿shell?
系统检测到你有非法注入的行为。
已记录您的ip xx.xx.xx.xx
时间:2016:01-23
提交页面:test.asp?id=15
提交内容:and 1=1
在URL里面直接提交一句话,这样网站就把你的一句话也记录进数据库文件了 这个时候可以尝试寻找网站的配置文件,直接菜刀连接。
上传大马后访问乱码,有哪些解决办法
目标站禁止注册用户,找回密码处随便输入用户名提示:“此用户不存在”,你觉得这里怎样利用?
- 爆破用户名,再爆破密码
- 可能存在注入点
在有shell的情况下,如何使用xss实现对目标站的长久控制?
- 后台登录处加一段记录登录账号密码的js,并且判断是否登录成功,如果登录成功,就把账号密码记录到一个生僻的路径的文件中,或者直接发到自己的网站文件中。(此方法适合有价值并且需要深入控制权限的网络)。
- 在登录后才可以访问的文件中插入XSS脚本。
后台修改管理员密码处,原密码显示为*。你觉得该怎样实现读出这个用户的密码?
F12审查元素,把密码处的password属性改成text
以下链接存在 sql 注入漏洞,对于这个变形注入,你有什么思路
index.php?id=AjAxNg==
对参数进行base64编码再测试
SQLserver有几种提权方式?怎么提权?
同前文
CSRF、XSS、XXE区别以及修复方式
CSRF、SSRF和重放攻击有什么区别
CSRF是跨站请求伪造,由客户端发起。
SSRF是服务器端请求伪造,由服务器发起。
重放是将截获的数据包进行重放,达到身份认证的目的。
说出至少三种业务逻辑漏洞,以及修复方式
- 密码找回漏洞
- 密码允许爆破
- 存在通用型找回凭证
- 可以跳过验证步骤
- 找回凭证可以拦包获取
- 身份认证漏洞
- 会话固定攻击
- Cookie仿冒
- 验证码漏洞
- 验证码允许爆破
- 验证码可以通过拦截JS或者改包方法绕过
- 空值绕过
代码执行,文件读取,命令执行的函数都有哪些
-
代码执行
eval,preg_replace+/e,assert,call_user_func,call_user_func_array,create_function -
文件读取
file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等 -
命令执行
system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
img标签除了onerror属性外,还有其他获取管理员路径的办法吗?
src指定一个远程的脚本文件,获取referer
文件包含都有哪些伪协议
file:// 访问本地文件系统
http:// 访问 HTTPs 网址
ftp:// 访问 ftp URL
Php:// 访问输入输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob://
OSI七层协议
七层划分分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
三次握手和四次挥手
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;
# SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进ESTABLISHED(TCP连接成功)状态,完成三次握手。
四次挥手
第一次挥手:当数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。
第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ACK=1,seq=v,ack=u+1。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。
第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。
第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(Maximum Segment Lifetime最长报文寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。
ps.为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
TCP/UDP协议的区别
- TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
- TCP要求的系统资源较多,UDP较少。
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
- TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞
控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议
等)。 - 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
- TCP的逻辑通信信道是全双工的可靠信道;UDP则是不可靠信道。
linux和windows查看系统进程的命令和杀死进程的命令
-
Linux
查看进程:ps -ef 杀死进程:kill -
Windows
查看所有进程:netstat -ano 指定端口进程:netstat -ano | findstr "8080" 杀死进程:taskkill /f /t /im 进程名称 /f 杀死所有进程及子进程 /t 强制杀死 /im 用镜像名称作为进程信息 /pid 用进程id作为进程信息Linux和Windows的加固措施
- Linux
- 设置有效的密码策略,防止攻击者破解出密码
- 应启用登录失败处理功能,可采取结束会话、限制非法登录次数和自动退出等措施。
- 删除多余的、过期的帐户,避免共享帐户的存在。
- 开启审核策略,若日后系统出现故障、安全事故则可以查看系统日志文件,排除故障、追查
入侵者的信息等。 - 保护审计记录,避免受到未预期的删除、修改或覆盖等。
- 关闭与系统业务无关或不必要的服务,减小系统被黑客被攻击、渗透的风险。
- 操作系统遵循最小安装的原则,仅安装需要的组件和应用程序,并通过设置升级服务器等方式保持系统补丁及时得到更新。
- 对接入服务器的IP、方式等进行限制,可以阻止非法入侵。
- 设置登录超时时间,释放系统资源,也提高服务器的安全性
- Windows
- 密码复杂度:设置有效的密码策略,防止攻击者破解出密码。
- 账号锁定策略:应启用登录失败处理功能,可采取结束会话、限制非法登录次数和自动退出
等措施 - 设置访问策略:应启用访问控制功能,依据安全策略控制用户对资源的访问。
- 关闭默认共享:应根据管理用户的角色分配权限,实现管理用户的权限分离,仅授予管理用户所需的最小权限。
- 删除多余账号:删除或禁用临时、过期及可疑的帐号,防止被非法利用。
- 开启审核策略:开启审核策略,若日后系统出现故障、安全事故则可以查看系统日志文件,
排除故障、追查入侵者 的信息等。 - 及时清理内存信息:及时清理存放在系统中的用户鉴别信息,防止信息外泄,被黑客利用
- 卸载冗余组件:卸载WScript.Shell, Shell.application这两个组件,防止黑客通过
脚本来提权。 - 关闭不必要服务:关闭与系统业务无关或不必要的服务,减小系统被黑客被攻击、渗透的风
险 - 安装杀毒软件:应安装防恶意代码软件,并及时更新防恶意代码软件版本和恶意代码库。
- 设置屏幕保护:应根据安全策略设置登录终端的操作超时锁定
- Linux
常见的安全设备
-
防火墙:
- 过滤进、出网络的数据
- 防止不安全的协议和服务
- 管理进、出网络的访问行为
- 记录通过防火墙的信息内容
- 对网络攻击进行检测与警告
- 防止外部对内部网络信息的获取
- 提供与外部连接的集中管理
-
态势感知:
建立威胁可视化及分析能力,对威胁的影响范围、攻击路径、目的、手段进行快速研判,目的是有效的安全决策和响应。
-
蜜罐:
用于欺骗攻击者并跟踪攻击者,通过布置一些作为诱饵的主机或网络服务,诱使攻击方对他们实施攻击,从而可以对攻击行为进行捕获和分析。 -
IDS:
监视、分析用户及系统活动;审计系统构造和弱点;
识别、反映已知进攻的活动模式,向相关人士报警;
统计分析异常行为模式;
评估重要系统和数据文件的完整性;
审计、跟踪管理操作系统,识别用户违反安全策略的行为。 -
IPS:
入侵预防系统是一部能够监视网络或网络设备的网络数据传输行为的计算机网络安全设备,能够即时的中断、调整或隔离一些不正常或是具有伤害性的网络数据传输行为。 -
堡垒机:
核心功能是用于实现对运维操作人员的权限控制与操作行为审计。用堡垒机是为了保证运维安全,同时保障重要系统及靶标隔离。堡垒机的登录也是有访问控制的,只允许白名单IP访问,同时堡垒机使用强口令+随机KEY登录。
溯源方法
流程:
攻击源捕获——溯源处置——攻击者画像
攻击源捕获来源:
- 审查邮件钓鱼
- 获取安全设备数据进行分析,尤其是流量
- 网络资产所在服务器运行情况
- 中间件日志信息
- 蜜罐
溯源处置
- 域名查询
- IP查询
- 身份查询
- 文件查询
攻击者画像
- 攻击路径
- 攻击目的
- 网络代理
- 攻击手法
- 身份画像组成
- 虚拟身份:ID、昵称、网名
- 真实身份:姓名、家庭/办公位置
- 联系方式:qq、手机号、微信、邮箱
- 组织情况:单位名称、职位信息
SQL注入无回显的情况下利用
借助DNSlog操作
sleep延时
网站常见上传点
相册、头像、照片、附件、文件管理器
fastjson反序列化漏洞原理及利用
工作形式
fastjson的功能就是将json格式转换为类、字符串等供下一步代码的调用,或者将类、字符串等数据
转换成json数据进行传输,有点类似序列化的操作
利用方式
- 对于 fastjson版本 <= 1.2.24的情况,利用思路主要有2种
通过触发点JSON.parseObject()这个函数,将json中的类设置成com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl并通过特意构造达到命令执行
利用com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImplTemplatesImpl类,而这个类有一个字段就是_bytecodes,有部分函数会根据这个_bytecodes生成java实例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数。 - 通过JNDI注入
jndi是一个Java命令和目录接口,举个例子,通过jndi进行数据库操作,无需知道它数据库是
mysql还是ssql,还是MongoDB等,它会自动识别。
当然rmi也可以通过jndi实现,rmi的作用相当于在服务器上创建了类的仓库的api,客户端只用带着参数去请求,服务器进行一系列处理后,把运算后的参数还回来。
序列化操作和反序列化操作需要的函数
JSON.toJSONString(Object) 将对象序列化成json格式
JSON.toJSONString(Object,SerializerFeature.WriteClassName) 将对象序列化成json格式,并且记录了对象所属的类的信息
JSON.parse(Json) 将json格式返回为对象(但是反序列化类对象没有@Type时会报错)
JSON.parseObject(Json) 返回对象是com.alibaba.fastjson.JSONObject类
JSON.parseObject(Json, Object.class) 返回对象会根据json中的@Type来决定
JSON.parseObject(Json, User.class, Feature.SupportNonPublicField); 会把Json数据对应的类中的私有成员也给还原
fastjson不出网怎么利用
-
第一种利用方式需要一个特定的触发条件:
解析JSON的时候需要使用Feature才能触发,参考如下代码:
JSONObject.parseObject(sb.toString(), new Feature[]
{Feature.SupportNonPublicField}); -
第二种利用方式:
则需要应用部署在Tomcat应用环境中,因为Tomcat应用环境自带tomcat-dbcp.jar
对于SpringBoot这种自带Tomcat可以直接以单个jar文件部署的需要在maven中配置tomcatdbcp。
而且对于不同的Tomcat版本使用的poc也不同:Tomcat 8.0以后使用org.apache.tomcat.dbcp.dbcp2.BasicDataSource
Tomcat 8.0以下使用org.apache.tomcat.dbcp.dbcp.BasicDataSource
shrio反序列化漏洞原理
shrio550的原理
Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并
编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
payload产生过程
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
shrio721原理
由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用
户可通过Padding Oracle加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。
shiro550回显方式有哪些
shiro550特征
返回包中包含rememberMe=XXX 字段
shiro利用链(构造链)
k1/k2利用链,一般在工具上选择。还有cc5、cc6
jboss反序列化漏洞原理
jboss的反序列化漏洞出现在jboss\server\all\deploy\httphainvoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter中。
程序获取http数据保存到了httpRequest中,序列化后保存到了ois中,然后没有进行过滤操作,直接使用了readObject()进行了反序列化操作保存到了mi变量中,这其实就是一个典型的java反序列化漏洞。
weblogic反序列化漏洞原理
Weblogic(及其他很多java服务器应用)在通信过程中传输数据对象,涉及到序列化和反序列化操作,如果能找到某个类在反序列化过程中能执行某些奇怪的代码,就有可能通过控制这些代码达到RCE的效果
常见的weblogic漏洞
- CVE-2016-0638
Weblogic 直接反序列化
基于Weblogic t3协议引起远程代码执行的反序列化漏洞
漏洞实为CVE-2015-4852绕过
拜Oracle一直以来的黑名单修复方式所赐 - CVE-2016-3510
基于Weblogic t3协议引起远程代码执行的反序列化漏洞 - CVE-2017-3248
基于Weblogic t3协议引起远程代码执行的反序列化漏洞
属于Weblogic JRMP反序列化 - CVE-2018-2628
基于Weblogic t3协议引起远程代码执行的反序列化漏洞
属于 Weblogic JRMP反序列化 - CVE-2018-2893
基于Weblogic t3协议引起远程代码执行的反序列化漏洞
实为CVE-2018-2628绕过
同样拜Oracle一直以来的黑名单修复方式所赐
属于Weblogic JRMP反序列化
weblogic权限绕过
- CVE-2020-14882:
远程攻击者可以构造特殊的HTTP请求,在未经身份验证的情况下接管 WebLogic 管理控制台。
攻击者可以构造特殊请求的URL,即可未授权访问到管理后台页面,访问后台后是一个低权限的用户,无法安装应用, 也无法直接执行任意代码。 - CVE-2020-14883:
允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个HTTP请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。 - 漏洞利用
第一种方法是通过com.tangosol.coherence.mvel2.sh.ShellSession
第二种方法是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
常见的框架漏洞
- struct2框架
- spring框架
- Django框架
后台getshell的方法有哪些?
webshell路径直接上传
数据库备份getshell
修改网站上传类型配置拿webshell
执行sql语句写入webshell
通过数据库拿webshell
命令执行拿webshell
phpmyadmin写sehll
拿到webshell不出网情况下怎么办
Regeorg上传去正向连接。探测出网协议,如dns,icmp
当跳板机器不出网,如何不依赖 CobaltStrike 拿到域控? - 云+社区 - 腾讯云 (tencent.com)
常见的内网隧道技术
网络层:Ipv6情况、icmp情况、Gre隧道
传输层:Tcp 隧道、udp 隧道 常规端口转发
应用层:ssh隧道、http隧道、https隧道、dns隧道
正反向代理区别
正反向shell选择
正反向代理工具
权限维持方法
- 匿名用户
- PHP内存型木马
- Shift 后门
- 放大镜后门
- .user.ini文件构成的PHP后门
- 注册表开机自动启动项
- DLL 劫持
- 计划任务
菜刀蚁剑流量特征
- 菜刀
- 菜刀会伪造X-Forwarded-For 头,且每一次利用菜刀与webshell建立连接,X-Forwarded-For 都会变化
- 先对POST进行url解码,再base64解密。
- 命令通过@eval函数执行
- 蚁剑
- 支持自定义编码器
- 默认连接请求两次,请求体只经过url编码
- base64编码器传输中传入的shell没有被加密,容易被waf识别
- RSA编码器要自己生成公私钥,需要目标设备安装openssh,流量中
ant=字符没有加密
冰蝎哥斯拉流量特征
冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端,采用AES加密。
冰蝎的通信过程可以分为两个阶段:密钥协商 加密传输
冰蝎数据包总是伴随着大量的content-type:application什么什么
-
冰蝎2特征:
默认Accept字段的值很特殊,而且每个阶段都一样冰蝎内置了十余种UserAgent ,每次连接shell 会随机选择一个进行使用。但都是比较老的,容易被检测到,但是可以在burp中修改ua头。
Content-Length: 随机生成16位AES key就是特征解密后再解base64可以得到内容 -
冰蝎3特征:
冰蝎3取消随机生成key,改为对密码的MD5加密。aes 密钥变为md5("pass")[0:16]- 意思就是为连接密码 32 位 md5 的前 16 位。全程不再交互密钥生成,一共就俩次请求,第一次请求为判断是否可以建立连接,少了俩次 get 获取冰蝎动态密钥的行为,第二次发送 phpinfo 等代码执行,获取网站的信息。
- 目前很多waf等设备都做了冰蝎2的流量特征分析,所以3取消了动态密钥获取
- aes->base64后得到
{"status":"success","msg":这个返回数据特征已经在冰蝎 2.0 中已经被加入了Waf的检测规则当中,所以在冰蝎 3.0 当中用超大数据填充的方式绕过 - 1)Accept头有application/xhtml+xmlapplication/xmlapplication/signedexchange
- 在使用命令执行功能时,请求包中content-length 为5740或5720(可能会根据Java版本而改变)
- 每一个请求头中存在Pragma: no-cache,Cache-Control: no-cache
jsp抓包特征分析Content-Type: application/octet-stream 这是一个强特征查阅资料可知
octet-stream的意思是,只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交
一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组);很少使用。
-
哥斯拉
是一个基于流量、HTTP全加密的webshell管理工具相对于蚁剑,冰蝎;哥斯拉具有以下优点。全部类型的shell均过市面所有静态查杀,流量加密过市面全部流量waf。Godzilla自带的插件是冰蝎、蚁剑不能比拟的。- 第一次请求超长数据,第一次相应设置session,二三次请求响应均一致
- 选择默认脚本编码生成的情况下,
jsp会出现xc,pass字符和Java反射(ClassLoader,getClass().getClassLoader()),base64加解码等特征。php,asp则为普通的一句话木马
hash和ntml hash的区别
NTLM Hash(NT LAN Manager)是支持Net NTLM认证协议及本地认证过程中的一个重要参数。其长度为32位,由数字与字母组成。它的前身是LM Hash,目前基本淘汰,两者相差不大,只是使用的加密算法不同。
ntml hash生成方式
将明文口令转换成十六进制的格式
转换成Unicode格式,即在每个字节之后添加0x00
对Unicode字符串作MD4加密,生成32位的十六进制数字串
怎么获域控的ntml hash
DNS出网协议怎么利用
横向渗透命令执行的手段
横向的手段和技术
-
ICP
Ipc(共享命名管道),其作用是为了实现进程间通信而开放的命名管道。ipc可以通过用户名和密码建立ipc链接,获取相应的用户权限。
-
at计划任务拿shell(管理员权限)
-
Schtasks
at 命令在windows2008以后的版本被废除了,这时候就用schtasks命令来代替
还是老规矩上传脚本到服务器,或者你直接上传木马也行的。
-
创建Windows服务来进行横向渗透
依赖条件:
- 当前跳板机用户具有管理员权限(因为要创建服务)。
- 与目标机器已经建立ipc连接
-
wmiexec
wmi全称是Windows management instrumentation,它出现在所有的Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的Windows系统,攻击者使用wmi来进行攻击,但Windows系统默认不会再日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。
而wmiexec是模拟psexec功能的vbs脚本
psexec和wmic的区别
psexec会记录大量日志,wmic不会记录日志
Dcom怎么操作?
内存马类型
根据内存马注入的方式,大致可以将内存马划分为如下两类
-
servlet-api型
通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马 -
字节码增强型
通过java的instrumentation动态修改已有代码,进而实现命令执行等功能。
内存马如何进行排查
-
如果是jsp注入,日志中排查可疑jsp的访问请求。
-
如果是代码执行漏洞,排查中间件的error.log,查看是否有可疑的报错,判断注入时间和方法
-
根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在过webshell,排查框架漏洞,反序列化漏洞。
-
如果是servlet或者spring的controller类型,根据上报的webshell的url查找日志(日志可能被关闭,不一定有),根据url最早访问时间确定被注入时间。
-
如果是filter或者listener类型,可能会有较多的404但是带有参数的请求,或者大量请求不同url但带有相同的参数,或者页面并不存在但返回200
php内存马的流程
-
将携带循环生成木马的命令脚本上传至目标服务器
-
删除文件本身
-
让其以隐藏文件的方式,死循环创建文件,并向文件中写入木马
查杀php内存马
- 重启php服务器,(service apache2 restart)
- 强行kill 后台进程 ps aux | grep www-data | awk '{print $2}' | xargs
kill -9 - while循环写脚本 while : ;do rm -rf xxx; done
- 建立一个和不死马相同名字的文件或者目录,不断竞争写入一个和不死马同名的文件
现在主要的免杀手段是什么
什么是脱壳
dll劫持原理
在程序与正常dll之间放置一个恶意的DLL,让程序加载恶意的DLL,该DLL的导出函数与正常函数表示一致,当程序需要调用目标DLL中的某一个函数时,由恶意的DLL去目标对应的DLL函数
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在
Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即
DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用
多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
redis利用方法
- 利用 Redis 写入webshell
服务端的Redis连接存在未授权,在攻击机上能用redis-cli直接登陆连接,并未登陆验证。 - 利用 Redis 写入SSH公钥
服务端的Redis连接存在未授权,在攻击机上能用redis-cli直接登陆连接,并未登陆验证。服务端存在.ssh目录并且有写入的权限 - 利用Redis写入计划任务
这个方法只能在Centos上使用,Ubuntu上是行不通的,原因如下:
因为默认redis写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/权限必须是600也就是-rw———-才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/ 权限644也能执行因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错,然后由于系统的不同,crontrab定时文件位置也会不同。
有没有自己写过poc(redis漏洞验证)
目标站无防护,上传图片可以正常访问,上传脚本格式访问则403什么原因
有可能 web 服务器配置把上传目录写死了不执行相应脚本,尝试改后缀绕过
KDC中文名
密钥分发中心