Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

这篇具有很好参考价值的文章主要介绍了Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

预编译

编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作,
预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,关键字不会被拆开,注入语句也就不会被识别为SQL的关键字,从而防止恶意注入语句改变原有SQL语句本身逻辑。

Java_JDBC注入

在使用JDBC进行数据库操作时,有以下几种情况会产生SQL注入问题

  • 使用Statement方法单纯拼接SQL语句
    演示代码
// 采用Statement方法拼接SQL语句,导致注入产生

public String vul1(String id) {
	
    Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动程序
    Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);//建立数据库连接

    Statement stmt = conn.createStatement();//创建Statement对象用来执行sql语句
   
    String sql = "select * from users where id = '" + id + "'"; // 拼接语句产生SQL注入
    ResultSet rs = stmt.executeQuery(sql);//返回SQL语句执行结果
    ...
}

使用拼接方法进行SQL语句查询,预防SQL代码的方式可以采用黑名单过滤等方法

  • PrepareStatement错误使用预编译
    演示代码
// PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。

public String vul2(String id) {
    Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动程序
    Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);//建立数据库连接
    String sql = "select * from users where id = " + id;// 拼接语句产生SQL注入
    PreparedStatement st = conn.prepareStatement(sql);//创建预编译对象接受SQL语句
    ResultSet rs = st.executeQuery();//返回SQL语句执行结果
}

代码中虽然采用了预编译的方式进行SQL执行,但是依然在构造SQL语句时进行了拼接参数,这样无任何意义,依然可以进行拼接SQL注入
正确使用预编译即可防止SQL注入

// 正确的使用PrepareStatement可以有效避免SQL注入,使用?作为占位符,进行参数化查询

public String safe1(String id) {
    String sql = "select * from users where id = ?";
    PreparedStatement st = conn.prepareStatement(sql);
    st.setString(1, id);
    ResultSet rs = st.executeQuery();
}
Statement和PreparedStatement是Java JDBC API中两种常用的执行SQL语句的方式
Statement:
Statement对象用于执行静态SQL语句,即在编译时已经确定了SQL语句的结构。
Statement执行SQL语句时,直接将完整的SQL语句发送给数据库执行。
Statement对象适用于执行不带参数的简单SQL查询或更新操作。
由于Statement对象没有预编译阶段,每次执行SQL语句时都需要将SQL语句编译一次,这可能导致一定的性能开销。
由于没有参数化输入的机制,使用Statement对象时需要谨慎处理输入数据,以防止SQL注入攻击。
PreparedStatement:
PreparedStatement对象用于执行动态SQL语句,即在执行时才确定SQL语句的具体参数值。
PreparedStatement对象在创建时需要提供一个SQL模板,其中的参数使用占位符(例如,“?”)表示。
在执行PreparedStatement时,首先会对SQL语句进行编译和优化,然后只需提供参数值,而不需要重新编译SQL语句。
PreparedStatement适用于频繁执行带有参数的SQL语句,如参数化查询。
由于PreparedStatement具有预编译和参数化输入的特性,可以提高性能和安全性,并且能够防止SQL注入攻击。

Java_MyBatis注入

#{name}和${name}是MyBatis中两种常用的参数传递方式,具有不同的行为和特点
#{name}(参数占位符):
是一种安全的参数传递方式,会自动进行参数值的转义和处理,防止SQL注入攻击
使用#{name}时,MyBatis会将参数值作为预编译的参数,将其安全地插入到SQL语句中。
-----------------------------------------------------------------------------
${name}(文本替换):
${name} 是一种简单的文本替换方式,它会将 ${name} 直接替换为参数值,不进行参数值的转义或处理。
使用${name}时,参数值会被直接拼接到SQL语句中,存在SQL注入的风险。

在使用MyBatis进行SQL操作时,并不是所有SQL语句都可以进行预编译

  • order by注入
    错误代码
// 由于使用#{}会将对象转成字符串,形成order by "user" desc造成错误,因此很多研发会采用${}来解决,从而造成SQL注入

@GetMapping("/vul/order")
public List<User> orderBy(String field, String sort) {
    return userMapper.orderBy(field, sort);
}

// xml方式
<select id="orderBy" resultType="com.best.hello.entity.User">
    select * from users order by ${field} ${sort}
</select>

// 注解方式
@Select("select * from users order by ${field} desc")
List<User> orderBy2(@Param("field") String field);
  • like模糊查询注入
    错误代码
// 模糊搜索时,直接使用'%#{q}%' 会报错,部分研发图方便直接改成'%${q}%'从而造成注入

@Select("select * from users where user like '%${q}%'")
List<User> search(String q);

安全代码

// 安全代码,采用concat
@Select("select * from users where user like concat('%',#{q},'%')")
List<User> search(String q);

关于MyBatis并不是所有语句都可以采用#{name}的方式,其实就是如果需要用数据库表的字段来替换的话就不能用参数绑定
更多MyBatis防止SQL注入参考

在进行代码审计时,由于MyBatisSQL错误语法的明显特征,可使用全局搜索特征关键字%${、${来查看是否存在注入,从而进一步分析。

XXE注入

在Java中的XXE注入与PHP中的XXE注入原理没有任何区别,只是在Java中所实现XML数据解析所用的方法不同,以下是在Java中常用于处理XML数据的相关接口、类、工具等
XMLReader
SAXReader
DocumentBuilder
XMLStreamReader
SAXBuilder
SAXParser
SAXSource
TransformerFactory
SAXTransformerFactory
SchemaFactory
Unmarshaller
XPathExpression
相应的防护措施为禁用外部实体或者使用黑名单过滤,所使用处理XML数据的相关接口等不同,禁用外部实体的语句也不同。

SSTI模板注入

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。

当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。

漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。
php常见的模板:twig,smarty,blade
python常见的模板有:Jinja2,tornado
java常见的引擎:FreeMarker, velocity
具体参考SSTI(模板注入)漏洞(入门篇)

SPEL表达式注入

说白了就是RCE命令执行
详情参考JAVA表达式注入漏洞

以上内容仅作学习记录,如有错误或瑕疵,欢迎批评指正,感谢阅读。文章来源地址https://www.toymoban.com/news/detail-704911.html

到了这里,关于Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过(ctfshow web入门370)

    由于request被过滤,我们就不能再使用传参的方式进行传递命令以及被过滤的,下划线中括号花括号都被过滤,这样的话我们就只能使用{%%}来进行设置变量以及拼接方法的方式来进行利用SSTI漏洞。 但是ctfshow web入门370关相对于ctfshow web入门369关多过滤数字,就是我们不

    2024年02月04日
    浏览(37)
  • BugKu:Simple_SSTI(SSTI模板注入)

    目录 1.Simple_SSTI_1 2.Simple_SSTI_2 点击链接进入,题目说: You need pass in a parameter named flag。(你需要传入一个名为flag的参数)然后我们可以直接f12查看,也可以右击页面---“检查” 如图所示,我们会得到相关的提示,根据提示信息,我们利用flask的模板注入,就能直接得到flag。

    2023年04月08日
    浏览(33)
  • Thymeleaf SSTI模板注入分析

    先搭建一个SpringMVC项目,参考这篇文章,或者参考我以前的spring内存马分析那篇文章 https://blog.csdn.net/weixin_65287123/article/details/136648903 简单写个servlet 这样就是访问到index.jsp 路由解析流程主要就是 Model 和 View 以及最后 Render 。return处打个断点,看怎么处理的 先进入 invokeAndHa

    2024年04月12日
    浏览(31)
  • SSTI服务器模板注入漏洞

    与任何漏洞一样,利用漏洞的第一步就是能够找到它 介绍 该靶场重点在于利用 Node.js 中的模板引擎 Handlebars 中识别的服务器端模板注入漏洞。本演练将演示当开发人员未正确清理用户输入时,如何在 Web 服务器中利用 SSTI。我们还将介绍 Node.js、模板引擎和全局变量的基础知

    2024年02月07日
    浏览(42)
  • flask模板注入(ssti),一篇就够了

    1.什么是flask?   flask是用python编写的一个轻量web开发框架 2.ssti成因 flask使用jinjia2渲染引擎进行网页渲染,当处理不得当,未进行语句过滤,用户输入{{控制语句}},会导致渲染出恶意代码,形成注入 本地演示(需要自行安装flask,requests模块) 通过输入参数key可以进行简单的渲

    2024年02月07日
    浏览(71)
  • 29、WEB攻防——通用漏洞&SQL注入&增删改查&盲注&延迟&布尔&报错

    概念:在注入过程中,获取的数据不能回显至前端页面,此时我们需要利用一些方法进行判断或尝试,这个过程被称为盲注。 解决:常规的联合查询注入不行的情况。 分类: 基于布尔的SQL盲注,逻辑判断。 /blog/news.php?id=1 and if(1=1,sleep(5),0) 基于时间的SQL盲注,延时判断。

    2024年01月20日
    浏览(54)
  • 小迪安全25WEB 攻防-通用漏洞&SQL 读写注入&MYSQL&MSSQL&PostgreSQL

       #知识点:  1、SQL 注入-MYSQL 数据库  2、SQL 注入-MSSQL(SQL server) 数据库  3、SQL 注入-PostgreSQL 数据库  #详细点:  Access 无高权限注入点-只能猜解,还是暴力猜解           因为access的数据库是独立存在的,不存在统一管理 对账号密码进行猜解,此时只是获取到后台的操

    2024年02月20日
    浏览(59)
  • 28、web攻防——通用漏洞&SQL注入&HTTP头XFF&COOKIE&POST请求

    $_GET :接收get请求,传输少量数据,URL是有长度限制的; $_POST :接收post请求; $_COOKIE :接收cookie,用于身份验证; $_REQUEST :收集通过 GET 、POST和COOKIE 方法发送的表单数据; $_SERVER :接收数据包中的一些内容,如浏览器信息、当前访问url地址等; 网站功能点: 后台要记录

    2024年01月19日
    浏览(57)
  • 用友 GRP-U8 Proxy XXE-SQL注入漏洞

    本篇文章仅限技术学习与安全研究,切勿将文中所涉及的攻击手段用于非授权下渗透行为,造成任何后果与本文和作者无关。 用友GRP-U8R10行政事业财务管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府

    2023年04月08日
    浏览(38)
  • Java代码审计-XMI注入(XXE)

    1.1.1 什么是XML XML 指可扩展标记语言(EXtensible Markup Language)。 XML 是一种很像HTML的标记语言。 XML 的设计宗旨是传输数据,而不是显示数据。 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准。 1.1.2 XML注入漏洞原理 使用不可信

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包