代码审计中XSS挖掘一些体会

2024-06-19 07:12
文章标签 代码 审计 xss 体会 挖掘

本文主要是介绍代码审计中XSS挖掘一些体会,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x01 XSS的挖掘思路

1.1 反射型

直接搜索 echo print_r print之类的函数即可
也可以寻找$_GET变量来判断是否存在输出(不过对于代码审计来说除非实在挖不出漏洞,否则没必要关注反射xss)

1.2 dom型

和反射型差不多
需要看网站的前端javascript(一般安装好网页直接查看源代码即可,和反射xss一样代码审计没必要太过于关注)。但是也和反射型有区别,domxss是不经过服务器处理的,也就是不需要经过后端代码,需要审计javascript。

1.3 存储型xss

对于代码审计,存储型xss才是需要关注的重点。

存储型xss一般是存在有数据库交互的地方,因为需要把数据写入进去数据库中才能长期储存数据。

所以我们在审计存储型xss的时候会关注数据库交互的地方。

这里举例两种思路:

思路一 : 从数据库类文件中开始审计

什么是数据库类文件呢?
其实在实际开发项目过程中,通常程序员都会把数据库操作封装成一个类来提供操作。

比如说我们需要设计一个留言板,留言板最基本得有这几个功能吧。比如说发表留言,查看留言,回复留言,删除留言,修改留言等等功能。

而这些是不是需要使用数据库来实现这类功能(下面用代码配合伪代码示意,注意代码可以不用理解功能,但是要能够理解代码为什么要这样写。)

# 比如用户发表一条留言# uname就是用户名也就是"小明",content就是内容也就是"你好"insert into text(id, uname, content) value(1, '小明', '你好');
# 然后用户发现你好不太恰当,想删掉替换成您好
delete from text where id = 1;
# id就是数据库用于区分不同数据的字段, delete from 表示删除表里面的内容
text表示需要删除的表
# 表示删除id=1的数据
where id = 1# 那么php中的代码是这样看小明的:
$sql = "insert into text(id, uname, content) value(1, '小明',
'你好')";
// $conn就是我们数据库的链接
mysqli_query($conn, $sql);
$sql = "delete from text where id = 1";
mysqli_query($conn, $sql);
// 小明换成了您好
$sql = "insert into text(id, uname, content) value(2, '小明',
'您好')";
mysqli_query($conn, $sql);
$sql = "delete from text where id = 2";
mysqli_query($conn, $sql);# 这样的代码是不是特别麻烦 把他简化一下(把sql查询做成一个函数)
function sql_insert($name, $content){
$sql = "insert into text(id, uname, content) value(1, '{$name}',
'{$content}',哈哈哈哈')";
mysqli_query($conn,$sql);
}function sql_delete($id){
$sql = "delete from text where id = '{$id}'";
mysqli_query($conn,$sql);
}// 好的封装完成了 这时候小明发送你好
sql_insert('小明', "你好");
sql_delete(1); // 想删除
// 发送您好
sql_insert('小明', "您好");
sql_delete(2); // 又删除# 这样是不是无论小明发多少条留言都能够很轻松的删除插入
# 好了 这就是封装成的作用(把重复的操作放在一起)
#
这里是写完了,但是还是有一个问题,比如遇到sql注入怎么办。遇到xss怎么办。
# 很简单!只需要修改我们定义的两个操作函数即可
function sql_insert($name, $content){
$name = htmlspecialchars(addslashes($name));
$content = htmlspecialchars(addslashes($content)); // 添加了转义
$sql = "insert into text(id, uname, content) value(1, '{$name}',
'{$content}')";
mysqli_query($conn,$sql);
}function sql_delete($id){
$id = intval($id); // 强制转换
$sql = "delete from text where id = '{$id}'";
mysqli_query($conn,$sql);
}#
是不是这样的写法很方便,如果我们不定义一个函数集中操作的话每次拼接sql语句都需要添加htmlspecialchars和addlashes
#
这就是我们为什么要寻找数据库操作文件的意义。(因为程序员很有可能把过滤函数写在sql类中)

好了,进入正题。 关于如何找到sql封装文件,很简单。

搜索关键字即可(new mysqli, mysqli,
pdo)这里拿其他cms来实例(phpems架构比较复杂也就是上课时用的cms)这里我使用yixuncms_v2.0.3

打开文件,全局搜索

第二步 分析文件的功能 查找需要的关键函数

直接跟进query函数 查看是否有过滤

右键定位函数 定位escape_string_array函数

然后跟进审计

思路二: 使用输出函数进行动态输出查看是否过滤

因为源代码在我们服务器上,我们可以使用echo
或者var_dump查看过滤后的结果来判断过滤了什么。

由于我们不知道在程序在哪个页面做了sql查询,所以选择登录功能作为测试点

因为可以知道一点,那就是登陆功能一定是做了sql查询的,除非是前端登陆,而前端登陆本身也就是一个漏洞…

知道了这一点,登陆抓包,登陆账号密码有没有都不要紧。

我这里使用错误的账号密码登陆:

返回了一个操作失败

然后我们根据提示去全局搜索: 操作失败

至于为什么是这三个呢? 因为我们抓到的数据表访问的就是这个路径

进入app.php

然后定位getUserByUserName函数

然后就可以添加代码进行调试了(修改后记得保存 快捷键 ctrl + s)

再次发包进行调试发现已经返回sql语句了

思路在这里完结了。下面是漏洞复现

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

0x02 漏洞的复现

因为上面已经知道了xss和sql在普通参数里面不存在,然后正常注册后登陆发现

那么直接根据注册ip搜索

跟进后再次全局搜索

由于程序开发中默认ip地址是安全的一般很少会进行过滤,所以这里直接猜测ip地址不存在过滤。

然后注册账号进行测试

payload:Client-ip: <svg/οnlοad=alert(1)>

然后放包,发现个人中心已经存储了我们的xss

同理,这里没有经过过滤也是存在注入的。这里就不在演示

0x03 总结

xss加固可以在前端或者后端实体编码 同时也要注意对单双引号的转义。

不要以为获取ip就是安全的,获取ip往往是不安全的。

思路 -》 找过滤函数 -》测试过滤是否有遗漏 -》 测试可能没有经过过滤的参数

有些网站会把在属性内的参数使用反斜杠编码.比如你输入 &url="
οnerrοr=alert(1) 双引号会被转义成
/",这时如果网站的编码是gb2312…之类的可以使用宽字节 %df"的方式绕过

这篇关于代码审计中XSS挖掘一些体会的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074349

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La