CTF学习笔记—Web篇
第一篇 Web
第二篇 Reverse
第三篇 PWN
第四篇 Crypto
第五篇 APK
第六篇 IOT
文章目录
- 一、常用工具的使用
- 1.Burpsuite
- 1.1 Proxy代理模块
- 1.2 Repeater重放模块
- 1.3 Intruder暴力破解模块
- 1.4 Decoder解码模块
- 1.5 Compare比较模块
- 2.Sqlmap
- 2.1 sqlmap的基本参数及其作用
- 2.2 常见的Tamper
- 2.3 宽字节绕过GPC
- 3.Nmap
- 3.1 Nmap的基本命令
- 3.2 Nmap常用的主机发现相关的参数
- 3.3 Nmap常用的扫描参数
- 3.4 Nmap常用的扫描速度相关的参数
- 3.5 Nmap常用的扫描端口相关的参数
- 3.6 Nmap实用命令
- 4.浏览器与插件
- 4.1 Developer Tools
- 4.2 Hasher
- 4.3 Proxy SwitchOmega
- 4.4 EditThisCookie
- 4.5 User-Agent Switcher for Chrome
- 4.6 Wappalyzer
- 4.7 SelectorGadget和Xpath Helper
- 二、SQL注入攻击
- 1.什么是sql注入
- 1.1 SQL注入的成因
- 1.2 SQL注入的分类
- 2.可以联合查询的sql注入
- 3.报错注入
- 3.1 updatexml
- 3.2 floor
- 3.3 exp
- 4.Bool盲注
- 5.时间盲注
- 6.二次注入
- 三、跨站脚本攻击
- 四、服务端请求伪造
- 五、利用特性进行攻击
- 六、代码审计
- 七、条件竞争
- 八、案例解析
一、常用工具的使用
1.Burpsuite
1.1 Proxy代理模块
- 设置代理端口:proxy→options→Proxy Listeners→Add
- bind to port:填写侦听的端口
- 本机使用:bind to address设置为loopback only
- 局域网内的设备使用:all interfaces
- 浏览器:Internet选项→连接→局域网设置→代理服务器(IP+端口号)
- 截获浏览器的数据包:Intercept is on/off
1.2 Repeater重放模块
在需要手工测试HTTP header中的cookie或user-agent等浏览器不可修改的字段是否存在注入点,以及需要发现复杂的post数据包中是否存在ssrf时,一般需要用到repeater模块。
- headers标签:添加HTTP头信息
例如:检查IP地址的题目:添加x-forwarded-for、x-real-ip等http头尝试绕过,可以在raw标签页发现这个新增的http头信息
- hex标签:用于修改http数据包的十六进制编码
例如:文件上传类型的题目:用于截断后缀。或者使用这些编码对WAF进行模糊测试,从而顺利上传webshell
1.3 Intruder暴力破解模块
intruder模块包含sniper、battering ram、pitchfork、cluster bomb四种攻击类型
intruder模块中包含了target、position、payload、options四个标签页,可用于设置不同的功能。
- target标签页:可以设置目标的攻击地址(host)和目标端口(port),可以选择是否使用https
- position标签页:设置攻击的位置和攻击的方法。
- 四种攻击类型:
- 1.sniper型:设置一个payload set,在两个变量的位置逐一替换payload,每次只替换一个位置,替换前面再替换后面
- 2.battering ram型:设置一个payload set,在两个变量的位置同时替换相同的payload
- 3.pitchfork型:设置两个payload set,两个变量的位置和两个payload set是对应关系(撞库)
- 4.cluster bomb型:设置两个payload set,每个位置的payload在payload set中进行排列组合。
- paylosd标签页:payload set可用于设置每个位置使用的payload集合,payload type可用于设置这个payload集合的内容。payload type中常用的选项具体包含以下几种:
- runtime file:用于从文件中加载payload
- numbers:用于设置数字的开始和结束以及步长
- dates:用于设置日期及日期格式
- character blocks:用于设置长度爆破,fuzz超长的post变量,有时可以绕过WAF等
- options标签页:通常需要对request engine中的参数进行设置。
- 线程数量:默认值为1
- 重传次数:默认三次
- 暂停时间
- 数据包发送速度
- 开始时间
为了方便观察,一般会将响应信息按照请求的返回长度或响应状态码进行排序,或者在过滤器中设置匹配字符串或者正则表达式,以便对结果进行筛选和匹配。
1.4 Decoder解码模块
功能:提供编码与解码工具
1.5 Compare比较模块
Compare比较模块:在例如bool盲注的正确和错误回显题目中,有时两次数据包之间的差别很小,可以使用比较模块来发现差异
官方文档地址:https://portswigger.net/burp/help
2.Sqlmap
sqlmap工具的作用:自动检测并利用SQL注入漏洞。
(图片来源网络,侵删)相关的CTF题目类型:注入类型的题目,或者需要进行绕过操作的题目等。可以调用sqlmap的一些Tamper,或则自行编写Tamper来进行绕过。
安装:sqlmap使用python开发,常见的Linux发行版本都自带了python环境,但windows系统需要自行安装python环境。
(图片来源网络,侵删)2.1 sqlmap的基本参数及其作用
参数 作用 -h,–help 显示帮助文档 -u URL,–url=URL 对指定URL进行扫描 -r REQUEST_FILE REQUEST_FILE为包含HTTP请求的数据包文件,可以从burp中导出 –data=DATA 指定post数据 –dbs 查询数据库 –columns 查询字段 –dump 转储字段 -D DB 指定数据库名 -T TBL 指定表名 -C COL 指定字段名 –users 查询数据库用户 privileges 查询用户权限 –threads=NUM 设置线程数 –user-agent=AGENT 自定义 User-Agent –random-agent 随机选择 User-Agent –tamper=TAMPER 指定tamper对payload进行处理,可以指定多个tamper,之间使用逗号分隔 2.2 常见的Tamper
Tamper通常用来绕过一些过滤或者WAF,常见的Tamper及作用:
tamper文件名 作用 greatest.py 用greatest函数替代大于号 equaltolike.py 用like替代等号 charencode.py 用url编码payload randomcase.py 随机大小写 base64encode.py 用base64编码payload space2comment.py 使用注释符替换空格 unmagicquotes.py 宽字节绕过GPC apostrophemask.py 用utf8替代引号 2.3 宽字节绕过GPC
宽字节绕过GPC是一种绕过Web应用程序安全措施的技术手段。**GPC(Get/Post/Cookie)**是一种常见的Web应用程序安全防护机制,它通常用于防止跨站点脚本攻击(XSS)和SQL注入等攻击。GPC基于对用户输入进行过滤和转义,以防止恶意代码的注入。
(图片来源网络,侵删)宽字节绕过GPC是通过利用某些编码和语法的特性来欺骗GPC机制,从而绕过安全防护。在某些编码中,特定字符可以被编码为多个字节,而不是通常的单字节。例如,在UTF-8编码中,某些字符可以使用2到4个字节表示。通过在用户输入中使用这些特殊字符(如%df%27代替单引号),攻击者可以绕过GPC对用户输入的过滤和转义,成功地注入恶意代码。
为了防止宽字节绕过GPC攻击,开发人员可以采取以下措施:
- 输入验证和过滤:对用户输入进行严格验证和过滤,只允许预期的字符和格式。可以使用白名单过滤器或正则表达式来实现此功能。
- 输出转义:在将用户输入作为输出的一部分进行呈现之前,对其进行适当的转义。这可以防止恶意代码在页面上执行。
- 使用安全编码:使用URL编码或HTML编码等安全编码来处理用户输入和输出。这可以确保特殊字符被正确处理和呈现,而不会导致安全漏洞。
- 使用安全框架:使用安全性高的框架和库,它们通常包含针对常见攻击的内置保护机制。这些框架可以自动处理输入验证、过滤和输出转义。
总之,宽字节绕过GPC是一种常见的Web应用程序安全漏洞,但可以通过正确的输入验证、过滤和转义来预防和修复。开发人员应该充分了解和应用这些安全措施,以保护他们的Web应用程序免受攻击。
3.Nmap
Nmap工具的作用:快速扫描大型网络。
扫描内容:发现网络上有哪些主机、提供什么服务(应用程序和版本)、运行在社么操作系统上、这些主机使用了什么类型的报文过滤器或防火墙等
3.1 Nmap的基本命令
nmap [扫描类型] [选项] [目标或目标集合]
以下是nmap常用命令参数的使用方法:
3.2 Nmap常用的主机发现相关的参数
参数 作用 -sP 使用 ping 扫描 -P0 不使用 ping 扫描 -PS 使用 TCP SYN PING 扫描 -PA 使用 TCP SYN ACK 扫描 -PU 使用 UDP Ping扫描 -PE;-PP;-PM 使用 ICMP Ping types 扫描 -PR 使用ARP Ping 扫描 -n 禁止DNS反向解析 -R 反向解析域名 3.3 Nmap常用的扫描参数
选项 作用 -T 时序扫描 -p -F 端口扫描顺序 -sS TCP SYN扫描(默认) -sU UDP扫描 -sN;-sF;-sX 隐蔽扫描 -sA TCP ACK扫描 -sW TCP窗口扫描 -sM TCP maimon扫描 –scanflags 自定义TCP扫描 -sI 空闲扫描 -sO IP扫描 -b FTP Bounce扫描 3.4 Nmap常用的扫描速度相关的参数
选项 作用 -T0;-T1 慢速扫描,躲避IDS与WAF等 -T2 稍慢速扫描 -T3 默认 -T4 快速扫描 -T5 极速扫描 3.5 Nmap常用的扫描端口相关的参数
选项 作用 -F 快速扫描端口(只扫描100个常用) -r 按照端口号从小到大的顺序进行扫描 –top-ports 开放率高的1000个端口的扫描(默认) -p 只扫描特定端口,如:-p 22,100-1024,9999 3.6 Nmap实用命令
一般来说,如果我们输入命令 nmap 192.168.1.1,实际上Nmap使用的是SYN扫描192.168.1.1开放率最高的1000个端口。
实际中,经常使用的扫描命令是:
nmap -sS -sV -p 192.168.1.1
或
nmap -v -T4 -A 192.168.1.1/24
Nmap官方文档地址:https://nmap.org/book/man.html
4.浏览器与插件
CTF比赛中常用的chrome浏览器插件:
4.1 Developer Tools
Developer Tools是chrome浏览器自带的开发者工具,可以对网页的元素、样式、和脚本进行实时编辑、调控和监控。常用功能:
- Elements:查看网页源码经过浏览器渲染后的所有元素,可手动修改元素的属性和样式,并在浏览器中得到实时的反馈。
- Console:记录并显示开发者或浏览器输出的日志和调试信息,并可以作为与JS进行实时交互的命令行shell。
- Source:通常用于下断点调试JS
- Network:记录发起请求后服务器响应的各种资源信息(包括状态码、资源类型、大小、耗时等),可以查看每个请求和响应的元信息。
- Application:记录网站加载的所有资源信息,包括存储数据(local storage、session storage、indexedDB、websql、cookie)、缓存数据、字体、图片、脚本、样式表等。
- Security:从技术层面判断当前网页的安全性,如,是否有可疑代码、证书是否合法、通信链路是否安全等。注意,其并不能判断该网站是否为钓鱼网站或含有欺诈信息。
在CTF比赛中,需要处理JS相关的题目时,可以在Console面板中直接运行JS代码,而在XSS题目中,在Elements面板中可以方便地定位元素的位置等。
4.2 Hasher
快速计算常见的哈希算法、加密算法、编码转换、网络地址转换、时间转换及进制转换等功能。
4.3 Proxy SwitchOmega
可以在多个代理配置文件之间快速切换。
4.4 EditThisCookie
cookie管理器,配合XSS题目使用
4.5 User-Agent Switcher for Chrome
进行User-Agent的切换,在某些限制User-Agent的题目中可能会用到
4.6 Wappalyzer
查看当前站点的服务器型号、版本、服务器端语言等信息。但部分比赛题可能会使用伪造的信息。
4.7 SelectorGadget和Xpath Helper
用来定位、提取和选择指定元素的Xpath,通常配合爬虫使用。
二、SQL注入攻击
1.什么是sql注入
1.1 SQL注入的成因
开发人员在开发过程中,直接将URL中的参数、HTTP Body中的post参数或其他外来的用户输入(如cookies,UserAgent等)与SQL语句进行拼接,造成待执行的SQL语句可控,从而使我们可以执行任意SQL语句。
1.2 SQL注入的分类
- 可回显的注入
- 可以联合查询的注入
- 报错注入
- 通过注入进行DNS请求,从而达到可回显的目的
- 不可回显的注入
- bool盲注
- 时间盲注
- 二次注入
- 通常作为一种业务逻辑较为复杂的题目出现,一般需要自己编写脚本以实现自动化注入。
一般CTF比赛中,出题人都会变相地增加一层WAF(比如,对关键字进行过滤等),然后只留下一个思路的解题路径,这时候我们需要快速找到并绕过这个点,然后得到flag。
2.可以联合查询的sql注入
在可以联合查询的题目中,一般会将数据库查询的数据回显到页面中,例如:
$id = $_GET['id']; $getid = "SELECT ID FROM users WHERE user_id = '$id'";
sql语句中的id变量会将GET获取到的参数直接拼接到SQL语句中,此时传入如下参数:
?id=-1'union+select+1+--+
拼接后的SQL语句就变成了:
SELECT ID FROM users WHERE user_id = '-1'union select 1 -- '
其中服务器在处理用户输入时,已经将加号"+"转义为空格符了。
在题目中出现可以使用联合查询进行回显注入时,一般需要绕过某些特定字符或者是特定单词(比如空格、select、and、or等字符串)。
3.报错注入
这里介绍3种MySQL数据库报错注入的方法,分别是updatexml、floor和exp。
3.1 updatexml
updatexml 是 MySQL 数据库中的一个函数,它用于更新 XML 类型的数据字段中指定路径的值。该函数接受三个参数:要更新的 XML 字段、要更新的 XML 路径以及新的值。具体来说,updatexml 函数的基本语法如下:
UPDATEXML(xml_document, XPath_string, new_value)
- xml_document:XML文档对象的名称,是一个字符串格式。
- XPath_string:Xpath格式的字符串,用于指定需要更新的XML节点的路径。
- new_value:新的值,用于替换查找到的符合条件的XML节点内容,也是一个字符串格式。
updatexml 函数的作用是改变文档中符合条件的节点的值。当 XPath_string 格式出现错误时,MySQL 会爆出 XPath 语法错误(xpath syntax error),这一点常被用于 SQL 注入攻击中,通过构造错误的 XPath 表达式来触发错误,从而获取数据库信息。例如,攻击者可能会尝试以下 SQL 语句来探测数据库名称:
' and updatexml(1,concat(0x7e,database(),0x7e),1)#
在这个例子中,0x7e 表示 ~ 符号,当这个不符合 XPath 语法的字符串被用于 XPath_string 参数时,MySQL 会报错并可能在错误信息中暴露数据库名称。
3.2 floor
floor的报错原理:rand和order by或group by的冲突。
应用方法:
- 爆破数据库版本信息:
- 爆破当前用户:
- 爆破当前使用的数据库:
- 爆破指定表的字段:
3.3 exp
4.Bool盲注
5.时间盲注
6.二次注入
三、跨站脚本攻击
四、服务端请求伪造
五、利用特性进行攻击
六、代码审计
七、条件竞争
八、案例解析
- 通常作为一种业务逻辑较为复杂的题目出现,一般需要自己编写脚本以实现自动化注入。
- 可回显的注入
- headers标签:添加HTTP头信息