laravel框架调试OrderBy防注入方式

0x00 配置过程

1
2
pecl install xdebug
https://janostlund.com/2019-03-22/xdebug-php72-laravel-valet-phpstorm

着重注意2点:

  • php --ini 找到php.ini的位置,复制xdebug的配置到文件。
  • 配置xdebug端口

0x01 OrderBy注入

结论:

  • dir使用了白名单,只允许asc、desc
  • sort转义了反引号(`)为2个

valet start启动,直接打断点:

1
http://backpack-demo.test/sharp/api/list/voucher?dir=desc&filter_status=1%20%23%20&search=&sort=user_idd%5C%60ss

返回数据,看似是SQL注入:

1
{"message":"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_idd\\`ss' in 'order clause' (SQL: select * from `vouchers` where `status` = 1 # order by `user_idd\\``ss` desc limit 10 offset 0)"}

会报错,但是反引号被转义了一层。实际的SQL语句不是真的数据库执行语句。 Illuminate\Database Connection.php的644行,打断点:

1
select * from `vouchers` where `status` = ? order by `user_idd\``ss` desc limit 10 offset 0

0x02 防御原理

排列方式使用了白名单过滤: SQL查询使用PDO进行,在预编译阶段执行OrderBy时,会发现列名不存在而报错。
转义的原理是这个:

1
2
3
4
function wrapValue($value)
{
return $value === '*' ? $value : '`'.str_replace('`', '``', $value).'`';
}

文章作者: angelwhu
文章链接: https://www.angelwhu.com/paper/2019/10/29/laravel-framework-debugging-orderby-antiinjection-mode/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 angelwhu_blog