遇到的注入三例
The following article is from only security Author f0ng
公众号现在只对常读和星标的公众号才展示大图推送,
建议大家把听风安全设为星标,否则可能就看不到啦!
----------------------------------------------------------------------
最近没有更新,因为有点忙,加上有些东西需要花费时间去整理、总结,也有部分是因为人的惰性吧。
最近跟朋友讨论了很多注入点的一些情况,对注入又有了一个更深层次的了解。简单说一下三个注入,后面还有案例再分享。
0x01 Oracle注入——多参数下的注入 0x02 MSSQL注入——exec中的注入,常用关键字无法使用 0x03 类似MSSQL注入——非SQL注入,实为DataView注入(.net datatables注入)
0x01 Oracle注入——多参数下的注入
0x001 背景
S神发来一个注入,一起思考
加单引号报错
两个单引号,正常
三个单引号,报错,经典!
0x002 初试
一开始以为这个注入很简单,直接and或者or不就行了吗?1'and'1'='
或者`1'or’1'='1
1'and'1'='
1'or’1'='1
这里可能是因为id=1没数据导致的,id=2的时候有数据,但是也不行
后面也是尝试了很多payload,都不行,闭合不了语句,也无法判断逻辑
0x003 峰回路转
后续和S神探讨的时候,我询问到有没有其他的参数之类的,他说刚好有其他参数,因为该接口来源于JS文件,直接访问接口如图:
还有个mobile参数!
这样来说,可能这里是采用的or逻辑判断(id为2的时候可以出数据),但是由于id处无法闭合,所以我们可以尝试mobile参数处:
直接可以成功!
猜测这里语句为select * from test_table where userid = '{可控}' or mobile = '{可控}'
,但是这里userid后面肯定有其他的干扰语句,导致userid无法正常注入
以为直接到此为止了,使用substr函数就可以去注出数据了,但是发现服务器不允许传入substr
后续S神使用了其他函数instr
来进行注入
这里过滤了空格,所以替换成了%0a
然后再用intruder的模块进行依次爆破,就可以得到完整用户名了
0x004 洞外话
一开始是想用时间盲注的,发现 DBMS_PIPE.RECEIVE_MESSAGE
函数不能用,查了下资料,可能和数据库用户的权限有关,所以用了其他的函数,类比mysql笛卡尔积的高耗时操作
可以得到用户名的长度为6
后面又想尝试oracle的外带,但是没成功,感觉可能还是权限问题,附上外带的函数
DBMS_LDAP.INIT
UTL_INADDR.GET_HOST_ADDRESS
UTL_HTTP.request
UTL_TCP.request
UTL_SMPTP.request
UTL_URL.request
HTTPURITYPE.request
0x02 MSSQL注入——exec中的注入,常用关键字无法使用
0x001 背景
原始请求如下
一开始想用and或者or来判断,但是发现报错了
想用逻辑运算符,发现也报错了
0x002 成功注入
直接掏出之前的某SRC一个案例的payload,可以证明存在延时注入,payload如下
if(substring(db_name(),1,1)='j')waitfor delay'0:0:3'
0x003 洞外话
后面查了下资料,发现可能是exec下的注入
因为页面有报错的信息,所以我想使用报错注入进行证明
and不行,所以没用and
后续使用if也没成功,查阅资料发现[见0x04 参考 【1】]
所以这些关键字、函数:and、convert、group之类的都不行
但是众所周知,MSSQL对运算符比较敏感,所以报错还是可以的,payload如下:
proc_PortalAdmin_GetRoleContent 1, 104, 13 if(1=0/user)waitfor delay'0:0:1'
用户如下
数据库如下
0x03 类似MSSQL注入——非SQL注入,实为DataView注入(.net datatables注入)
0x001 背景
碰到一个.net的注入,,确实是注入,详细如下:因为是搜索框的注入,所以后面用and'1'like'
进行闭合
payload
1'and len(substring('1',1,1)>0)>0 and '1'like'
布尔判断 True
False
0x002 受阻
有了布尔,注入出数据还会远吗?
巧了,还真就不行
识别不了user函数、@@version等等这些MSSQL的变量
但是能访问字段名(表里有个字段为tin)
而后问了董神,发现并非是数据库注入,而是dataview的注入(.net datatables注入)
0x003 洞外话
不是所有的单双数的单引号都能确保注入的存在,比如.net的dataview,具有SQL的特性,比如substring、and、like等等,但是不支持数据库的一些环境变量如@@version、user等等 可以理解成是dataview注入(.Net DataTables注入),非SQL注入[见0x04 参考 【2】]
只能在内存中操作数据 而且表和表都是独立的,超简易版内存结构化存储库,影响面只是当前这个表,危害较小
0x04 总结
一个参数不行的时候,可以尝试其他参数;这里userid不行,可能后续有其他sql语句干扰了语句的执行,但是mobile参数又可以正常注入 接口还是要去试试各种各样的请求的,这里报出来缺少的参数,后面问了S神,才知道这个注入是经典的未授权到注入 有些时候注入的payload要收集起来,没准下次就能用上 并不是通过布尔就可以判断注入,以前知识面限制了我的认知,至少现在看来,.net下还是存在即使可以通过布尔判断页面,但是不一定是sql注入的情况
0x05 参考
https://stackoverflow.com/questions/63360697/incorrect-syntax-near-the-keyword-convert-in-stored-procedure-exec https://docs.microsoft.com/zh-cn/dotnet/api/system.data.dataview?view=net-6.0