AWD 防御技巧
前期准备
使用优化
Linux Shell
# 查看Linux系统中所有可用的shell
cat /etc/shells
# 更改用户xxx的默认shell
chsh -s /bin/bash xxx
也可以修改/etc/passwd文件,实现改变用户的shell
信息搜集
Linux
uname -a # 系统信息
ps -aux # 查询进程信息
ps -ef | grep 进程名称 # 筛选指定进程
id # 用于显示用户ID,以及所属群组ID
cat /etc/passwd # 查看用户情况
ls /home/ # 查看用户情况
find / -type d -perm -002 # 可写目录检查
ifconfig # Linux上查看网卡信息
ip addr show # Linux上查看网卡信息
Windows
whoami /all # Windows上查看用户详细信息
ipconfig /all # Windows上查看网卡信息
端口
netstat # 查看活动连接
netstat -ano/-a # 查看端口情况
netstat -anp # 查看端口
firewall-cmd --zone= public --remove-port=80/tcp –permanent # 关闭端口
firewall-cmd –reload # 防火墙重启
默认口令(弱口令)更改
passwd username # ssh口令修改
set password for mycms@localhost = password('18ciweufhi28746'); # MySQL密码修改
find /var/www//html -path '*config*' # 查找配置文件中的密码凭证
寻找 flag
grep -r "flag" /var/www/html/ # Linux:在Web目录下查找flag
findstr /s /i "flag" *.* # Windows:当前目录以及所有子目录下的所有文件中查找"flag"这个字符串
加固
基本加固
Windows
先备份:Web源码、数据库
- 445加固,开启防火墙或IP高级安全策略
- 开启系统日志审计功能
- 禁用guest账户、关闭文件共享
- 确保启动项内容是可控的
- 限制3389远程访问控制的连接数:在本地组策略编辑器里面,依次展开计算机配置-->管理模板-->Windows组件-->远程桌面服务-->远程桌面会话主机-->连接-->限制连接的数量
- 使用工具监控关键目录文件:文件操作监控.exe、御剑文件监控.exe
- 恶意代码文件,通过PCHunter、Monitor查找
- Web目录环境查找相关可疑文件:jpg/png/rar,查看属性、解压看文件内容
- NTFS扫描磁盘查找隐藏的交换流数据
- 查找系统所有账户信息,禁止非Administrator账户
- 修改Web站点管理员访问路径、默认口令、数据库口令
- 安装WAF脚本,防护Web站点,禁止其他漏洞
Linux
先备份:Web源码、数据库
- 系统口令修改,团队统一口令
- 通过
.bash_history
查找历史命令操作,发现痕迹 - 查看计划任务:
crontab -l
;编辑计划任务:crontab -e
- 查看
/etc/init.d/rc.local
中启动服务有无异常 - 使用脚本开启进程监控、目录监控、流量监控
- Web站点口令,站点管理员路径修改
- 系统加固:iptable
禁止ping
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all //临时开启禁ping
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all //关闭禁ping
Web安全加固
源码备份
压缩源码:
tar -cvf web.tar /var/www/html
zip -q -r web.zip /var/www/html
解压缩源码:
tar -xvf web.tar -c /var/www/html
unzip web.zip -d /var/www/html
备份源码:
mv web.tar /tmp
mv web.zip /home/xxx
上传和下载源码:
scp username@servername:/path/filename /tmp/local_destination //从服务器下载单个文件到本地
scp /path/local_filename username@servername:/path //从本地上传单个文件到服务器
scp -r username@servername:remote_dir/ /tmp/local_dir //从服务器下载整个目录到本地
scp -r /tmp/local_dir username@servername:remote_dir //从本地上传整个目录到服务器
权限设置
对Web文件设置只读和执行权限(PHP等动态语言需要执行权限)
chmod 0555 /var/www/html/*
chmod 0555 /var/www/html/*.php
Web根目录设置只读和执行权限
chmod 0555 /var/www/html
改变文件的属主和属组来设置严格的权限
chown -R root:root /var/www/html/ //设置拥有人为 root:root 或 httpd:httpd (推荐)
chown -R apache:apache /var/www/html/ //确保 apache 拥有 /var/www/html/
配置 .htaccess
利用 .htaccess
配置文件禁止php文件执行
<Directory "/var/www/html/upload"> //指定目录后续的指令将应用于该目录
Options -ExecCGI -Indexes //禁用了目录中的 CGI 执行和目录索引(显示目录内容列表)功能。
AllowOverride None //不允许在该目录中使用 .htaccess 文件来覆盖服务器的配置。
RemoveHandler .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
RemoveType .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
//这两个指令移除指定文件扩展名的处理器和类型。
//在这种情况下,这些指令从 Apache 的处理列表中移除了与 PHP 相关的扩展名和服务器端包含(SSI)文件类型。
php_flag engine off //这个指令将 PHP 的引擎标志(engine)设置为关闭状态,从而禁用了在该目录中执行 PHP 脚本的能力。
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
deny from all
</FilesMatch> //这三行命令使用正则表达式匹配了以 .php、.phtml、.php3、.pht、.php4、.php5、.php7、.shtml 结尾的文件,并将其访问权限设置为拒绝所有
</Directory>
PHP加固
首先找到PHP的配置文件
/etc/php/{version}/php.ini
禁用高危函数
disable_functions = dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,ini_set,apache_setenv,symlink,link
配置 open_basedir
(将用户访问文件的活动范围限制在指定的区域)
open_basedir=/var/www/html
禁用魔术引号(自动对外部来源数据进行转义,防止SQL注入)
magic_quotes_gpc = Off
关闭PHP伪协议
allow_url_fopen = Off
allow_url_include = Off
重启PHP
sudo service php7.0-fpm restart
sudo systemctl restart php7.0-fpm.service
数据库加固
Mysql加固
为了防范弱口令攻击,Mysql密码默认都是root,phpstudy默认密码123456
- 不使用默认口令,修改成复杂的,并确保和web环境连接
- 设置只允许本地127.0.0.1账户登录:修改
bind-address=127.0.0.1
;在配置文件中加入seccure_file_priv=NULL
- 开启日志审计功能:
general_log_file=
路径
因为最常用的是Mysql数据库,所以基本的攻防大部分都是用MySql数据库的命令
备份指定数据库:
mysqldump –u username –p password databasename > target.sql
备份所有数据库:
mysqldump –all -databases > all.sql
导入数据库:
mysql –u username –p password database < from.sql
对于MySQL的攻防,可以看这篇文章:https://blog.zgsec.cn/archives/26.html
MySQL默认配置文件路径:
C:\\Program Files\MySQL\MySQLServer 5.1\my.ini //Windows
/etc/my.cnf //Linux
/etc/mysql/my.cnf //Linux
修改 secure_file_priv
参数(日志功能的对应目录)
secure_file_priv=""
重载MySQL配置
FLUSH PRIVILEGES
重启MySQL服务
sudo service mysql restart
sudo systemctl restart mysql
Mssql加固
- 删除不必要的账号
- SQLServer用户口令安全
- 根据用户分配帐号避免帐号共享
- 分配数据库用户所需的最小权限
- 网络访问限制
- SQLServer登录审计
- SQLServer安全事件审计
- 配置日志功能
远程控制加固
SSH 加固
限制IP登录方法
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
AllowUsers username@192.168.0.100 //找到并编辑以下行,确保其取消注释并设置为所需的IP地址
禁用 root
远程登录
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
PermitRootLogin no //将PermitRootLogi设置为“no”
按用户和组限制SSH登录
sudo nano /etc/ssh/sshd_config //以root权限编辑SSH配置文件
AllowUsers testuser //设置只允许 testuser 登录SSH
AllowUsers testuser@192.168.1.100 //设置只允许 192.168.1.100 的机器用 testuser 账户登录SSH
AllowGroups test //设置用户组白名单
//需要注意的是:如果同时指定了 AllowUsers 与 AllowGroups 那么必须要在两个选项中都匹配到的用户才能进行SSH登录
重启SSH服务
sudo service sshd restart
sudo systemctl restart sshd.service
RDP远程登录安全加固
删除默认帐户并手动添加新用户:
- 步骤1:按
Win + R
打开运行对话框,输入secpol.msc
并单击 “确定” - 步骤2:导航至此处:本地策略-->用户权限分配,再双击打开 “允许通过远程桌面服务登录”
- 步骤3:删除此窗口中列出的管理员和远程桌面用户(或计算机上的任何其他用户或组)
- 步骤4:之后单击 “添加用户或组” 并手动添加您要授予远程桌面访问权限的用户
更改默认RDP端口号:
- 步骤1:打开运行对话框,输入
regedit
并单击 “确定” - 步骤2:打开
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
,向下滚动并找到PortNumber
然后双击它 - 步骤3:选择 “十进制”,修改为您想要设置的端口号,然后单击 “确定”
防御
SQL注入
防止注入
for ($i=0; $i < strlen($path); $i++) {
$jchr = ord($path[$i]);
if($jchr>=48 && $jchr<=57) continue;
if($jchr>=65 && $jchr<=90) continue;
if($jchr>=97 && $jchr<=122) continue;
if($jchr==ord('.') || $jchr==ord('_') || $jchr==ord('-') || $jchr==ord('/')) continue;
die("flag{czy_Have_n0_gir1_fr1end}");
}
PHP addslashes() 函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(')
- 双引号(")
- 反斜杠(\)
- NULL
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
命令执行
伪装shell:
<?php
if(!empty($_REQUEST['shell']))
{
$code = $_REQUEST['shell'];
if(strchr($code,"whoami")) die("www-data");
if(strchr($code,"cat /f")) die("flag{czys_gir1_fr1end}");
if(strchr($code,"cat /etc/passwd")) die("root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nczy:x:1000:33::/home/czy:/bin/bash");
if(strchr($code,"ls /")) die("bin boot dev etc flag home lib lib64 media mnt opt proc root run sbin srv supervisord.log supervisord.pid sys tmp usr var");
if(strchr($code,"ls")) die("common include index.php lib log.php org public shell.php template_c templates upload waf.so watchbird-source.php");
if(strchr($code,"system")) die();
die("hacker!!!");
}
else echo("shell");
?>
文件上传
$this->typelist==array("image/jpeg","image/jpg","image/png","image/gif");
$this->notallow=array("php", "php5", "php3", "php4", "php7", "pht", "phtml", "htaccess","html", "swf", "htm","shtml");
$fileinfo=pathinfo($upfile["name"]);
if(in_array(strtolower($fileinfo["extension"]),$this->notallow)){
exit('error');
}
if(strchr($fileinfo["filename"],20)) exit('error');
if(strchr($fileinfo["filename"],0)) exit('error');
if(strchr($fileinfo["filename"],10)) exit('error');
if(strchr($fileinfo["filename"],13)) exit('error');
应急响应
进程线程
查询进程线程
netstat
ps -aux
netstat -apt
杀掉进程
kill -9 pid //Linux上
taskkill /f /pid pid //Windows上
WebShell
搜索WebShell文件
find /var/www/html -name *.php -mmin -5 # 查看最近5分钟修改文件
find ./ -name '*.php' | xargs wc -l | sort -u # 寻找行数最短文件,一般有可能是一句话木马
grep -r --include=*.php '[^a-z]eval($_POST' /var/www/html # 查包含关键字的php文件
find /var/www/html -type f -name "*.php" | xargs grep "eval(" |more
# 在Linux系统中使用find、grep和xargs命令的组合,用于在指定目录(/var/www/html)下查找所有以.php为扩展名的文件,并搜索这些文件中包含字符串"eval("的行,并使用more命令来分页显示结果以便在输出较长时进行逐页查看
反弹shell
杀弹反弹shell
老规矩查看进程
ps -ef
px -aux
ps -aux | grep www-data
注意 www-data
权限的 /bin/sh
,很有可能是nc
再就是上老一套命令
kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'
不死马
查杀不死马
可以利用命令自动进行查找删除
ps -aux | grep www-data | grep -v grep | awk '{print $2}' | xargs kill -9
然后重启服务
service php-fpm restart