注入测试两则

admin 2022年3月17日03:04:35评论33 views字数 2299阅读7分39秒阅读模式
碰到越来越多的注入,有些sqlmap跑不出来,只能进行手工,而手工也会遇到各种各样的情况,碰到两个比较特殊的注入,这里简单的记录一下。

0x01 mysql注入突破php的pdo(order by字段)


0x001 背景

遇到个注入点

注入测试两则

传入单引号

注入测试两则

出现报错

注入测试两则

得到信息如下,如果是空,是正常请求,如果加单引号,就会报错,根据语句,可能是
select*from table order by x desc limit 0,10

0x002 遇见PDO

看到是PDOException,所以后面的代码注释不了,为什么注释不了,下面看代码
传入'%23或者'--+

注入测试两则


注入测试两则

后面的语句没有被注释,这就是pdo的问题

0x003 尝试突破

但是,是不是没有办法了,并不是,继续往下看,这里单引号无法进行判断,随便输个数字
这里参数传入1,报错如下

注入测试两则

这个报错感觉很熟悉
进入Mysql

注入测试两则

这里是因为test111这个表字段没有11个,所以会报错
但是因为这里格式为g.xx,想到了别名
猜测语句可能如下
select * from(selectfrom test111)g order by g.1 desc limit 0,

注入测试两则

什么情况下这里可以正常输出,当然是g.xx存在的时候
传入g.id
select * from(selectfrom test111)g order by g.id  desc limit 0,3

注入测试两则

来到真实环境,这里也盲猜id

注入测试两则

成了!

和之前正常的响应包时间截然不同(这里的sleep会根据数据库里的条目进行叠加,所以慎用,否则就会跑崩数据库)

0x004 成功注入

接下来就是去注出数据
直接给语句
select * from(select* from test111)g order by g.id and if(1=1,sleep(0.1),2) desc limit 0,3
表里总共9条数据

注入测试两则

真实环境

注入测试两则


0x02 mysql奇怪的注入(拼接表名后缀、过滤select、where)


0x001 背景

两个参数,A参数是数字,id的值,不存在注入,B参数是表名的后半,存在sql语句拼接
一个cms的注入,两个例子,第一个很简单就出来了,第二个遇到了点困难

0x002 第一个例子的注入
抛出第一个无过滤的注入点,直接给payload
product+join+(select+updatexml(1,concat(0x23,user()),1))b+where+id='1'--+

表名为test_product,所以有product这个值

注入测试两则


0x003 常规思路对抗第二个例子注入

使用刚刚第一个例子成功过的payload在第二个注入点进行尝试

注入测试两则

有过滤,select、where过滤掉了

语句猜测为

select * from test_[可控]  where id = 'x'

使用正常的报错语句也不行

AND UPDATEXML(1,CONCAT('~',(SELECT DATABASE()),'~'),3)

本地试了,必须前面接where id = 'x'字段,这里不满足


0x004 误打误撞出数据

后续在尝试的时候,出了用户名与数据库

出库名,可以随意输入一个不存在的表名,库名就出来了,原因在于这里是拼接在表名的,所以会查询表名,当表名不存在,就会报数据库的错误,库名就出来了,cxxxxxxx为库名

注入测试两则

也有另外的办法,如之前的文章《sql注入杂谈》中提到过的

使用数据库中含有的字段进行报错数据库名、表名

注入测试两则

出用户名

注入测试两则

这里是误打误撞弄出来的,id这个表实际不存在的,报的是没有权限的错

尝试了很久,过滤的绕过,注释符,双写等等,都不行


0x005 继续深入

进入正题,误打误撞不是我们的目的,在思考,如果想要直接去注入出数据,有没有办法

可能有人会说注释后面where条件外加自己的where不就行了,两个原因直接限制了

1.where会被过滤

2.sql语句会出现update


注入测试两则

这种情况没有遇到过,初步判断是"变形金刚",就是俺也不知道这咋回事


后续自己尝试了很久,也是对sql语句的不熟悉导致的

最后请教了董神,董神nb!

对于select语句因为加注释符变成update,解释是

注入测试两则

给出的payload:

news join information_schema.tables on id=if(ascii(substr(user(),1,1))-114,0,exp(710)) -- #

news是表名后缀

使用布尔进行注入,实际情况下exp(710)改成updatexml()、extractvalue()也是可以进行报错注入的

这里最重要的一个知识点就是join on中的on

注入测试两则

利用这一点,就可以进行注入

本地尝试

user()的第一位为r,ascii码为114

注入测试两则


注入测试两则

这里information_schema.tables也可以更换为mysql.user,mysql默认存在的都可以,但是前提是用户有查询权限


后面问了红哥,红哥给出的payload也和这个一样,红哥也nb!

唯一不同的是没有注释符,本地尝试也是可以的:

true

注入测试两则

false

注入测试两则

0x03 总结:

1.对于注入,如果能猜解出原来的语句,在本地进行执行,会对成功注入有很大的帮助。

2.注入可控不仅仅局限于查询的条件字段,也出现在任何有可能拼接的地方,比如这里的表名字段。

3.当常规思路无法满足需要的时候,需要去了解一些小众函数与技巧,比如这里的join on,且on和where可以互相替换,就完美避开了where的过滤。

4.站在开发者的角度去思考问题,问题有时会很容易想通,比如这里的select、update的"变形金刚"问题。


由于笔者知识及水平有限,文中错漏之处在所难免,欢迎交流。

原文始发于微信公众号(only security):注入测试两则

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月17日03:04:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   注入测试两则https://cn-sec.com/archives/827585.html

发表评论

匿名网友 填写信息