ma4ter

Index | Photo | About | Friends | Archives

在sql注入中利用java整数溢出

前言

在前几天审计的一个java项目中,发现一处sql语句可以直接拼接造成注入,开始想直接union,但是这里的代码写的比较迷,并不可行。
程序的流程大概是先执行sql: select id,xxx from xxx_table where xxx in(P)
然后拿到id之后再调用对象的.get(id)方法去数据库里面查数据 查出来的数据再回显到页面
这个时候其实一般有三种方法能注入

boolean inject

当xxx_table有数据的时候 可以直接在P参数中构造or xxx使得布尔值为true或者false就能控制有无数据的回显,这样就能够注出数据。

TimeBased inject

这里其实不太好搞,代码层面检测了sleep benchmark等等函数,且在实战当中时间盲注受到太多因素影响。

Union inject

当这里构造出sql语句为select id,xxx from xxx_table where xxx in(1) union select 1,(select user from admin)--+-)的时候
虽然第一步注入成功 但是代码拿到id之后再次调用get(id)方法去数据库里面查,查不到任何数据,这个时候页面和正常访问没任何区别,没有数据回显。(当然是在xxx_table没有任何数据的时候,事实上实际环境中这个表里面确实没什么数据。)

我想到了一种新的姿势,当然可能是别人早就玩过时的了。
select id,xxx from xxx_table where xxx in(1) union select '2147483647'+((SELECT SUBSTR(user,1,1) from admin WHERE id=1)='X'),'a'--+-)
当后面布尔值为true或者false的时候会进行隐式转换
当id为2147483648的时候超过了java integer类型的最大值 导致代码查出id赋值给javabean的id的时候报错
在sql注入中利用java整数溢出
这个时候就获得了一个另类的布尔盲注
Over.