碰到越来越多的注入,有些sqlmap跑不出来,只能进行手工,而手工也会遇到各种各样的情况,碰到两个比较特殊的注入,这里简单的记录一下。
0x01 mysql注入突破php的pdo(order by字段)
遇到个注入点
传入单引号
得到信息如下,如果是空,是正常请求,如果加单引号,就会报错,根据语句,可能是select*from table order by x desc limit 0,10
0x002 遇见PDO
看到是PDOException,所以后面的代码注释不了,为什么注释不了,下面看代码
0x003 尝试突破
但是,是不是没有办法了,并不是,继续往下看,这里单引号无法进行判断,随便输个数字这里是因为test111这个表字段没有11个,所以会报错select * from(select* from test111)g order by g.1 desc limit 0,
什么情况下这里可以正常输出,当然是g.xx存在的时候select * from(select* from test111)g order by g.id desc limit 0,3
和之前正常的响应包时间截然不同(这里的sleep会根据数据库里的条目进行叠加,所以慎用,否则就会跑崩数据库)
0x004 成功注入
select * from(select* from test111)g order by g.id and if(1=1,sleep(0.1),2) desc limit 0,3
0x02 mysql奇怪的注入(拼接表名后缀、过滤select、where)
0x001 背景
两个参数,A参数是数字,id的值,不存在注入,B参数是表名的后半截,存在sql语句拼接一个cms的注入,两个例子,第一个很简单就出来了,第二个遇到了点困难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的"变形金刚"问题。
由于笔者知识及水平有限,文中错漏之处在所难免,欢迎交流。