You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL注入选择数据表中的第二行数据?

解决SQL注入获取第二行用户数据的问题

首先,咱们先理清两个核心问题:如何通过注入精准获取第二行数据,以及为什么你用ORDER BY的语句会触发rowCount()报错。

一、获取第二行数据的正确注入语句

你的数据表只有两个用户,要跳过第一行直接取第二行,最可靠的方法是利用MySQL的LIMIT偏移量语法:LIMIT 偏移量, 行数。偏移量从0开始计数,所以LIMIT 1,1就表示跳过第1行(索引0),取1行数据——正好是你要的第二个用户。

对应的注入语句应该是:

' OR 1=1 LIMIT 1,1 -- 

注意:--后面必须加一个空格,MySQL才会把它识别为注释符号,这样后面原SQL的AND password = 'xxx'部分才会被正确注释掉,避免语法错误。

如果想通过排序来定位第二个用户,比如假设第二个用户的login字段值比第一个大/小,也可以用:

' OR 1=1 ORDER BY login DESC LIMIT 1 -- 

但这个前提是排序后第一行就是第二个用户,而且必须确保注释符号正确,否则会导致SQL语法错误。

二、为什么会出现rowCount()报错?

你遇到的Fatal error: Uncaught Error: Call to a member function rowCount(),本质是因为注入后的SQL语法错误,导致PDO的query()方法返回了false,而非有效的PDOStatement对象,这时调用rowCount()自然会报错。

常见的语法错误原因:

  1. --后面没有加空格,导致原SQL中剩余的字符没有被注释,破坏了SQL结构;
  2. 注入语句中存在拼写错误(比如ORDER BY写成ORDERBY)。

解决这个报错的额外建议:在你的PHP代码中开启PDO的异常错误模式,这样SQL语法错误会直接抛出PDOException,方便你排查问题,而不是返回false导致后续调用报错。示例代码如下:

try {
    $db = new PDO('mysql:host=你的主机;dbname=你的数据库', '用户名', '密码');
    // 开启异常错误模式
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
    $stmt = $db->query($sql);
    $count = $stmt->rowCount();
    // 后续逻辑...
} catch (PDOException $e) {
    echo "SQL错误: " . $e->getMessage();
}

内容的提问来源于stack exchange,提问作者ngahu daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:43:16