文章地址:https://www.freebuf.com/articles/web/338744.html

结论

把 order_by=undefined 的参数值改为 order_by=asc 或者 order_by=desc,再在其他参数处注入。

payload:

1
2
3
IF(substr(database (),1,1)='i',1,(select+1+union+select+2))

因为此处是order by注入,这句payload翻译过来就是:如果数据库名字的第一个字母是i,就执行1,如果不是i,就执行select 1 union select 2,又因为这个语句返回的是两行数据,在语法规范上是错误的,导致整条语句都不执行,所以报错。这样就可根据返回码来区分,并进行快速爆破来判断出数据库名,类似于布尔盲注。

原因

参数化会将参数值加上引号,但是order by字段不能带引号,所以很多排序功能常存在注入问题,如mybatis中预编译使用 #{} 而order by 字段使用参数化后有问题,所以开发者可能直接就使用 ${ }从而存在注入问题。